OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 565|回复: 0

《M144Z-M3最小系统板使用指南——STM32F103版》第五十章 DSP BasicMath实验

[复制链接]

1117

主题

1128

帖子

2

精华

超级版主

Rank: 8Rank: 8

积分
4667
金钱
4667
注册时间
2019-5-8
在线时间
1224 小时
发表于 2024-5-22 18:17:30 | 显示全部楼层 |阅读模式
本帖最后由 正点原子运营 于 2024-5-21 16:15 编辑

第五十章 DSP BasicMath实验
1)实验平台:正点原子 M144Z-M3 STM32F103最小系统板

2) 章节摘自【正点原子】M144Z-M3最小系统板使用指南——STM32F103版


4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boar ... _mini_sysboard.html

5)正点原子官方B站:https://space.bilibili.com/394620890

6)正点原子STM32技术交流QQ群:725095144

155537c2odj87vz1z9vj6l.jpg

155537nfqovl2gg9faaol9.png

本章介绍使用DSP库进行基本的数学运算。通过本章的学习,读者将学习到如何使用DSP库进行数学运算。
本章分为如下几个小节:
50.1 硬件设计
50.2 程序设计
50.3 下载验证

50.1 硬件设计
50.1.1 例程功能
1. 分别在使用和不使用DSP库的情况下进行正弦余弦计算,并分别在LCD上显示计算耗时
2. LED0闪烁,提示程序正在运行

50.1.2 硬件资源
1. LED
       LED0 - PB5
2. 正点原子 2.8/3.5/4.3/7/10寸TFTLCD模块

50.1.3原理图
本章实验使用的DSP库为软件库,因此没有对应的连接原理图。

50.2 程序设计
50.2.1 DPS库的使用
本章实验使用STM32CubeF1软件包中提供的DSP库,将其添加到工程文件夹后,如下图所示:                           
QQ截图20240521161511.png
图50.2.1.1 DSP库
DSP中就提供了大量用于数学运算的函数,例如:正弦、余弦的计算等。使用DSP库能加快各种算法的实现。
DSP库的使用方法也很简单,仅需将DSP库文件添加到工程中,并包含相应的头文件,就能调用DSP库中的函数了,具体请见本章实验的配套实验例程。

50.2.2 实验应用代码
本章实验的应用代码,如下所示:
  1. int main(void)
  2. {
  3.     float time;
  4.     char buf[50];
  5.    
  6.    HAL_Init();                             /* 初始化HAL库 */
  7.    sys_stm32_clock_init(RCC_PLL_MUL9);     /* 配置时钟,72MHz */
  8.    delay_init(72);                         /* 初始化延时 */
  9.    usart_init(115200);                     /* 初始化串口 */
  10.    led_init();                             /* 初始化LED */
  11.    lcd_init();                             /* 初始化LCD */
  12.    btim_timx_int_init(0xFFFF, 7200 - 1);   /* 初始化基本定时器 */
  13.    
  14.    lcd_show_string(30, 50, 200, 16, 16, "STM32", RED);
  15.    lcd_show_string(30, 70, 200, 16, 16, "DSPBasicMath TEST", RED);
  16.    lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);
  17.    
  18.    lcd_show_string(30, 110, 200, 16, 16, "No DSPruntime:", RED);
  19.    lcd_show_string(30, 130, 200, 16, 16, "Use DSPruntime:", RED);
  20.    
  21.     while (1)
  22.     {
  23.          /* 不使用DSP库 */
  24.          __HAL_TIM_SET_COUNTER(&g_timx_handle, 0);
  25.          g_timeout = 0;
  26.          if (sin_cos_test(PI / 6, 10000, 0) == 0)
  27.          {
  28.              time = __HAL_TIM_GET_COUNTER(&g_timx_handle) +
  29.                      (uint32_t)g_timeout * 0x10000;
  30.              sprintf(buf, "%0.1fms\r\n", time / 10);
  31.              lcd_show_string(150, 110, 200, 16, 16, buf, BLUE);
  32.          }
  33.          else
  34.          {
  35.              lcd_show_string(150, 110, 200, 16, 16, "Error", BLUE);
  36.          }
  37.          
  38.          /* 使用DSP库 */
  39.          __HAL_TIM_SET_COUNTER(&g_timx_handle, 0);
  40.          g_timeout = 0;
  41.          if (sin_cos_test(PI / 6, 10000, 1) == 0)
  42.          {
  43.              time = __HAL_TIM_GET_COUNTER(&g_timx_handle) +
  44.                      (uint32_t)g_timeout * 0x10000;
  45.              sprintf(buf, "%0.1fms\r\n", time / 10);
  46.              lcd_show_string(158, 130, 200, 16, 16, buf, BLUE);
  47.          }
  48.          else
  49.          {
  50.              lcd_show_string(158, 130, 200, 16, 16, "Error", BLUE);
  51.          }
  52.          
  53.          LED0_TOGGLE();
  54.     }
  55. }
复制代码
从上面的代码中可以看出,分别调用了两次函数sin_cos_test()在使用DSP库和不使用DSP的情况下分别进行10000次进行正弦和余弦的计算测试,并使用定时器统计两者的计算耗时,最终在LCD上显示两个的计算耗时情况。
函数sin_cos_test()如下所示:
  1. /* 定义误差值 */
  2. #define DELTA 0.0001f

  3. /**
  4. *@brief   正弦余弦测试
  5. *@param   angle: 起始角度
  6. *@param   times: 运算次数
  7. *@param   mode: 是否使用DSP库
  8. *@arg     0: 不使用DSP库
  9. *@arg     1: 使用DSP库
  10. *@retval  计算结果
  11. *@arg     0: 计算无误
  12. *@arg     1: 计算错误
  13. */
  14. uint8_t sin_cos_test(float angle, uint32_t times, uint8_t mode)
  15. {
  16.     float sinx;
  17.     float cosx;
  18.     float result;
  19.     uint32_t i = 0;
  20.    
  21.     if (mode == 0)
  22.     {
  23.          /* 不使用DSP库计算正弦余弦 */
  24.          for (i=0; i<times; i++)
  25.          {
  26.              cosx = cosf(angle);
  27.              sinx = sinf(angle);
  28.              result = sinx * sinx + cosx * cosx;
  29.              result = fabsf(result - 1.0f);
  30.             
  31.              if (result > DELTA)
  32.              {
  33.                  return 0xFF;
  34.              }
  35.             
  36.              angle += 0.001f;
  37.          }
  38.     }
  39.     else
  40.     {
  41.          /* 使用DSP库计算正弦余弦 */
  42.          for (i=0; i<times; i++)
  43.          {
  44.              cosx = arm_cos_f32(angle);
  45.              sinx = arm_sin_f32(angle);
  46.              result = sinx * sinx + cosx * cosx;
  47.              result = fabsf(result - 1.0f);
  48.             
  49.              if (result > DELTA)
  50.              {
  51.                  return 0xFF;
  52.              }
  53.             
  54.              angle += 0.001f;
  55.          }
  56.     }
  57.    
  58.     return 0;
  59. }
复制代码
从上面的代码中可以看出,使用DSP库计算正弦、余弦时,使用了DPS库中的函数arm_cos_f32()和函数arm_sin_f32(),不使用DSP库正弦、余弦时,使用了C标准库中的函数consf()和函数sinf()。

50.3 下载验证
在完成编译和烧录操作后,可以看到LCD上分别显示了不使用DSP库和使用DSP库的运算耗时时间,从两者的耗时时间中,能看出使用DSP库进行数学运算有明显的速度优势。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 19:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表