当前位置: 首页 > news >正文

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

目录

步骤 1:准备工作

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

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

步骤 5:编写代码

步骤 6:配置时钟和优化

步骤 7:调试与验证

步骤 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 相兼容。

相关文章:

嵌入式开发:傅里叶变换(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) 方法&#xf…...

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…...

手机维修师傅的“内功心法”:看懂手机屏排线上的MIPI、I2C、SPI信号,快速定位不开机、花屏、触摸失灵故障

手机维修实战:通过屏排线信号诊断显示与触摸故障的黄金法则 当你面对一部摔落后屏幕全黑但能听见系统声音的iPhone,或是进水后出现彩色条纹的安卓手机时,90%的维修师傅会直接更换屏幕总成。而真正的高手,会拿起万用表和示波器&…...

备件断供时代:中短波发射机国产化替代的真实进展

本文是工程四部曲之四。此前三篇分别拆解了中波台的运营成本(OPEX篇)、发射机的全生命周期成本、以及天馈系统的数字化适配。本篇文章,我们将把目光转向设备供应链本身——你想买的东西,还买得到吗? 一根导火索 2026年…...

Agent-Sandbox UI 上线,来看看有哪些的功能是你经常使用的?悸

一、简化查询 1. 先看一下查询的例子 /// /// 账户获取服务 /// /// /// public class AccountGetService(AccountTable table, IShadowBuilder builder) {private readonly SqlSource _source new(builder.DataSource);private readonly IParamQuery _accountQuery build…...

Markdown Viewer:浏览器中的终极Markdown渲染神器,让你告别单调预览

Markdown Viewer:浏览器中的终极Markdown渲染神器,让你告别单调预览 【免费下载链接】markdown-viewer Markdown Viewer / Browser Extension 项目地址: https://gitcode.com/gh_mirrors/ma/markdown-viewer 还在为Markdown文件的预览效果发愁吗&…...

ESLint 9.0+ 配置实战:从零到一构建现代前端代码规范

1. 为什么你需要ESLint 9.0的扁平化配置 最近接手了一个Vue 3 TypeScript的新项目,当我像往常一样准备配置ESLint时,发现官方文档已经全面转向了全新的扁平化配置方式。作为一个从ESLint 6.x时代就开始使用它的老用户,我必须承认这次改动确实…...

Realistic Vision V5.1显存监控与优化:nvidia-smi实时观测+内存释放时机建议

Realistic Vision V5.1显存监控与优化:nvidia-smi实时观测内存释放时机建议 1. 项目背景与显存挑战 Realistic Vision V5.1作为Stable Diffusion 1.5生态中的顶级写实模型,能够生成媲美专业单反相机拍摄的人像作品。但在实际使用中,许多用户…...

让离线 Debian 系统重获新生:apt-offline 实战指南

让离线 Debian 系统重获新生:apt-offline 实战指南 【免费下载链接】apt-offline Offline APT Package Manager 项目地址: https://gitcode.com/gh_mirrors/ap/apt-offline 在互联网连接不稳定或完全断开的场景中,Debian 系统的包管理能力往往会大…...

AI原生大数据架构迁移避坑指南(含奇点大会实测的6类典型失败场景、ROI测算模板与12周渐进式演进路线图)

第一章:AI原生大数据架构迁移避坑指南总览 2026奇点智能技术大会(https://ml-summit.org) AI原生大数据架构迁移不是简单的组件替换,而是数据范式、计算语义与工程治理的系统性重构。传统ETL流水线在面对LLM微调数据准备、向量实时索引、多模态特征联合…...

MATLAB下的增程式电动汽车EREV建模详解:从控制逻辑到仿真策略及整车闭环控制实践

MATLAB增程式电动汽车EREV MATLAB建模过程详细讲解和MATLAB模型 亏电到满电的控制逻辑 以及整车模型的闭环控制 特别是针对各个模式下离合器,发动机,电机和电池充放电的控制,在pdf给出了详细的说明 仿真结果清晰明确,纯手工搭建没…...

深信服aES升级后,别忘了检查这些客户端与规则库状态(从3.7.12升级到6.0.2R1实战复盘)

深信服aES 6.0.2R1升级后全维度健康检查指南 从EDR 3.7.12跨越到aES 6.0.2R1的升级过程只是开始,真正的挑战在于确保新系统所有组件无缝衔接。我曾亲历三次不同规模企业的升级项目,发现约40%的问题会在升级后48小时内暴露。这份清单将带您系统排查那些容…...