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

CLion开发STM32(三)DSP库移植

首先DSP库源码可以从官方github下载链接如下https://github.com/ARM-software/CMSIS-DSP笔者所用版本为1.17.0本文以此版本为例。添加DSP库也是通过配置CMakeLists.txt文件进行主要有两种方式1.直接添加源码添加方便但是每次构建都要重新编译一遍DSP库2.编译成静态链接库.a文件再添加需要手动编译才能添加但是不用重复编译构建速度快一、源码添加需要用到DSP库下的这三个文件夹SourceIncludePrivateInclude在CMakeLists文件中将相关修改参考如下# 定义 DSP 根目录地址 set(DSP_ROOT /home/elysia/Software/Embedded_Libs/CMSIS-DSP/1.17.0) # 收集所有 DSP 源文件 file(GLOB_RECURSE DSP_SOURCES ${DSP_ROOT}/Source/*.c ) # Add sources to executable target_sources(${CMAKE_PROJECT_NAME} PRIVATE # Add user sources here ${DSP_SOURCES} ) # Add include paths target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE # Add user defined include paths ${DSP_ROOT}/Include # 头文件路径 ${DSP_ROOT}/PrivateInclude # 私有头文件路径 ) # Add project symbols (macros) target_compile_definitions(${CMAKE_PROJECT_NAME} PRIVATE # Add user defined symbols ARM_MATH_CM7 )但是这个时候直接构建会出现问题主要是两个原因1. 添加.c文件的时候包含了名称类似_arm_mat_mult_neon_buffers.c这样以字符 “ _ ” 开头的模板文件。2. DSP库本身带有聚合文件就是名称类似 BasicMathFunctions.c 这样的以大写字母开头的文件会导致重复编译问题。解决方法就是在target_sources 添加源文件之前添加下面的代码# 排除以下划线开头的模板文件 list(FILTER DSP_SOURCES EXCLUDE REGEX .*/_.*\.c$) # 排除所有大写字母开头的文件聚合文件 list(FILTER DSP_SOURCES EXCLUDE REGEX .*/[A-Z][^/]*\\.c$)修复之后就可以正常编译了相关的完整配置如下# 定义 DSP 根目录地址 set(DSP_ROOT /home/elysia/Software/Embedded_Libs/CMSIS-DSP/1.17.0) # 收集所有 DSP 源文件 file(GLOB_RECURSE DSP_SOURCES ${DSP_ROOT}/Source/*.c ) # 排除以下划线开头的模板文件 list(FILTER DSP_SOURCES EXCLUDE REGEX .*/_.*\.c$) # 排除所有大写字母开头的文件聚合文件 list(FILTER DSP_SOURCES EXCLUDE REGEX .*/[A-Z][^/]*\\.c$) # Add sources to executable target_sources(${CMAKE_PROJECT_NAME} PRIVATE # Add user sources here ${DSP_SOURCES} ) # Add include paths target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE # Add user defined include paths ${DSP_ROOT}/Include # 头文件路径 ${DSP_ROOT}/PrivateInclude # 私有头文件路径 ) # Add project symbols (macros) target_compile_definitions(${CMAKE_PROJECT_NAME} PRIVATE # Add user defined symbols ARM_MATH_CM7 #__FPU_PRESENT1 )二、编译成静态链接库添加手动编译源码需要用到DSP库源码以及CMSIS源码的Core部分链接分别如下https://github.com/ARM-software/CMSIS-DSPhttps://github.com/ARM-software/CMSIS_6此处在Ubuntu系统下以stm32h7为例使用 cubeclt 的 arm-none-eabi 编译器进行编译。如果是在Windows环境下进行编译可以使用cmake-gui进行。cd /home/elysia/Software/Embedded_Libs/CMSIS-DSP/1.17.0/ mkdir -p build/stm32h7 cd build/stm32h7在stm32h7目录下创建文件h7_toolchain.cmake并写入如下内容记得修改 cubeclt 以及 cmsis-core 的路径# --- STM32CubeCLT Toolchain File for STM32H743 (Cortex-M7) --- set(CMAKE_SYSTEM_NAME Generic) set(CMAKE_SYSTEM_PROCESSOR arm) # 1. Set the toolchain prefix for STM32CubeCLT Compiler set(TOOLCHAIN_PREFIX /home/elysia/Software/CubeCLT/GNU-tools-for-STM32/bin/arm-none-eabi-) set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}gcc) set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}g) set(CMAKE_ASM_COMPILER ${TOOLCHAIN_PREFIX}gcc) # 2. Specify CMSIS-Core Include Path set(CMSIS_CORE_INCLUDE_PATH /home/elysia/Software/Embedded_Libs/CMSIS/Core/Include) # 3. Set STM32H743 (Cortex-M7) Compilation Flags set(CPU_FLAGS -mcpucortex-m7 -mfpufpv5-d16 -mfloat-abihard -mthumb -fno-strict-aliasing --specsnosys.specs) # 4. Set DSP-specific Macros (for M7 and DSP support) set(DSP_DEFINES -DARM_MATH_CM7 -DARM_MATH_DSP -D__FPU_PRESENT1) # 5. Enable function and data section separation for optimization set(CMAKE_C_FLAGS ${CPU_FLAGS} -Wall -O3 -I${CMSIS_CORE_INCLUDE_PATH} ${DSP_DEFINES} -ffunction-sections -fdata-sections CACHE INTERNAL ) set(CMAKE_CXX_FLAGS ${CPU_FLAGS} -Wall -O3 -I${CMSIS_CORE_INCLUDE_PATH} ${DSP_DEFINES} -ffunction-sections -fdata-sections CACHE INTERNAL ) # 6. Set the linker flags to enable garbage collection of unused sections set(CMAKE_EXE_LINKER_FLAGS -Wl,--gc-sections) # 7. FPU settings (ensure proper FPU support) set(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} -D__FPU_PRESENT1 -D__FPU_USED1) set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -D__FPU_PRESENT1 -D__FPU_USED1) # 8. Configure the CMake search behavior set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)然后在stm32h7目录下配置编译整体目录结构为/home/elysia/Software/Embedded_Libs/CMSIS-DSP/1.17.0/build/stm32h7/# 清理残留 rm -f CMakeCache.txt rm -rf CMakeFiles/ cmake -G Ninja \ -DCMAKE_TOOLCHAIN_FILE./h7_toolchain.cmake \ -DCMAKE_BUILD_TYPERelease \ -DNEONOFF \ -DHELIUMOFF \ -DAUTOVECTORIZEOFF \ ../.. # 开始编译 ninja编译结果大致如下CMake Warning (dev) in CMakeLists.txt: No project() command is present. The top-level CMakeLists.txt file must contain a literal, direct call to the project() command. Add a line of code such as project(ProjectName) near the top of the file, but after cmake_minimum_required(). CMake is pretending there is a project(Project) command on the first line. This warning is for project developers. Use -Wno-dev to suppress it. CMake Warning (dev) in CMakeLists.txt: cmake_minimum_required() should be called prior to this top-level project() call. Please see the cmake-commands(7) manual for usage documentation of both commands. This warning is for project developers. Use -Wno-dev to suppress it. -- The C compiler identification is GNU 13.3.1 -- The CXX compiler identification is GNU 13.3.1 -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Check for working C compiler: /home/elysia/Software/CubeCLT/GNU-tools-for-STM32/bin/arm-none-eabi-gcc - skipped -- Detecting C compile features -- Detecting C compile features - done -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Check for working CXX compiler: /home/elysia/Software/CubeCLT/GNU-tools-for-STM32/bin/arm-none-eabi-g - skipped -- Detecting CXX compile features -- Detecting CXX compile features - done CMake Warning (dev) in CMakeLists.txt: No cmake_minimum_required command is present. A line of code such as cmake_minimum_required(VERSION 3.28) should be added at the top of the file. The version specified may be lower if you wish to support older CMake versions for this project. For more information run cmake --help-policy CMP0000. This warning is for project developers. Use -Wno-dev to suppress it. -- Configuring done (0.2s) -- Generating done (0.0s) -- Build files have been written to: /home/elysia/Software/Embedded_Libs/CMSIS-DSP/1.17.0/build/stm32h7 [603/603] Linking C static library Source/libCMSISDSP.a没有报错且出现类似 [603/603] Linking C static library Source/libCMSISDSP.a 就没有问题了。完成之后就可以在.../stm32h7/Source/ 下得到 libCMSISDSP.a接下来将.a链接库以及头文件添加到工程即可CMakeLists文件需要修改部分如下# 定义 DSP 根目录地址 set(DSP_ROOT /home/elysia/Software/Embedded_Libs/CMSIS-DSP/1.17.0) # Link directories setup target_link_directories(${CMAKE_PROJECT_NAME} PRIVATE # Add user defined library search paths ${DSP_ROOT}/build/stm32h7/Source ) # Add include paths target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE # Add user defined include paths ${DSP_ROOT}/Include # 头文件路径 ${DSP_ROOT}/PrivateInclude # 私有头文件路径 ) # Add project symbols (macros) target_compile_definitions(${CMAKE_PROJECT_NAME} PRIVATE # Add user defined symbols ARM_MATH_CM7 #__FPU_PRESENT1 ) # Add linked libraries target_link_libraries(${CMAKE_PROJECT_NAME} # Add user defined libraries stm32cubemx CMSISDSP # 链接 libCMSISDSP.a m # 链接数学库 libm.m )使用静态链接库的方式就不需要添加一大堆源码每次构建都进行编译编译速度会快不少。

