【新技能get】开发板一起学起来 (第四部分)
FPU,Float Point Unit 浮点运算单元
从字面就可以理解,FPU就是做浮点运算来帮助CPU减轻负担的。Cortex M4 具有一个可选的FPU,STM32F429 集成了FPU。Cortex-M4的浮点运算单元(FPU)是一个改变的单精度ARMv7-M的浮点架构(FPv4-SP)。
FPU功能描述
支持单精度加、减、乘、除和平方根操作。也支持定点和浮点的转换。
[attach]39800[/attach]
图4-1:FPU寄存器
详细的信息请查看:
ARM® Cortex®-M4 Processor
(Revision: r0p1 Technical Reference Manual Copyright © 2009, 2010, 2013, 20)
CMSIS是ARM 公司独立于供应商对Cortex-M实现的硬件抽象层。
整个的CMSIS框架图如下:
[attach]39801[/attach]
图4-2:CMSIS框架图
CMSIS-DSP:DSP的库文件中,包含了60多个信号处理算法函数和多重的数据类型(q7、q15、q31)以及32位单精度浮点型。该库文件支持Cortex-M0、M3、M4,在Cortex-M4中实现了SIMD(单周期多数据指令)。
CMSIS中的代码和API编写,是附和MISRA-C2004标准的,具体请参考这个帖子(http://bbs.ickey.cn/group-topic-id-51803.html)。
DSP 库文件主要包括以下内容具体内容在这个文件下(STM32F429I-Discovery_FW_V1.0.1LibrariesCMSISDSP_LibSource):
[attach]39802[/attach]
图4-3:CMSIS-DSP
同样官方也给了一些相应的例子(STM32F429I-Discovery_FW_V1.0.1LibrariesCMSISDSP_LibExamples):
[attach]39803[/attach]
图4-4:CMSIS-DSP 例子
我们就来写一个关于FIR滤波器的例子。
将1KHz中混入15KHz的信号,制作一个FIR低通滤波器,去除15KHz的信号,保留1KHz。
FIR(Finite Impulse Response)滤波器:有限长单位冲激响应滤波器,又称为非递归型滤波器,是数字信号处理系统中最基本的元件,它可以在保证任意幅频特性的同时具有严格的线性相频特性,同时其单位抽样响应是有限长的,因而滤波器是稳定的系统。由于FIR滤波器只有零点,除了原点外,在z平面没有极点,所以FIR滤波器总是稳定的。如果他的有现长单位脉冲响应是非因果,可以简单的通过移位得到因果的单位冲激响应,FIR滤波器突出的有点是不存在稳定和可实现的问题。因此,FIR滤波器在通信、图像处理、模式识别等领域都有着广泛的应用。此路径(STM32F429I-Discovery_FW_V1.0.1LibrariesCMSISDSP_LibExamplesarm_fir_example)下有两个文件,一个是使用的数据文件,一个使用的样例程序。
如下:
[attach]39804[/attach]
图4-5:FIR例程程序文件
具体的可以参考这个程序arm_fir_example_f32.c
里面详细的讲了FIR的例子:
这个FIR的系数使用matlab的 fir1(28, 6/24) 函数生成的如下:
const float32_t firCoeffs32[NUM_TAPS] = { -0.0018225230f, -0.0015879294f, +0.0000000000f, +0.0036977508f, +0.0080754303f, +0.0085302217f, -0.0000000000f, -0.0173976984f, -0.0341458607f, -0.0333591565f, +0.0000000000f, +0.0676308395f, +0.1522061835f, +0.2229246956f, +0.2504960933f, +0.2229246956f, +0.1522061835f, +0.0676308395f, +0.0000000000f, -0.0333591565f, -0.0341458607f, -0.0173976984f, -0.0000000000f, +0.0085302217f, +0.0080754303f, +0.0036977508f, +0.0000000000f, -0.0015879294f, -0.0018225230f };
15KHz和1KHz的信号Matlab显示如下图所示:
[attach]39805[/attach]
图4-6:15KHz和1KHz的信号
滤波后效果如下1KHz信号Matlab,如下所示:
[attach]39806[/attach]
图4-7:1KHz的信号
使用这个例子需要用到以下的文件。
包含STM32F429I-Discovery_FW_V1.0.1LibrariesCMSISDSP_LibSourceFilteringFunctions文件夹下的这两个程序文件:arm_fir_init_f32.c arm_fir_f32.c
#define ARM_MATH_CM4 1
#include “arm_math.h”
关于使用Cortex-M4的FPU配置如下所示:
[attach]39807[/attach]
图4-8:FPU配置
上面的选择性编译,选择不同的定义代表使用不同的设备。选择#define ARM_MATH_CM4 1 加入core_cm4.h到系统。
F429效果图如下:
[attach]39808[/attach]
图4-9:15KHz和1KHz的信号
[attach]39809[/attach]
图4-10:1KHz的信号
DAC(Digital Analog Converter)数模转换器
F429的DAC最高为12bit的电压输出模数转换器。可以配置为8或者12bit的模式,可以通过DMA控制器读取。
(具体的参数可以参考数据手册RM900)
DAC的框架图如下:
[attach]39810[/attach]
图4-11:DAC 框架图
官方的例程中给了DAC的样例程序(STM32F429I-Discovery_FW_V1.0.1ProjectsPeripheral_ExamplesDAC_SignalsGenerationEWARM):
通过按键控制PA4和PA5输出三角波、正弦函数等四种波形。
框架函数如下,具体配置,可查看详细的文件。
while (1) { // If the User Button is pressed if (KeyPressed == RESET) { DAC_DeInit(); // select waves forms according to the Key Button status if (SelectedWavesForm == 1) { // The sine wave and the escalator wave has been selected // Escalator Wave generator ------------------------------------------ DAC_Ch1_EscalatorConfig(); // Sine Wave generator ----------------------------------------------- DAC_Ch2_SineWaveConfig(); } else { // The triangle wave and the noise wave has been selected // Noise Wave generator ---------------------------------------------- DAC_Ch1_NoiseConfig(); // Triangle Wave generator ------------------------------------------- DAC_Ch2_TriangleConfig(); } KeyPressed = SET; } } }
通过示波器,效果图如下:
[attach]39811[/attach]
图4-12:三角波
[attach]39812[/attach]
图4-13:正弦波
我们平常所使用的CPU为定点CPU,意思是进行整点数值运算的CPU。当遇到形如1.1+1.1的浮点数运算时,定点CPU就遇到大难题了。对于32位单片机,利用Q化处理能发挥他本身的性能,但是精度和速度仍然不会提高很多。
现在设计出了一个新的CPU,叫做FPU,这个芯片专门处理浮点数的运算,这样处理器就将整点数和浮点数分开来处理,整点数交由定点CPU处理而浮点数交由FPU处理。我们见到过TI的DSP,还有STM32F4系列的带有DSP功能的微控制器。后者如果需要用到FPU的浮点运算功能,必须要进行一些必要的设置。
STM32F429DSP库学习笔记系列汇总
http://bbs.ickey.cn/group-topic-id-48485.html
欢迎光临 烽火社区 (http://bbs.cnecport.com/) | Powered by Discuz! X3.2 |