【新技能get】开发板一起学起来 (第四部分)
本教程作者为ICkey网友@HelloWii ,回帖参与讨论、提问、分享,就能赢取超多丰厚奖励哦~
@HelloWii 也将随时和大家交流学习中的问题。(PS:本教程未经允许谢绝转载)
学教程,送奖励,活动说明详见:
【新技能get√】开发板STM32F429I Discovery技术一起学起来
FPU,Float Point Unit 浮点运算单元
从字面就可以理解,FPU就是做浮点运算来帮助CPU减轻负担的。Cortex
M4 具有一个可选的FPU,STM32F429
集成了FPU。Cortex-M4的浮点运算单元(FPU)是一个改变的单精度ARMv7-M的浮点架构(FPv4-SP)。
FPU功能描述
支持单精度加、减、乘、除和平方根操作。也支持定点和浮点的转换。
图4-1:FPU寄存器
详细的信息请查看:
ARM® Cortex®-M4 Processor
(Revision: r0p1 Technical
Reference Manual Copyright © 2009, 2010, 2013, 20)
CMSIS是ARM
公司独立于供应商对Cortex-M实现的硬件抽象层。
整个的CMSIS框架图如下:
图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):
图4-3:CMSIS-DSP
同样官方也给了一些相应的例子(STM32F429I-Discovery_FW_V1.0.1LibrariesCMSISDSP_LibExamples):
图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)下有两个文件,一个是使用的数据文件,一个使用的样例程序。
如下:
图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显示如下图所示:
图4-6:15KHz和1KHz的信号
滤波后效果如下1KHz信号Matlab,如下所示:
图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配置如下所示:
图4-8:FPU配置
上面的选择性编译,选择不同的定义代表使用不同的设备。选择#define
ARM_MATH_CM4 1 加入core_cm4.h到系统。
F429效果图如下:
图4-9:15KHz和1KHz的信号
图4-10:1KHz的信号
DAC(Digital
Analog Converter)数模转换器
F429的DAC最高为12bit的电压输出模数转换器。可以配置为8或者12bit的模式,可以通过DMA控制器读取。
(具体的参数可以参考数据手册RM900)
DAC的框架图如下:
图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;
}
}
}
通过示波器,效果图如下:
图4-12:三角波
图4-13:正弦波
|