CMSIS标准及HAL库学习记录(1)

本文介绍了如何利用CMSIS和HAL库提高嵌入式程序的可移植性和维护性,特别是在STM32F407VG芯片上。通过Keil MDK 5.24a,结合RTX5源代码,详细阐述了工程配置过程,包括选择CMSIS CORE, DSP, RTOS组件以及HAL库的相关驱动。虽然STM32CUBE能加速开发,但为了深入学习,选择了手动配置。文章最后提及编写BSP驱动和应用主函数以实现LED灯的控制。" 129927026,5613065,深入理解Spring Bean:生命周期与管理,"['spring', 'java', '后端开发', 'bean管理']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    工作中总会遇到嵌入式程序的可移植性问题,因为代码量的庞大和编写代码人的不统一性,尤其是遇到开发人员离职的问题。在代码的几年维护和需求变更等等各种修改工作后,代码便变得难以维护。那么如何保持代码的可持续维护性?如何让代码在平台变更,各类不同硬件架构的产品之中游刃有余?ARM为我们提出了一个方案:CMSIS 和HAL库。以下是ARM官网关于CMSIS的架构图,由于理解尚不够深入,而且本人能力有限,不予详细说明。

本次学习基于Keil MDK 5.24a,基于STM32F407VG芯片,使用Software Pack方式和Keil提供的RTX 5源代码进行学习。

首先创建工程,在新工程的Software Pack相关选项中勾上CMSIS项下CORE      DSP      RTOS(API)中的Keil RTX5      RTOS2(API)中的KEIL RTX5的Source     Device中勾选Startup STM32CUBE中的Classic方式 HAL库中勾选需要的驱动

如果使用STM32CUBE软件作为辅助开发,可以更快的上手相关开发,图形和列表化的配置能够把复杂的时钟系统和外设配置的井井有条。但是本次目的以学习为主,不采用软件辅助的方式进行开发。

创建完成后,工程里应有的部分为RTX相关源码,DSP相关LIB库文件

### STM32F1系列上使用HAL实现FFT功能的方法 在STM32F1系列微控制器中,虽然不支持硬件加速的FFT功能,但可以通过软件方式利用CMSIS-DSP来完成FFT运算。以下是具体实现方法: #### 1. CMSIS-DSP简介 CMSIS (Cortex Microcontroller Software Interface Standard) 是ARM公司提供的一套标准接口规范,其中包含了DSP(Digital Signal Processing)用于信号处理操作。该提供了多种算法实现,包括但不限于快速傅里叶变换(FFT)。对于STM32F1系列,可以借助CMSIS-DSP中的`arm_cfft_radix2_f32()`函数来进行复数FFT计算。 需要注意的是,在实际应用中,由于STM32F1性能限制,建议优化数据量级以减少计算时间[^1]。 #### 2. 初始化配置 为了正确执行FFT,需先初始化相应的结构体实例并设置参数。例如定义如下变量: ```c arm_cfft_radix2_instance_f32 scfft; ``` 接着通过调用初始化函数设定好FFT长度等相关属性。这里假设采用512点为例说明: ```c arm_cfft_radix2_init_f32(&scfft, FFT_LENGTH, IF_INVERSE, BIT_REVERSED); // 参数解释:&scfft - 结构体指针;FFT_LENGTH - 变换长度;IF_INVERSE - 是否逆向变换标志位; // BIT_REVERSED - 输出是否按比特反转顺序排列。 ``` 此部分依据所选FFT点数不同而有所变化,请参照实际情况调整[^2]。 #### 3. 数据准备与转换 输入至FFT算法的数据通常为实数值序列,但在内部表示形式上则视为一对对共轭虚部组成的形式存储于单一浮点型数组之中。因此需要预先准备好这样的格式化后的缓冲区作为后续传递给FFT函数使用的材料之一——即源地址指向的位置处存放着待分析样本集合。 另外还需额外开辟一块空间用来保存最终得到的结果集,同样也是按照相同规格布局而成的新区域供读取解析之用[^3]。 #### 4. 调用FFT函数 当一切准备工作就绪之后即可正式发起呼叫请求让系统开始进行离散傅立叶转换过程了。这一步骤非常简单明了只需一句命令便可达成目标效果展示出来给大家看吧! ```c arm_cfft_radix2_f32(&scfft, fft_inputbuf, ifftFlag, doBitReverse); /* 参数含义分别为: &scfft -> 已经初始化好的结构体对象引用, fft_inputbuf -> 输入数据缓存区首址偏移量, ifftFlag -> 判断当前动作属于正向还是反向模式标记符, doBitReverse-> 控制输出结果要不要做bit-reverse重排的动作 */ ``` #### 5. 计算幅值大小 经过前面几步的操作我们已经成功获取到了频域上的信息表达式,但是这些数字本身并没有直观意义所以还需要进一步加工才能获得更加清晰易懂的表现形态。为此我们可以再次运用另一个现成可用的功能模块帮助我们将每一个频率分量对应的实际强度提取出来形成新的列表呈现给我们观察研究。 ```c arm_cmplx_mag_f32(fft_inputbuf, fft_outputbuf, FFT_LENGTH); /* 此处传入两个主要参数分别是原始复数类型数据组以及目的单纯实数类型的接收容器还有共同的有效记录条目总数 */ ``` 至此为止整个流程基本结束只剩下最后一点收尾工作那就是寻找峰值所在位置及其代表的具体物理量度单位下的真实数值而已啦! --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值