嵌入式开发:傅里叶变换(4):在 STM32上面实现FFT(基于STM32L071KZT6 HAL库+DSP库)

目录

[步骤 1:准备工作](#步骤 1:准备工作)

[步骤 2:创建 Keil 项目,并配置工程](#步骤 2:创建 Keil 项目,并配置工程)

[步骤 3:在MDK工程上添加 CMSIS-DSP 库](#步骤 3:在MDK工程上添加 CMSIS-DSP 库)

[步骤 5:编写代码](#步骤 5:编写代码)

[步骤 6:配置时钟和优化](#步骤 6:配置时钟和优化)

[步骤 7:调试与验证](#步骤 7:调试与验证)

[步骤 8:优化和调整](#步骤 8:优化和调整)

注意事项:


在 STM32L071KZT6 上使用 MDK(Keil uVision)移植 DSP 库源码,并且基于 HAL 库进行开发,可以按照以下步骤进行操作:

步骤 1:准备工作

  1. 安装 Keil MDK:。
  2. 安装 STM32CubeMX : 参考博客:STM32开发,安装代码生成工具CubeMX_stm32cubemxzip-CSDN博客
  3. 下载 DSP 库源码

从 STMicroelectronics 官网或者 ARM 官方下载 CMSIS-DSP 库源码。这个库包括了许多数学运算、滤波器、FFT等功能,并且专为 ARM Cortex-M 系列微控制器优化。 注意:MDK 请使用 5.26 及其以上版本,CMSIS 软件包请使用 5.6.0 及其以上版本。

安装了新版 MDK 后,CMSIS 软件包会存在于路径:D:\keil\Arm\Packs\ARM\CMSIS\5.9.0

打开固件库的CMSIS库,可以看看到下面的列表:

其中 DSP 文件夹是我们需要的:

关于DSP 文件夹的介绍见博客:

步骤 2:创建 Keil 项目,并配置工程

参考博客 CubeMX配置STM32L071KZT6

步骤 3:在MDK工程上添加 CMSIS-DSP 库

  1. 添加DSP文件夹,用于放置DSP库 :CMSIS/DSP:

  2. 导入 CMSIS-DSP 库

    • 在 Keil 项目中,右键点击 "CMSIS/DSP",选择 "Add Existing Files" 并添加 CMSIS-DSP 库中。
    • 进入以下路径(工程路径下):C:\Users\FCZ\Desktop\design\Fluxgate_code\Drivers\CMSIS\Lib\ARM,添加DSP库:l 表示小端格式,b 表示大端格式,Cortex-M0+ 处理器本身是小端架构,因此应该使用小端模式,否则会报错。
  3. 配置宏定义:在 Keil 项目的 "Options for Target" 设置中,确保配置了正确的宏定义。对于 ARM Cortex-M0+ 内核,可能需要配置某些优化选项,如启用硬件除法(如果有)或选择定点运算模式。

打开 Keil MDK,选择你的项目。

右键点击项目,选择 "Options for Target"。

在弹出的窗口中,选择 "C/C++" 选项卡。

在 "Preprocessor Symbols" 中添加以下宏定义:ARM_MATH_CM0PLUS

4.添加头文件

添加文件路径:..\Drivers\CMSIS\DSP\Include

用到 DSP 库函数的文件得添加**#include "arm_math.h"**就可以调用 DSP 库的 API 了。至此就完成了 DSP 库的移植。

步骤 5:编写代码

  1. 初始化 HAL 库 :在 main.c 中,初始化 HAL 库和外设。 示例:

    复制代码
    #include "stm32l0xx_hal.h"
    #include "arm_math.h"
    
    void HAL_Init(void);
    void SystemClock_Config(void);
    void MX_GPIO_Init(void);
    
    float32_t pSrc = -12;
    float32_t pDst;
    
    int main(void)
    {
        // 初始化 HAL 库
        HAL_Init();
        SystemClock_Config();
        MX_GPIO_Init();
    
        // 初始化 DSP 库
        DSP_Init();
    
        while (1)
        {
            // 调用 DSP 函数
           arm_abs_f32(&pSrc, &pDst, 1);
        }
    }

步骤 6:配置时钟和优化

  1. 时钟配置:确保系统时钟设置符合 DSP 库的要求,特别是在处理大型数据时,时钟的速度会影响 DSP 的性能。
  2. 优化设置:可以在 Keil 的项目设置中启用优化选项,启用硬件加速指令(如果处理器支持),以及通过定点运算(如果你不需要浮点计算)来提高性能。

步骤 7:调试与验证

  1. 编译代码:在 Keil 中点击 "Build" 编译项目,确保没有错误。
  2. 下载并调试程序:将程序下载到 STM32L071KZT6 开发板,使用 Keil 的调试工具调试代码,查看 DSP 运算结果。
  3. 验证 DSP 运算结果 :检查 DSP 运算的输出,确保它们符合预期。如果需要,可以在调试过程中设置断点,单步执行并查看数据。

步骤 8:优化和调整

  1. 性能优化:对于较大数据量的 DSP 运算,可以考虑启用硬件浮点单元(如果芯片支持)或使用定点计算来优化性能。
  2. 内存优化:根据需要,优化内存的使用,避免不必要的内存占用,尤其是在资源受限的情况下。

注意事项:

  • 硬件浮点支持:STM32L071KZT6 基于 Cortex-M0+ 内核,不支持硬件浮点单元,因此要么使用软件浮点运算,要么使用定点运算来优化性能。
  • 定点运算优化:如果不使用浮点计算,CMSIS-DSP 库也支持定点运算,可以在库初始化时配置定点模式。
  • 库版本兼容性:确保所使用的 CMSIS-DSP 库版本与 Keil MDK 以及 STM32L071 相兼容。
相关推荐
捷配datasheet20 分钟前
OP2177运算放大器:高性能模拟信号处理的关键元件
嵌入式硬件·信号处理
逼子格2 小时前
五种音频器件综合对比——《器件手册--音频器件》
嵌入式硬件·音视频·硬件工程师·硬件测试·电子器件·硬件笔试真题·音频器件
niuTaylor4 小时前
STM32平衡车开发实战教程:从零基础到项目精通
stm32·单片机·嵌入式硬件
可待电子单片机设计定制(论文)13 小时前
【STM32设计】基于STM32的智能门禁管理系统(指纹+密码+刷卡+蜂鸣器报警)(代码+资料+论文)
stm32·单片机·嵌入式硬件
不可思议迷宫14 小时前
Verilog编程实现一个分秒计数器
单片机·嵌入式硬件·fpga开发
life_yangzi16 小时前
关于单片机IAP升级的那点事儿|智能设置中断向量表
单片机·嵌入式硬件
了一li18 小时前
STM32实现一个简单电灯
stm32·单片机·嵌入式硬件
可待电子单片机设计定制(论文)20 小时前
【STM32设计】数控直流稳压电源的设计与实现(实物+资料+论文)
stm32·嵌入式硬件·mongodb
march_birds21 小时前
FreeRTOS 与 RT-Thread 事件组对比分析
c语言·单片机·算法·系统架构