嵌入式开发:傅里叶变换(4):在 STM32上面实现FFT(基于STM32L071KZT6 HAL库+DSP库)
目录
步骤 1:准备工作
步骤 2:创建 Keil 项目,并配置工程
步骤 3:在MDK工程上添加 CMSIS-DSP 库
步骤 5:编写代码
步骤 6:配置时钟和优化
步骤 7:调试与验证
步骤 8:优化和调整
注意事项:
在 STM32L071KZT6 上使用 MDK(Keil uVision)移植 DSP 库源码,并且基于 HAL 库进行开发,可以按照以下步骤进行操作:
步骤 1:准备工作
- 安装 Keil MDK:。
- 安装 STM32CubeMX: 参考博客:STM32开发,安装代码生成工具CubeMX_stm32cubemxzip-CSDN博客
-
下载 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 库
- 添加DSP文件夹,用于放置DSP库:CMSIS/DSP:

- 导入 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+ 处理器本身是小端架构,因此应该使用小端模式,否则会报错。
- 配置宏定义:在 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:编写代码
- 初始化 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:配置时钟和优化
- 时钟配置:确保系统时钟设置符合 DSP 库的要求,特别是在处理大型数据时,时钟的速度会影响 DSP 的性能。
- 优化设置:可以在 Keil 的项目设置中启用优化选项,启用硬件加速指令(如果处理器支持),以及通过定点运算(如果你不需要浮点计算)来提高性能。
步骤 7:调试与验证
- 编译代码:在 Keil 中点击 "Build" 编译项目,确保没有错误。
- 下载并调试程序:将程序下载到 STM32L071KZT6 开发板,使用 Keil 的调试工具调试代码,查看 DSP 运算结果。
- 验证 DSP 运算结果:检查 DSP 运算的输出,确保它们符合预期。如果需要,可以在调试过程中设置断点,单步执行并查看数据。