相关文章:

CLion开发STM32(三)DSP库移植

首先DSP库源码可以从官方github下载,链接如下: https://github.com/ARM-software/CMSIS-DSP 笔者所用版本为1.17.0,本文以此版本为例。 添加DSP库也是通过配置CMakeLists.txt文件进行,主要有两种方式: 1. 直接添加…...

电流镜运放的失配教学,两份文档电路 非常适合新手,基础训练很重要,下载即可直接使用 1

电流镜运放的失配教学,两份文档电路 非常适合新手,基础训练很重要,下载即可直接使用 1,电流镜失配 current mismatch 两种经典的一级电流镜 cascode 电流镜 2,主要以五管OTA运放为例子,怎么用Cadence软件测…...

给你一张清单 10个AI论文工具测评:本科生毕业论文写作必备指南

在当前高校教育日益重视学术规范与写作质量的背景下,本科生毕业论文的撰写正面临前所未有的挑战。从选题构思到文献综述,从结构搭建到语言润色,每一个环节都可能成为学生们的“拦路虎”。与此同时,AI写作工具的兴起为这一难题提供…...

Golang--协程调度

协程 bilibili Goroutine调度模型 早期调度模型 G:goroutine,Go协程,对应数据结构:runtime.gM:machine,工作线程,对应数据结构:runtime.m 在程序地址空间的数据段中有重要的全局…...

