STM32G431启用FPU与DSP库

1.FPU与DSP

  • STM32的FPU是芯片内部的硬件浮点运算单元,能高速处理所有浮点计算;而DSP库则是建立在FPU等硬件特性之上的软件函数库,它提供了一系列经过极致优化的数字信号处理算法(如FFT、滤波等)。两者关系可概括为:FPU是强大的硬件基础,负责通用浮点加速;DSP库则是专业的软件加速包,针对复杂算法进行特定优化。在实际应用中,应先启用FPU获得基础性能提升,再调用DSP库来处理专门的复杂运算任务。
  • 下面我们通过STM32CUBEMX + cmake + vscode 来创建一个完整地项目

2.工程创建

2.1新建STMG431CBT6的工程

  • 选择外部高速时钟
  • 开启SWD,就是允许我们使用ST-link进行下载调试,时钟来源选择系统时钟
  • 因为我们要用到串口打印相关信息,开启串口2
  • 配置时钟,按照自己的晶振频率设置
  • 配置相关项目相关信息
    项目名称,开发工具,固件版本

    生成源文件和头文件 ,生成项目

2.2用VSCODE打开并编译看是否成功

导入Cmake项目,选择刚生成的文件打开,直接导入即可

点击编译,输出如下信息显示成功

2.3开启FPU并且添加DSP库

  • 回到CUBEMX
  • 找到DSP库,并且勾选上,可能下载会比较慢

    返回,并且勾选上添加DSP库,生成代码

    返回Vscode看到有如下文件则添加成功

    接下来在CMake文件中如下位置添加两行代码
1
2
3
${CMAKE_CURRENT_SOURCE_DIR}/Drivers/CMSIS/DSP/Lib/GCC/libarm_cortexM4lf_math.a
${CMAKE_CURRENT_SOURCE_DIR}/Drivers/CMSIS/DSP/Include


到此,工程创建成功

3.测试工程

为了方便输出信息,我们将串口重定向,在usart.c文件中添加如下代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#ifdef __GNUC__

#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)

#else

#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)

#endif

PUTCHAR_PROTOTYPE

{

  // 阻塞方式打印 -> 串口2

  HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, 0xFFFF);

  return ch;

}
  • ==注意要在gcc-arm-none-eabi.cmake文件如下位置加入-u_printf_float==

测试代码,注意需要包含stdio头文件

该插件的下载按钮如下

==注意,必须加“\n”,不然会有莫名的问题

1
printf("hello\n");

调试信息如下:

成功==