嵌入式开发:傅里叶变换(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 相兼容。
相关推荐
我要昵称干什么2 小时前
STM32学习——RTC实时时钟(BKP与RTC外设)
c语言·stm32·单片机·嵌入式硬件·学习·实时音视频
YueiL3 小时前
物联网通信应用案例之《智慧农业》
单片机·嵌入式硬件·物联网
打酱油的工程师3 小时前
w803|联盛德|WM IoT SDK2.X测试|pinout|(2):w803开发板简介
单片机·物联网·w80x
桀骜陷阱3 小时前
【江科协-STM32】5. 输出比较
stm32·单片机·嵌入式硬件
嵌入式Linux,5 小时前
当单片机遇到这颗LED驱动芯片,
单片机·嵌入式硬件
mftang5 小时前
BLDC 电机的控制原理
嵌入式硬件
BW.SU5 小时前
51单片机制作彩屏触摸小电子琴STC32G12K128+RA6809+彩屏1024x600
单片机·嵌入式硬件·51单片机·freertos·stc32g12k128
亿道电子Emdoor5 小时前
【ARM】如何通过ARMDS的Map文件查看堆栈调用情况
arm开发·stm32·单片机
wenchm5 小时前
细说STM32F407单片机RS485收发通信实例及调试方法
stm32·单片机·嵌入式硬件
桀骜陷阱6 小时前
【江科协-STM32】1. GPIO
stm32·单片机·嵌入式硬件