1)实验平台:正点原子stm32f103战舰开发板V4
2)平台购买地址:https://detail.tmall.com/item.htm?id=609294757420
3)全套实验源码+手册+视频下载地址: http://www.openedv.com/thread-340252-1-1.html##
第五十六章 DSP BasicMath实验
本章介绍使用DSP库进行基本的数学运算。通过本章的学习,读者将学习到如何使用DSP库进行数学运算。
本章分为如下几个小节:
56.1 硬件设计
56.2 程序设计
56.3 下载验证
56.1 硬件设计
56.1.1 例程功能
- 上分别显示不使用DSP库和使用DSP库的计算正弦余弦的耗时
- LED0闪烁,指示程序正在运行
56.1.2 硬件资源 - LED
- LED0 - PF9
- 正点原子 2.8/3.5/4.3/7/10寸TFTLCD模块(仅限MCU屏,16位8080并口驱动)
- FPU(可选,使用后相关的计算耗时更少)
- 基本定时器6
56.1.3 原理图
本章实验使用的DSP库为软件库,因此没有对应的连接原理图。
56.2 程序设计
56.2.1 DPS库的使用
本章实验使用APM32F4xx_SDK中提供的DSP库,将其添加到工程文件夹后,如下图所示:
图56.2.1.1 DSP库
DSP中就提供了大量用于数学运算的函数,例如:正弦、余弦的计算等。使用DSP库能加快各种算法的实现,并且DSP中的函数是专门为DSP指令集做了相应的优化的,因此能以极高的效率在开启FPU且具有DSP指令集的MCU执行。
DSP库的使用方法也很简单,仅需将需要使用的DSP库源文件添加到工程中,就能调用DSP库中的函数了,具体请见本章实验的配套实验例程。
56.2.2 实验应用代码
本章实验的应用代码,如下所示:
int main(void)
{/* 必要初始化,代码省略 */while (1){/* 不使用DSP库 */TMR_ConfigCounter(BTMR_TMRX_INT, 0);g_timeout = 0;res = sin_cos_test(PI / 6, 200000, 0);time = TMR_ReadCounter(BTMR_TMRX_INT) + g_timeout * 0x10000;/* 显示计算耗时,代码省略 *//* 使用DSP库 */TMR_ConfigCounter(BTMR_TMRX_INT, 0);g_timeout = 0;res = sin_cos_test(PI / 6, 200000, 1);time = TMR_ReadCounter(BTMR_TMRX_INT) + g_timeout * 0x10000;/* 显示计算耗时,代码省略 */}
}
从上面的代码中可以看出,分别调用了两次函数sin_cos_test()在使用DSP库和不使用DSP的情况下分别进行200000次进行正弦和余弦的计算测试,并使用定时器统计两者的计算耗时,最终在LCD上显示两个的计算耗时情况。
函数sin_cos_test()如下所示:
#define DELTA 0.0001f /* 误差值 *//*** @brief 正弦余弦测试* @param angle: 起始角度* @param times: 运算次数* @param mode : 是否使用DSP库* @arg0: 不使用* @arg1: 使用* @retval 无*/
uint8_t sin_cos_test(float angle, uint32_t times, uint8_t mode)
{float sinx;float cosx;float result;uint32_t i;if (mode == 0) /* 不使用DSP库 */{for (i=0; i<times; i++){cosx = cosf(angle); /* 不使用DSP库的sin、cos函数 */sinx = sinf(angle);result = sinx * sinx + cosx * cosx; /* sin^2 + con^2 = 1 */result = fabsf(result - 1.0f); /* 对比与1的差值 */if (result > DELTA) /* 结果有误 */{return 0xFF;}angle += 0.001f; /* 角度自增 */}}else /* 使用DSP库 */{for (i=0; i<times; i++){cosx = arm_cos_f32(angle); /* 使用DSP库的sin、cos函数 */sinx = arm_sin_f32(angle);result = sinx * sinx + cosx * cosx; /* sin^2 + con^2 = 1 */result = fabsf(result - 1.0f); /* 对比与1的差值 */if (result > DELTA) /* 结果有误 */{return 0xFF;}angle += 0.001f; /* 角度自增 */}}return 0;
}
从上面的代码中可以看出,使用DSP库计算正弦、余弦时,使用了DPS库中的函数arm_cos_f32()和函数arm_sin_f32(),不使用DSP库正弦、余弦时,使用了C标准库中的函数consf()和函数sinf()。
56.3 下载验证
在完成编译和烧录操作后,可以看到LCD上分别显示了不使用DSP库和使用DSP库的运算耗时时间,从两者的耗时时间中,能看出使用DSP库进行数学运算有明显的速度优势。