Python模拟墨子号量子加密通信

一、前言 本文将从环境搭建、模块拆分、代码实现到测试验证,完整讲解如何基于本源量子云平台实现 BB84 量子密钥分发协议,涵盖本地模拟和真机调用两种模式,代码模块化设计,可直接复用,适合量子计算初学者快速上手。 …...

新能源动力总成台架试验室全面建设规划:动力电池、电机及电力电子件试验室布局与实施方案

新能源动力总成台架试验室能力建设规划,70页PPT 动力电池,电机,电驱动总成,其他控制器等电力电子件试验室建设"搞电池测试?先学会和BMS对话"——这是某次凌晨三点我在试验室改协议解析脚本时顿悟的真理。动力…...

从抱怨访问速率限制到建立完整镜像站,大厂在开源生态扩张中是否正在利用技术霸权扼杀初创项目的生存空间?

## 开源镜像站背后:大厂的技术扩张与初创项目的生存夹缝 最近在技术社区里,经常能看到一些关于开源项目访问速率限制的抱怨。比如某个知名的代码托管平台,突然对未登录用户或者免费账户的API调用次数做了严格限制,导致一些自动化脚…...

纯电动车动态跟随能量管理策略

纯电车动态跟随能量管理策略近年来,纯电动车(BEV)的普及速度越来越快,而如何有效管理车辆的能量使用,成为了提升驾驶体验和延长续航里程的关键问题。在城市道路中,纯电动车常常面临频繁的启停和加速减速的情…...

天心大师也谈浮躁的人工智能,当孟子遇见AI,仁义何在?

