ARM核单片机安装CMSIS DSP

CMSIS 库介绍

CMSIS:(Cortex Microcontroller Software Interface Standard)翻译成中文就是ARM Cortex 微控制器/处理器软件接口标准。

  • CMSIS-RTOS是一种API,它支持使用中间件和库组件实现一致的软件层

  • CMSIS-DSP库是Arm为各种Cortex-M处理器内核优化的DSP功能的丰富集合

  • CMSIS-Driver接口可用于许多微控制器家族

  • CMSIS-Pack定义了包含软件组件的软件包的结构

  • CMSIS-SVD文件使设备外设的详细视图与当前注册状态

  • CMSIS-DAP是一个到Cortex调试访问端口(DAP)的标准化接口。

  • CMSIS-NN是一组高效的神经网络核的集合

数字信号处理(Digital Signal Processing,简称DSP);

在进行一些数据处理和计算时,常常会使用到一些数学函数,通常使用的是math.h文件中的函数,但有时会涉及到大量数据的计算,这时可以考虑使用ARM官方提供的DSP库,其中包含了许多基础数学函数和其它扩展功能,支持多种ARM内核,计算速度也比math.h中快不少。

官网连接在这里Common Microcontroller Software Interface Standard (CMSIS) – Arm Developer

库包含的功能如下

  • Basic math functions

    基本数学函数

  • Fast math functions

    快速的数学函数

  • Complex math functions

    复杂的数学函数

  • Filtering functions

    过滤功能

  • Matrix functions

    矩阵函数

  • Transform functions

    转换函数

  • Motor control functions

    运动控制功能

  • Statistical functions

    统计功能

  • Support functions

    支持功能

  • Interpolation functions

    插值函数

  • Support Vector Machine functions (SVM)

    支持向量机函数

  • Bayes classifier functions

    贝叶斯分类器函数

  • Distance functions

    距离函数

  • Quaternion functions

    四元数的功能

一般常用的单片机如STM32F1、GD32F1都是ARM Cortex M3内核,没有FPU单元,在STM32F4、GD32F3系类中使用的是ARM Cortex M4内核,其在ARM Cortex M3的基础上强化了运算能力,新加了浮点、DSP、并行计算等。为了更好的发挥ARM的计算能力。

源码连接在这GitHub - ARM-software/CMSIS_5: CMSIS Version 5 Development Repository

注: CMSIS 5.8以上在Git的源码文件里去除了Lib文件,需要自己编译,CMSIS 5.7还有Lib文件,这里下载的是5.7的文件

DSP库安装

将下载的库文件解压,在 CMSIS/DSP/Lib/ARM 中可以看到有许多Lib静态库,其中库文件的命名以内核名称开始,后面的l或b代表小端格式或大端格式,f代表支持浮点运算单元,M4内核只支持单精度浮点单元,而M7内核的支持单精度(Single Precision)或双精度(Double Precision)浮点运算单元,所以还有fsp和fdp之分。

image-20211207140901563

之后找到Include文件夹,这里是使用库文件需要包含的头文件,其中arm_math.h是主要的头文件。

image-20211207143042441

将与芯片对应Lib静态库文件和头文件复制到工程目录下,添加到工程中并为头文件添加路径。这里不添加这些头文件也可以,只要配置好路径就行。

image-20211207143320839

image-20211207143530479

之后添加在工程中添加宏定义ARM_MATH_CM3

image-20211207170011807

之后再主函数中添加头文件,编写FFT测试程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include "gd32f10x.h"
#include "arm_math.h"
#include "arm_const_structs.h"

#define FFT_LENGTH 2048 //FFT长度,默认是2048点FFT
float fft_inputbuf[FFT_LENGTH*2]; //FFT输入数组
float fft_outputbuf[FFT_LENGTH]; //FFT输出数组

/*!
\brief main function
\param[in] none
\param[out] none
\retval none
*/
int main(void)
{
char showbuffer[64];
systick_config();
UsartConfig();

for(int i=0;i<FFT_LENGTH;i++)//生成信号序列
{
// 实部放入时域信号
fft_inputbuf[2*i]=10+4.5*arm_sin_f32(2*PI*i*210/FFT_LENGTH)+\
3.2*arm_sin_f32(2*PI*i*350/FFT_LENGTH);

fft_inputbuf[2*i+1]=0;//虚部全部为0
}
// arm_cfft_sR_f32_len2048,该变量即为"arm_const_structs.h"提供的配置变量,包含头文件后,直接调用即可。
arm_cfft_f32(&arm_cfft_sR_f32_len2048,fft_inputbuf,0,1);
arm_cmplx_mag_f32(fft_inputbuf,fft_outputbuf,FFT_LENGTH); // 把运算结果复数求模得幅值

// 由于原始信号在FFT后被覆盖掉了,这里为了可视化重新生成了一次
for(int i=0;i<FFT_LENGTH/2;i++)//生成信号序列
{
fft_inputbuf[2*i]=10+4.5*arm_sin_f32(2*PI*i*210/FFT_LENGTH)+\
3.2*arm_sin_f32(2*PI*i*350/FFT_LENGTH);

fft_inputbuf[2*i+1]=0;// 虚部全部为0
}

fft_outputbuf[0] = fft_outputbuf[0] / 2;
for(int i=0;i<FFT_LENGTH/2;i++)
{
// 发送到上位机,使用VOFA+进行显示
sprintf(showbuffer,"%f,%f\n",fft_inputbuf[2*i],fft_outputbuf[i]/FFT_LENGTH*2);
USART_SendString(PRINTF_USART, showbuffer);
}

while(1);

}

VOFA+显示如下

image-20211207170615668

可以看到原始的时域信号和频域下的频谱,且幅值和频率关系和生成原始信号时的数据相同,程序工作正常。

其它问题

在使用GD32F1官方固件库进行程序开发时,会遇到找不到cmsis_compiler.h这个头文件,在DSP库中的Core内核文件文件夹,将缺少的文件复制到工程目录下GD32库文件Libraries/CMSIS目录下,但复制后会报很多重定义的错误,都是在core_cm3.h中,估计可能是GD32官方库中的core_cm3.h对一些功能进行了配置,但在DSP中也有相同的配置,发生了重定义.

这里用DSP中的core_cm3.h把GD库中的文件替换掉,再编译就没有错误了。下载烧录功能没什么问题,暂时也不知道这样做有没有别的影响。其它找不到的文件自己复制过去就行。

image-20211207171406563