步骤 8:优化和调整
- 性能优化:对于较大数据量的 DSP 运算,可以考虑启用硬件浮点单元(如果芯片支持)或使用定点计算来优化性能。
- 内存优化:根据需要,优化内存的使用,避免不必要的内存占用,尤其是在资源受限的情况下。
注意事项:
- 硬件浮点支持:STM32L071KZT6 基于 Cortex-M0+ 内核,不支持硬件浮点单元,因此要么使用软件浮点运算,要么使用定点运算来优化性能。
- 定点运算优化:如果不使用浮点计算,CMSIS-DSP 库也支持定点运算,可以在库初始化时配置定点模式。
- 库版本兼容性:确保所使用的 CMSIS-DSP 库版本与 Keil MDK 以及 STM32L071 相兼容。
相关文章:
嵌入式开发:傅里叶变换(4):在 STM32上面实现FFT(基于STM32L071KZT6 HAL库+DSP库)
目录 步骤 1:准备工作 步骤 2:创建 Keil 项目,并配置工程 步骤 3:在MDK工程上添加 CMSIS-DSP 库 步骤 5:编写代码 步骤 6:配置时钟和优化 步骤 7:调试与验证 步骤 8:优化和调…...
飞鱼科技游戏策划岗内推
协助策划完成相关工作,包括但不仅限于策划配置,资料搜集,游戏体验; 游戏策划相关作品;游戏大赛经历;游戏demo制作经历;游戏公司策划岗位实习经历优先 内推码 DSZP7YFU...
前端如何进行性能优化
1. 减少HTTP请求 合并文件:将多个CSS或JavaScript文件合并为一个,减少请求次数。 使用CSS Sprites:将多个小图标合并为一张大图,通过背景定位显示。 内联小资源:将小的CSS或JavaScript直接嵌入HTML中,减少…...
大白话Vuex 核心概念(state、mutations、actions)的使用案例与原理
大白话Vuex 核心概念(state、mutations、actions)的使用案例与原理 Vuex是Vue.js应用程序中专门用来管理状态的工具,就好像是一个大管家,帮你把项目里一些重要的数据和操作管理得井井有条。下面用大白话结合案例来介绍Vuex核心概…...
阿里云ack的创建与实战应用案例
阿里云ack的创建与应用案例 创建前开通ack相关服务:开始创建简单的魔方游戏,熟悉sv与clb自动注册创建部署一个nginx 服务示例:走不同域名访问不同svc资源:为什么需要 Ingress ?创建第一个域名的 Deployment和Service。…...
鸿蒙开发深入浅出01(基本环境搭建、页面模板与TabBar)
鸿蒙开发深入浅出01(基本环境搭建、页面模板与TabBar) 1、效果展示2、下载 DevEco Studio3、创建项目4、新建页面模板5、更改应用信息6、新建以下页面7、Index.ets8、真机运行9、图片资源文件 1、效果展示 2、下载 DevEco Studio 访问官网根据自己的版本…...
Vue组件:从使用到原理的深度解析
一、什么是Vue组件? 组件是Vue的核心特性之一,它允许开发者将UI拆分为独立可复用的代码片段。每个组件本质上是一个Vue实例,具有自己的: 模板(Template) 数据(Data) 方法…...
Docker部署 MongoDB及常用命令
docker 部署 docker run -d \--name mongo \-e MONGO_INITDB_ROOT_USERNAMEroot \-e MONGO_INITDB_ROOT_PASSWORD123456 \-p 27017:27017 \-v ./local-mongo-data:/data/db \mongo:latest或者编写 docker-compose.yaml 文件。如下: version: 3.1services:mongo:im…...
27.[前端开发-JavaScript基础]Day04-函数基本使用-递归-变量作用域-函数式编程
一、JavaScript函数 1 认识JavaScript函数 程序中的foo、bar、baz 认识函数 函数使用的步骤 2 函数的声明和调用 声明和调用函数 函数的参数 有参数的函数练习 函数的返回值 函数的练习 arguments参数(JS高级再学习) 3 函数的递归调用 函数中调用函数…...
mac修改docker的daemon.json 镜像文件
1、找到daemon.json文件的位置 docker info 可以看出位置在: /Users/spuer/.docker 2. 进入daemon.json 所在的目录: cd /Users/spuer/.docker3. 查看daemon.json的内容: more daemon.json可以看出,没有配置registry-mirrors&…...
KIMI K1.5:大规模强化学习在大语言模型中的应用与工程实践
目录 1、核心技术创新:长上下文强化学习 2、策略优化的技术细节 2.1、在线镜像下降变体 2.2、长度惩罚机制 2.3、智能采样策略 3、工程架构创新 3.1、混合部署框架 3.2、代码沙箱与奖励模型 3.3、分布式系统架构 4、实验成果与性能提升 5、结论与未来展望 大语言模…...
seacms v9 实现的MySQL注入
目录 过滤关键词information_schema 怎么办 一、环境搭建 二、环境分析 三、源代码分析 1、过滤程序 2、注入点 四、获取数据库名 五、获取数据库表名 六、获取表的列名 七、获取数据信息 过滤关键词information_schema 怎么办 1.、利用sys数据库(MySQL 5.…...
Go中slice和map引用传递误区
背景 关于slice和map是指传递还是引用传递,很多文章都分析得模棱两可,其实在Go中只有值传递,但是很多情况下是因为分不清slice和map的底层实现,所以导致很多人在这一块产生疑惑,下面通过代码案例分析slice和map到底是…...
C# Unity 唐老狮 No.2 模拟面试题
本文章不作任何商业用途 仅作学习与交流 安利唐老狮与其他老师合作的网站,内有大量免费资源和优质付费资源,我入门就是看唐老师的课程 打好坚实的基础非常非常重要: Unity课程 - 游习堂 - 唐老狮创立的游戏开发在线学习平台 - Powered By EduSoho 如果你发现了文章内特殊的字体…...
【Uniapp-Vue3】开发userStore用户所需的相关操作
在项目根路径下创建的stores文件夹中创建user.js文件 并将以下内容复制到user.js中 import {ref} from "vue" import { defineStore } from pinia; const uniIdCo uniCloud.importObject("uni-id-co") const db uniCloud.database(); const usersTable…...
DeepSeek开源周首日:发布大模型加速核心技术可变长度高效FlashMLA 加持H800算力解码性能狂飙升至3000GB/s
FlashMLA的核心技术特性包括对BF16精度的全面支持,以及采用块大小为64的页式键值缓存(Paged KV Cache)系统,实现更精确的内存管理。在性能表现方面,基于CUDA12.6平台,FlashMLA在H800SXM5GPU上创下了显著成绩…...
易语言模拟真人鼠标轨迹算法 - 防止游戏检测
一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序,它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言,原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势: 模拟…...
DeepSeek 提示词:基础结构
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…...
文件系统
目录 1.认识磁盘 磁盘的物理结构 CHS定位法 磁盘的逻辑结构 2.认识文件系统 inode 分区和分组 磁盘上的文件系统 3.软硬链接 软链接 软链接的操作 创建软链接 查看软链接 删除软链接 软链接的特点 软链接的使用场景 硬链接 硬链接的操作 创建硬链接 查看硬…...
力扣LeetCode:1472 设计浏览器历史记录
题目: 你有一个只支持单个标签页的 浏览器 ,最开始你浏览的网页是 homepage ,你可以访问其他的网站 url ,也可以在浏览历史中后退 steps 步或前进 steps 步。 请你实现 BrowserHistory 类: BrowserHistory(string h…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...
面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
Rust 开发环境搭建
环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行: rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu 2、Hello World fn main() { println…...
uniapp 小程序 学习(一)
利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...
【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验
Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...
用鸿蒙HarmonyOS5实现中国象棋小游戏的过程
下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...