有关AI的伦理、价值与未来走向的讨论从未停歇。天心大师,今日也谈及了人工智能发展中所显现的“浮躁”之气,并提出了引人深思的命题:当两千多年前倡导“仁义礼智信”的孟子,遇见了以算法和数据驱动的现代AI,将会碰撞出…...

爆火的“小龙虾“OpenClaw:风口之下,别让便利埋了安全隐患

爆火的"小龙虾"OpenClaw:风口之下,别让便利埋了安全隐患写在开头一、顶流"小龙虾":凭什么刷爆全网?职场办公神器运维得力助手行业深度赋能二、急转直下!官方预警 企业禁令,风险彻底暴…...

基于单片机与矩阵按键的门禁系统Proteus仿真程序:密码验证与电磁锁控制

单片机1602矩阵按键 门禁系统Proteus仿真程序--------------------------------------------| 第1列 第2列 第3列 第4列 ||第1行 0 1 2 3 ||第2行 4 5 6 7 | 初始密码:1234…...

首次全年盈利,同比增长453%!寒武纪2025年报很亮眼

一张图解读版(来源寒武纪官微): 2025年,这家成立九年的智能芯片企业首次实现全年盈利,营收突破64亿元,净利润超过20亿元。这家曾被质疑能否存活的硬科技公司,用实打实的数据证明了自己的价值。 …...

显存暴降92%!哈工大为线性注意力开辟了新道路

2017年,Transformer模型横空出世,在自然语言处理领域掀起了AI革命。此后,视觉领域也迎来了Transformer的浪潮,从图像分类到目标检测,从语义分割到图像生成,注意力机制几乎渗透到了计算机视觉的每一个角落。…...

【LLM进阶-Agent】8. Reflexion Agent 介绍

深度解析 LLM Agent 演进:从 ReAct 到 Reflexion 的“自我反思”之路 在复杂任务场景下,业界早期广泛采用的是 ReAct (Reason Act) 范式。然而,在实际落地中我们常常发现:大模型像是一个固执且健忘的员工。当它陷入幻觉或采取错误…...

风光储并网控制系统的设计与Matlab Simulink仿真建模研究

