嵌入式开发:傅里叶变换(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:优化和调…...
探秘基带算法:从原理到5G时代的通信变革【六】CRC 校验
文章目录 2.5 CRC 校验2.5.1 前言2.5.2 CRC算法简介2.5.3 CRC计算的详细过程2.5.4 CRC校验的两种方法详解**分离比较法****整体运算法****不同位出错与余数的关系****总结** 2.5.5 CRC计算的C实现及工具介绍**C实现CRC计算****CRC计算工具推荐** **2.5.6 总结:CRC校…...
MySQL——DQL、多表设计
目录 一、DQL 1.基本查询 2.条件查询 3.分组查询 4.排序查询 5.分页查询 二、多表设计 1.一对多 2.一对一 3.多对多 一、DQL 1.基本查询 注意: *号代表查询所有字段,在实际开发中尽量少用(不直观、影响效率) 2.条件查询…...
XML 编辑器:全面指南与最佳实践
XML 编辑器:全面指南与最佳实践 引言 XML(可扩展标记语言)编辑器是处理XML文件的关键工具,对于开发人员、系统管理员以及任何需要处理XML数据的人来说至关重要。本文将全面介绍XML编辑器的概念、功能、选择标准以及最佳实践,旨在帮助读者了解如何选择和使用合适的XML编辑…...
【USRP】NVIDIA Sionna:用于 6G 物理层研究的开源库
目录 Sionna:用于 6G 物理层研究的开源库主要特点实现6G研究的民主化支持 5G、6G 等模块化、可扩展、可伸缩快速启动您的研究 好处原生人工智能支持综合研究平台开放生态系统 安装笔记使用 pip 安装基于Docker的安装从源代码安装“你好世界!”探索锡奥纳…...
DeepSeek开源周Day6:DeepSeek V3、R1 推理系统深度解析,技术突破与行业启示
DeepSeek 在开源周第六天再次发文,中文原文、官方号在知乎 DeepSeek - 知乎DeepSeek-V3 / R1 推理系统概览 - 知乎deepseek-ai/open-infra-index: Production-tested AI infrastructure tools for efficient AGI development and community-driven innovation 引言 …...
intra-mart实现logicDesigner与forma联动
一、前言 有一个需求,想实现从页面上传一个excel文件,点击提交,就转发给forma模块,然后用户在forma模块里,确认下自动填写的信息是否正确,正确的话就点击保存,存入数据库;不正确的话…...
《大语言模型的原理发展与应用》:此文为AI自动生成
《大语言模型的原理发展与应用》:此文为AI自动生成 一、引言:大语言模型,AI 时代的 “新引擎” 在当今数字化浪潮中,大语言模型宛如一颗璀璨的明星,照亮了人工智能发展的道路,成为推动各领域变革的核心驱…...
生态安全相关
概念:生态安全指一个国家具有支撑国家生存发展的较为完整、不受威胁的生态系统,以及应对内外重大生态问题的能力。 (1)国外生态安全的研究进展 国际上对生态安全的研究是从“环境”与“安全”之间的关系展开的。开始的阶段&#x…...
DeepSeek-R1国产化系统gpu驱动+cuda+ollama+webui可视化离线私有化部署
1.概述 网上大部分教程都是在线部署,完全离线私有化部署的文章不多,本文介绍从GPU驱动、cuda、ollama、deepseek模型和open webui等完全离线安装几个方面,让小白0基础也可以私有化部署大模型deepseek-R1。 我使用的设备是银河麒麟V10操作系统…...
数据集/API 笔记:新加坡风速 API
data.gov.sg 数据范围:2016年12月 - 2025年3月 API 查询方式 curl --request GET \--url https://api-open.data.gov.sg/v2/real-time/api/wind-speedcurl --request GET \--url "https://api-open.data.gov.sg/v2/real-time/api/wind-speed?date2024-07-16…...
transformer架构解析{掩码,(自)注意力机制,多头(自)注意力机制}(含代码)-3
目录 前言 掩码张量 什么是掩码张量 掩码张量的作用 生成掩码张量实现 注意力机制 学习目标 注意力计算规则 注意力和自注意力 注意力机制 注意力机制计算规则的代码实现 多头注意力机制 学习目标 什么是多头注意力机制 多头注意力计算机制的作用 多头注意力机…...
【C++】switch 语句编译报错:error: jump to case label
/home/share/mcrockit_3588/prj_linux/../source/rkvpss.cpp: In member function ‘virtual u32 CRkVpss::Control(u32, void*, u32)’: /home/share/mcrockit_3588/prj_linux/../source/rkvpss.cpp:242:8: error: jump to case label242 | case emRkComCmd_DBG_SaveInput:|…...
linux中使用firewall命令操作端口
一、开放端口 1. 开放一个端口 sudo firewall-cmd --zonepublic --add-port8443/tcp --permanent sudo firewall-cmd --reload 2. 开放一组连续端口 sudo firewall-cmd --zonepublic --add-port100-500/tcp --permanent sudo firewall-cmd --reload 3. 一次开放多个不连续…...
C++第六节:stack和queue
本节目标: stack的介绍与使用queue的介绍与使用priority_queue的介绍与使用容器适配器模拟实现与结语 1 stack(堆)的介绍 stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,只能从容器的一端进行元素的插…...
算法 并查集
目录 前言 一 并查集的思路 二 并查集的代码分析 三 实操我们的代码 四 并查集的代码优化 总结 前言 并查集主要是用来求解集合问题的,用来查找集合还有就是合并集合,可以把这个运用到最小生成树里面 一 并查集的思路 1 并查集的相关的操作…...
yarn application命令中各参数的详细解释
yarn application 命令用于管理和监控 YARN 上运行的应用程序,下面为你详细解释该命令中各参数的含义和用途: 通用参数 -help [command] 作用:显示 yarn application 命令的帮助信息。如果指定了 command,则显示该子命令的详细使…...
算法之数据结构
目录 数据结构 数据结构与算法面试题 数据结构 《倚天村 • 图解数据结构》 | 小傅哥 bugstack 虫洞栈 ♥数据结构基础知识体系详解♥ | Java 全栈知识体系 线性数据结构 | JavaGuide 数据结构与算法面试题 数据结构与算法面试题 | 小林coding...
Android 图片压缩详解
在 Android 开发中,图片压缩是一个重要的优化手段,旨在提升用户体验、减少网络传输量以及降低存储空间占用。以下是几种主流的图片压缩方法,结合原理、使用场景和优缺点进行详细解析。 效果演示 直接先给大家对比几种图片压缩的效果 质量压缩 质量压缩:根据传递进去的质…...
迷你世界脚本计时器接口:MiniTimer
计时器接口:MiniTimer 彼得兔 更新时间: 2023-04-26 20:24:50 具体函数名及描述如下: 序号 函数名 函数描述 1 isExist(...) 判断计时器是否存在 2 createTimer(...) 添加计时器 3 deleteTimer(...) 删除计时器 4 startBackwardTimer(.…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...
在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...
FFmpeg:Windows系统小白安装及其使用
一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...
用鸿蒙HarmonyOS5实现中国象棋小游戏的过程
下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...
