嵌入式开发:傅里叶变换(5):基于STM32,实现CMSIS中的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 相兼容。
相关文章:
嵌入式开发:傅里叶变换(5):基于STM32,实现CMSIS中的DSP库
目录 步骤 1:准备工作 步骤 2:创建 Keil 项目,并配置工程 步骤 3:在MDK工程上添加 CMSIS-DSP 库 步骤 5:编写代码 步骤 6:配置时钟和优化 步骤 7:调试与验证 步骤 8:优化和调…...
【人工智能】GPT-4 vs DeepSeek-R1:谁主导了2025年的AI技术竞争?
前言 2025年,人工智能技术将迎来更加激烈的竞争。随着OpenAI的GPT-4和中国初创公司DeepSeek的DeepSeek-R1在全球范围内崭露头角,AI技术的竞争格局开始发生变化。这篇文章将详细对比这两款AI模型,从技术背景、应用领域、性能、成本效益等多个方…...
【Python项目】基于深度学习的车辆特征分析系统
【Python项目】基于深度学习的车辆特征分析系统 技术简介:采用Python技术、MySQL数据库、卷积神经网络(CNN)等实现。 系统简介:该系统基于深度学习技术,特别是卷积神经网络(CNN),用…...
【江科大STM32】TIM输入捕获模式PWMI模式测频率
一、输入捕获测频率 接线图: 测信号的输入引脚为PA6,信号从PA6进来,待测的PWM信号也是STM32自己生成的,输出引脚是PA0,所以接线这里直接用一根线将PA0引到PA6就可以了。 如果有信号发生器的话,也可以设置成…...
K8S学习之基础十六:k8s中Deployment更新策略
滚动更新 滚动更新是一种自动化程度较高的发布方式、用户体验比较平滑、是目前成熟型技术组织采用的主流发布方式,一次滚动发布一般有若干发布批次组成,每批的数量一般都是可配置的,可通过发布模板定义,例如第一批10%,…...
Django 5实用指南(十二)异步处理与Celery集成
在现代Web应用中,异步任务的处理是提升应用性能和响应速度的关键。Django5提供了对异步任务的支持,尤其是通过集成Celery来处理后台任务。Celery是一个强大的分布式任务队列,可以让我们将耗时的操作(如发送邮件、生成报告、处理图…...
EtherNet/IP转Modbus解析基于网关模块的罗克韦尔PLC与Modbus上位机协议转换通讯案例
在工业自动化控制系统中,常常会遇到不同品牌和通信协议的设备需要协同工作的情况。本案例中,客户现场采用了 AB PLC,但需要控制的变频器仅支持 Modbus 协议。为了实现 AB PLC 对变频器的有效控制与监控,引入了捷米特 JM-EIP-RTU 网…...
Devart dbForge Studio for MySQL Enterprise 9.0.338高效数据库管理工具
Devart dbForge Studio for MySQL Enterprise 9.0.338 是一款功能强大的 MySQL 数据库管理工具,专为数据库开发人员和管理员设计。它提供了丰富的功能,帮助用户更高效地管理、开发和维护 MySQL 数据库 Devart dbForge Studio for MySQL Enterprise 9.0.…...
linux | Vim 命令快捷操作
注:本文为过去的 “vim 使用笔记”。 跳转命令 跳转命令 #:向前查找光标当前所在单词,并跳转到该单词的上一个出现位置。*:向后查找光标当前所在单词,并跳转到该单词的下一个出现位置。 行内跳转 0:跳转…...
android12 屏幕亮度控制修改为线性变化
由于高版本的亮度调节不是线性变化了,有客户反馈在Android11或者12上使用代码获取亮度不对,比如我们在设置中查看屏幕亮度是80%,读出来的亮度值是100,客户认为亮度值是39%。 获取屏幕亮度 adb shell settings get system screen…...
STM32-USART串口数据包
一:HEX数据包发送 1.为了收发数据包,先定义两个缓存区的数组 ,这4个数据只存储发送或者接收的载荷数据,包头和包尾不存 uint8_t Serial_TxPacket[4]; uint8_t Serial_RxPacket[4]; uint8_t Serial_RxFlag;//接收一个数据包就置F…...
轻闪PDF(Windows傲软PDF编辑软件)2.15.2中文安装版
前言 轻闪pdf是个很好用的文件编辑软件,它能让大家编辑文档变得更简单、更快。这个软件特别厉害,能从照片里直接“抓”出文字来,让你打字变得更轻松。而且,它还能把PDF文件变成其他格式的文件,反过来也行。还有啊&…...
Python-07PDF转Word
2025-03-04-PDF转Word DeepSeek等大模型从来都不是简单的写一个静态博客这么肤浅(太多博主都只讲这个内容了)借助全网大神的奇思妙想,拓展我狭隘的思维边界。 文章目录 2025-03-04-PDF转Word [toc]1-参考网址2-学习要点3-核心逻辑4-核心代码 …...
Arcgis中添加脚本工具箱
文章目录 准备资料1、打开arcmap2、找到目录窗口3、复制粘贴工具箱的路径4、添加或者确认python脚本路径准备资料 (1)工具箱 (2)python脚本 1、打开arcmap 2、找到目录窗口 3、复制粘贴工具箱的路径 4、添加或者确认python脚本路径 脚本上右键属性(注意:脚本内容和路径…...
拥抱健康养生,开启活力生活
在快节奏的现代生活中,健康养生已成为人们关注的焦点,它不仅是对身体的呵护,更是一种积极的生活态度。 合理饮食是健康养生的基石。我们应秉持均衡膳食的理念,谷物、蔬菜、水果、蛋白质类食物一个都不能少。每天保证足够的蔬菜摄入…...
字节跳动AI原生编程工具Trae和百度“三大开发神器”AgentBuilder、AppBuilder、ModelBuilder的区别是?
字节跳动AI编程工具Trae与百度"三大开发神器"(AgentBuilder、AppBuilder、ModelBuilder)在定位、功能架构和技术路线上存在显著差异,具体区别如下: 一、核心定位差异 Trae:AI原生集成开发环境(AI…...
【MySQL】第十二弹---表连接详解:从内连接到外连接
✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【MySQL】 目录 1.表的内连和外连 1.1 内连接 1.2 外连接 1.2.1 左外连接 1.2.1 右外连接 1.3 实战OJ 1.表的内连和外连 表的连接…...
MySQL字段内容加解密使用性能验证
背景: 近期工作中遇到对MySQL表中内容安全要求,需要通过字段内容加密存储的方式来实现。 为真实测试,如有疑问,欢迎解惑。 有多种解决办法,可以通过中间件来实现、数据库层来实现,最终选择了AES对称…...
审批流AntV框架蚂蚁数据可视化X6饼图(附注释)
大家好,这次使用的是AntV的蚂蚁数据可视化X6框架,类似于审批流的场景等,代码如下: X6框架参考网址:https://x6.antv.vision/zh/examples/showcase/practices#bpmn 可以进入该网址,直接复制下方代码进行调试…...
【SpringBoot】深入解析 Maven 的操作与配置
Maven 1.什么是Maven? Maven是一个项目管理工具,通过pom.xml文件的配置获取jar包,而不用手动去添加jar包; 2. 创建一个Maven项目 IDEA本身已经集成了Maven,我们可以直接使用,无需安装 以下截图的idea版本为ÿ…...
搭建一个简单的node服务,模拟后端接口
目录 一、查看是否安装了node和npm 二、创建一个文件夹,用于放你的node服务代码 三、初始化一个package.json 四、安装 Express(快速搭建服务的框架) 五、创建serve.js 六、运行服务即可 七、测试接口 法一:使用 curl 法…...
【落羽的落羽 C++】C++入门基础:引用,内联,nullptr
文章目录 一、引用1. 引用的概念2. 引用的特点3. 引用的使用4. const引用5. 引用和指针 二、inline内联三、nullptr 一、引用 1. 引用的概念 引用是C中的一个较为重要的概念。它是给已存在变量取的“别名”,编译器不会为引用变量开辟内存空间,它和它引…...
Android 低功率蓝牙之BluetoothGattCallback回调方法详解
BluetoothGattCallback 是 Android 中用于处理蓝牙低功耗(BLE)设备通信的核心回调类。它负责处理与 BLE 设备的连接、服务发现、数据读写等操作的结果。以下是对 BluetoothGattCallback 的详细解析: 1. onConnectionStateChange 触发时机&am…...
PHP之字符串拼接
在你有别的编程语言的基础下,你想学习PHP,可能要了解的一些关于字符串拼接的信息。 特别注意方法一,在别的语言中基本都是用拼接的。 方法一:(直接拼接) $x 123; echo "hello" . $x;方法二:(多输出拼接) …...
Python的那些事第四十一篇:简化数据库交互的利器Django ORM
Django ORM:简化数据库交互的利器 摘要 随着互联网技术的飞速发展,Web开发越来越受到重视。Django作为一款流行的Python Web框架,以其高效、安全、可扩展等特点受到了广大开发者的喜爱。其中,Django ORM(对象关系映射)是Django框架的核心组件之一,它为开发者提供了一种…...
通过多线程同时获取H264和H265码流
目录 一.RV1126 VI采集摄像头数据并同时编码H264、H265的大概流程编辑编辑 1.1初始化VI模块: 1.2H264、H265的VENC模块初始化: 1.3VI分别绑定H264的VENC层和H265的VENC层: 1.4开启H264线程采集H264的VENC数据ÿ…...
DeepSeek V3 源码:从入门到放弃!
从入门到放弃 花了几天时间,看懂了DeepSeek V3 源码的逻辑。源码的逻辑是不难的,但为什么模型结构需要这样设计,为什么参数需要这样设置呢?知其然,但不知其所以然。除了模型结构以外,模型的训练数据、训练…...
海量数据融合互通丨TiDB 在安徽省住房公积金监管服务平台的应用实践
导读 安徽省住房公积金监管服务平台通过整合全省 17 家公积金中心的数据,致力于实现数据共享、规范化管理与高效数据分析。为了应对海量数据处理需求,安徽省选择 TiDB 作为底层数据库,利用其分布式架构和 HTAP 能力,实现了快速的…...
Sqlserver安全篇之_手工创建TLS用到的pfx证书文件
Sqlserver官方提供的Windows Powershell脚本 https://learn.microsoft.com/zh-cn/sql/database-engine/configure-windows/configure-sql-server-encryption?viewsql-server-ver16 # Define parameters $certificateParams {Type "SSLServerAuthentication"Subje…...
Linux12-UDP\TCP
一、UDP 1.特点: 尽最大努力交付,存在丢包的可能 无连接 面向数据报 机制简单,传输效率高 2.应用场景: 1.画面传输 VNC 直播:要求实时性高、允许数据丢失、 二、TCP 1.特点: 面向数据流(流式套接字) 建立连接 安全可靠的传输协议 三次握手:TCP建立连接时,…...