风光储并网控制系统,Matlab/simulink仿真建模搞风光储并网控制系统仿真的人都知道,Simulink里那堆复杂的模块看着就头大。不过别慌,咱们今天用最糙的实操方式,手把手拆解这个系统。先来张全家福(不是让你真的拍照&…...

OpenClaw玩转有道云笔记

用通俗语言拆解工作逻辑和实操细节(每步校验、避坑提示),全程贴合新手视角,确保原理易懂、操作能直接落地,解决安装、配置、使用中的各类常见问题。 YoudaoNote Skills 是有道云笔记平台官方提供的OpenClaw插件(类似“功能扩展工具”),核心作用是“让 OpenClaw 能直接…...

小程序毕业设计-基于微信小程序的乡村治理数字化平台的设计与实现

基于微信小程序的乡村治理数字化平台的设计与实现技术说明: 用户前端:微信小程序原生框架 管理前端Vue.js 服务端(后端):基于java的Sprinboot框架 数据库:MySQL 功能说明: 小程序端 1.轮播图片 2.乡村资讯乡村快讯春耕播种政策服务预警信息 3.乡村服务-预约户籍办理婚姻登记土地…...

SAM2:使用mask作为提示输入,实现VOS视频分割

8k50o45u_seg目录 1. 引言 2. 使用SAM2实现VOS任务 2.1 数据集 2.2 主要函数 2.3 主要代码 3. 结果展示 1. 引言 本文尝试使用SAM2模型来实现VOS任务。由于在官方的github代码中只找到了point或者box作为提示,但是论文中却说明是可以输入mask作为提示的&#…...

vue+uniapp小程序Python美食菜品点餐订单系统

目录 技术选型与架构设计前端功能模块划分后端API开发关键实现细节测试与部署 项目技术支持可定制开发之功能创新亮点源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作 技术选型与架构设计 前端采用Vue.jsUniapp框架,实现跨平台小…...

Element Plus - 在 el-select 的每个选项右侧添加按钮

在 el-select 的每个选项右侧添加按钮 <el-select v-model"formData.encryptMethod" placeholder"请选择加密方式"><el-option v-for"item in encryptMethods" :key"item.value" :label"item.label" :value"i…...

C++编程法则365天(359)lamba是如何捕获变量

文章目录 一、Lambda捕获的核心前提:Lambda的本质是“匿名仿函数” 二、不同捕获方式的实现细节 1. 值捕获([x] 或 [=]) 2. 引用捕获([&x] 或 [&]) 3. 捕获this指针([this] 或 [=]/[&] 在类中) 4. 隐式捕获([=] 或 [&]) 5. C++14新增:初始化捕获([x…...

线性参变(LPV)+输出反馈鲁棒模型预测控制(OFRMPC)+路径跟踪(PTC)

线性参变(LPV)输出反馈鲁棒模型预测控制(OFRMPC)路径跟踪(PTC)&#xff0c;目前能实现20-25m/s的变速单移线&#xff0c;更多工况可自行调试。 考虑速度和侧偏刚度变化,以及质心侧偏角的鲁棒估计&#xff0c;基于二自由度模型和LMI设计输出反馈鲁棒模型预测控制器。 上层考虑输…...

双极板设计经验

1.气体流通方向在双极板中通常有流场的那一面朝里&#xff0c;双极板有出口和入口&#xff0c;气体通过这些垂直进出板子&#xff0c;然后在流场的沟内平行与板子迅速铺满整个流场&#xff0c;再通过流场的肋流向扩散层。2.出入口设计出口的总面积应略大于入口的总面积&#xf…...

Python基础分享:打印各种三角形和九九乘法表

学习编程时&#xff0c;循环和字符串操作是必须掌握的基础知识。通过打印简单的图形&#xff0c;我们可以直观地理解循环的逻辑、字符串的拼接以及格式化输出。本文将以Python为例&#xff0c;详细介绍如何打印正三角形、倒三角形、等腰三角形以及经典的九九乘法表&#xff0c;…...

深度优先搜索:从全排列到记忆化搜索

深度优先搜索&#xff08;DFS&#xff09;的进化之路&#xff1a;从全排列到记忆化搜索 在算法竞赛中&#xff0c;搜索算法是解决问题的基础。然而&#xff0c;面对不同类型的问题&#xff0c;选用错误的 DFS 模型不仅会导致超时&#xff08;TLE&#xff09;&#xff0c;还容易…...

技术深潜:从向量检索到语义对齐——解析天津市南开区天才群策科技有限责任公司的GEO工程化实践

技术前言&#xff1a;当企业营销遭遇模型黑盒 在CSDN的技术社区里&#xff0c;关于GEO的讨论早已从“是什么”转向了“怎么做”。随着各大AI平台算法的快速迭代&#xff0c;传统的SEO技术栈已全面失效。企业面临的核心矛盾在于&#xff1a;大模型的知识更新是非线性的&#xff…...

D3DCompiler_47.dll未被指定在Windows运行的问题解决办法

在使用电脑系统时经常会出现丢失找不到某些文件的情况&#xff0c;由于很多常用软件都是采用 Microsoft Visual Studio 编写的&#xff0c;所以这类软件的运行需要依赖微软Visual C运行库&#xff0c;比如像 QQ、迅雷、Adobe 软件等等&#xff0c;如果没有安装VC运行库或者安装…...

一文读懂OpenClaw!开源、可自托管的个人Agent平台

OpenClaw 是 2026 年备受关注的开源 AI Agent 平台&#xff0c;它并非普通的聊天 AI&#xff0c;而是 AI 智能 体理论的成熟工程化实践&#xff0c;不仅能聊天&#xff0c;更能帮你执行具体处理任务。想要用好这一工具&#xff0c;首先要厘清其底层的基础逻辑。 OpenClaw基础概…...

vue2和vue3使用less和scss

文章目录Vue 2 中使用 Less 和 SCSS一、安装依赖二、配置 vue.config.js三、在 .vue 文件中使用Vue 3 中使用 Less 和 SCSS一、安装依赖二、配置 vite.config.js三、在 .vue 文件中使用Vue 2和Vue 3使用差异样式穿透less、scss语法1、变量2、运算3、注释4、嵌套5、混入(Mixin)6…...

3.29不见不散

...