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

别再为arm_sin_f32报错发愁了!STM32F103C8T6在CLion里调用DSP库的完整CMake配置流程

别再为arm_sin_f32报错发愁了STM32F103C8T6在CLion里调用DSP库的完整CMake配置流程如果你正在从Keil/MDK转向CLion开发STM32并且尝试集成ARM的DSP库时遇到了undefined reference to arm_sin_f32这类恼人的链接错误那么这篇文章就是为你准备的。作为一个曾经在这个问题上挣扎了整整两天的开发者我完全理解这种挫败感——明明CubeMX已经配置了DSP库代码提示也正常但就是无法通过编译。本文将从一个真实的调试案例出发深入解析CMake配置中的每一个关键细节帮助你彻底解决这个问题。1. 问题根源与解决方案概览这个问题的本质在于链接器无法找到DSP库中数学函数的实现。虽然CubeMX会帮我们下载DSP库文件并设置基本路径但CLion项目还需要一些额外配置才能正确链接。以下是导致问题的几个关键因素核心宏定义缺失DSP库需要ARM_MATH_CMx宏来指定芯片内核版本库文件路径问题CubeMX生成的库文件路径可能需要手动调整链接顺序错误数学库需要在特定位置链接才能生效让我们先看一个最基本的解决方案框架适用于STM32F103C8T6Cortex-M3内核# DSP库配置 add_definitions(-DARM_MATH_CM3 -DARM_MATH_MATRIX_CHECK -DARM_MATH_ROUNDING) include_directories(${CMAKE_SOURCE_DIR}/Middlewares/ST/ARM/DSP/Inc) link_directories(${CMAKE_SOURCE_DIR}/Middlewares/ST/ARM/DSP/Lib/GCC) link_libraries(arm_cortexM3l_math)这个配置看起来简单但每个参数背后都有其特定作用。接下来我们将深入分析每个配置项的含义和常见陷阱。2. 详细配置解析2.1 宏定义配置add_definitions中的宏定义是DSP库正常工作的基础。对于不同的Cortex-M内核需要使用不同的宏宏定义适用内核典型芯片型号ARM_MATH_CM0Cortex-M0STM32F030ARM_MATH_CM0PLUSCortex-M0STM32L010ARM_MATH_CM3Cortex-M3STM32F103ARM_MATH_CM4Cortex-M4STM32F407ARM_MATH_CM7Cortex-M7STM32H743对于我们的STM32F103C8T6必须使用ARM_MATH_CM3。另外两个可选宏ARM_MATH_MATRIX_CHECK启用矩阵运算的边界检查ARM_MATH_ROUNDING启用浮点舍入模式支持2.2 包含路径设置include_directories需要指向DSP库的头文件位置。这里有几个常见问题路径格式建议使用${CMAKE_SOURCE_DIR}绝对路径避免相对路径问题多层包含DSP库头文件可能需要额外包含CMSIS核心头文件CubeMX版本差异不同版本CubeMX生成的路径可能略有不同一个更健壮的配置可能如下include_directories( ${CMAKE_SOURCE_DIR}/Middlewares/ST/ARM/DSP/Inc ${CMAKE_SOURCE_DIR}/Drivers/CMSIS/Include )2.3 库文件链接这是最容易出错的部分。关键点包括库文件命名不同编译工具链使用不同命名约定GCC/CLion:libarm_cortexM3l_math.a或arm_cortexM3l_mathKeil:arm_cortexM3l_math.lib路径设置CubeMX默认可能不会生成GCC版本的库文件链接顺序数学库应该在所有用户代码之后链接一个完整的链接配置示例# 设置库文件搜索路径 link_directories(${CMAKE_SOURCE_DIR}/Middlewares/ST/ARM/DSP/Lib/GCC) # 在add_executable之后链接数学库 target_link_libraries(${PROJECT_NAME}.elf PRIVATE arm_cortexM3l_math)3. 完整CMakeLists.txt示例下面是一个针对STM32F103C8T6的完整CMake配置示例包含了DSP库支持cmake_minimum_required(VERSION 3.20) project(STM32F103_DSP_Example C CXX ASM) # 基本工具链配置 set(CMAKE_C_COMPILER arm-none-eabi-gcc) set(CMAKE_CXX_COMPILER arm-none-eabi-g) set(CMAKE_ASM_COMPILER arm-none-eabi-gcc) set(CMAKE_EXE_LINKER_FLAGS --specsnosys.specs -Wl,--gc-sections -static) # MCU特定配置 add_definitions( -DSTM32F103xB -DARM_MATH_CM3 -DARM_MATH_MATRIX_CHECK -DUSE_HAL_DRIVER ) # 包含路径 include_directories( Core/Inc Drivers/STM32F1xx_HAL_Driver/Inc Drivers/STM32F1xx_HAL_Driver/Inc/Legacy Drivers/CMSIS/Device/ST/STM32F1xx/Include Drivers/CMSIS/Include Middlewares/ST/ARM/DSP/Inc ) # 源文件 file(GLOB_RECURSE SOURCES startup/*.* Drivers/*.* Core/*.*) # 可执行文件 add_executable(${PROJECT_NAME}.elf ${SOURCES}) # 链接数学库 target_link_libraries(${PROJECT_NAME}.elf PRIVATE arm_cortexM3l_math)4. 常见问题排查即使按照上述步骤配置仍然可能遇到各种问题。以下是一些常见错误及其解决方案4.1 库文件找不到错误信息cannot find -larm_cortexM3l_math解决方案确认Middlewares/ST/ARM/DSP/Lib/GCC目录存在检查库文件名是否正确注意大小写如果使用非GCC工具链需要相应版本的库文件4.2 多重定义错误错误信息multiple definition of arm_sin_f32这通常是因为重复链接了数学库在多个地方定义了DSP函数检查你的CMake配置确保数学库只链接一次。4.3 浮点支持问题如果使用浮点运算还需要确保启用了硬件浮点单元如果芯片支持添加了-mfloat-abihard或-mfloat-abisoftfp编译选项链接了适当的浮点库对于STM32F103这类没有硬件FPU的芯片应使用软件浮点实现add_definitions(-mfloat-abisoft)5. DSP库功能测试配置完成后可以通过简单的测试代码验证DSP库是否正常工作#include arm_math.h void test_dsp_functions() { float32_t angle 3.1415926f / 6.0f; // 30度 float32_t sin_val, cos_val; // 计算正弦值 arm_sin_f32(angle, sin_val); // 计算余弦值 arm_cos_f32(angle, cos_val); // 打印结果 printf(sin(30°): %.4f, cos(30°): %.4f\r\n, sin_val, cos_val); // 向量点积示例 float32_t vec1[3] {1.0f, 2.0f, 3.0f}; float32_t vec2[3] {4.0f, 5.0f, 6.0f}; float32_t dot_result; arm_dot_prod_f32(vec1, vec2, 3, dot_result); printf(Dot product: %.2f\r\n, dot_result); }如果这些函数都能正常执行并输出正确结果说明DSP库已经正确配置。

相关文章:

别再为arm_sin_f32报错发愁了!STM32F103C8T6在CLion里调用DSP库的完整CMake配置流程

别再为arm_sin_f32报错发愁了!STM32F103C8T6在CLion里调用DSP库的完整CMake配置流程 如果你正在从Keil/MDK转向CLion开发STM32,并且尝试集成ARM的DSP库时遇到了undefined reference to arm_sin_f32这类恼人的链接错误,那么这篇文章就是为你准…...

月饼机排名:企业选购选型关键策略深度解析

月饼机排名与企业选购选型全攻略:高频疑问解答,选对设备少走弯路"月饼机排名≠选购唯一标准,企业选型更需结合生产需求与设备适配性" 很多企业在选购月饼机时,容易陷入排名误区,忽略实际生产场景的匹配&…...

别再死记硬背算法了!用Visualgo可视化网站,5分钟搞懂冒泡排序到快速排序

别再死记硬背算法了!用Visualgo可视化网站,5分钟搞懂冒泡排序到快速排序 第一次接触排序算法时,你是否也被那些抽象的伪代码和数学推导弄得晕头转向?当书本上的文字描述和静态图示无法让你真正理解算法如何运作时,Visu…...

从物理约束到AI加速:NVIDIA PhysicsNeMo如何重塑科学计算范式

从物理约束到AI加速:NVIDIA PhysicsNeMo如何重塑科学计算范式 【免费下载链接】modulus Open-source deep-learning framework for building, training, and fine-tuning deep learning models using state-of-the-art Physics-ML methods 项目地址: https://gitc…...

RH850 中断处理详解

Exception Cause List 下面是所有支持的exception类型,其中FENMI FEINT EIINT被称为中断:下面是每种exception类型的详细解释:两种中断地址处理方式 通过寄存器进行设置: 当RBASE.RINT 或 EBASE.RINT 1时,必然采用直…...

PlantDoc:用计算机视觉解决植物病害检测的挑战

PlantDoc:用计算机视觉解决植物病害检测的挑战 【免费下载链接】PlantDoc-Dataset Dataset used in "PlantDoc: A Dataset for Visual Plant Disease Detection" accepted in CODS-COMAD 2020 项目地址: https://gitcode.com/gh_mirrors/pl/PlantDoc-Da…...

Windows 10 也能畅享安卓生态:三步快速部署 Android 子系统

Windows 10 也能畅享安卓生态:三步快速部署 Android 子系统 【免费下载链接】WSA-Windows-10 This is a backport of Windows Subsystem for Android to Windows 10. 项目地址: https://gitcode.com/gh_mirrors/ws/WSA-Windows-10 还在羡慕 Windows 11 用户…...

告别Qt冲突!在正点原子IMX6ULL上纯净运行LVGL v8.2的完整避坑指南

告别Qt冲突!在正点原子IMX6ULL上纯净运行LVGL v8.2的完整避坑指南 当你在正点原子IMX6ULL开发板上尝试运行LVGL时,是否遇到过这样的场景:精心移植的界面刚启动,就被系统自带的Qt桌面强行抢占显示资源?或是触摸操作完全…...

企业级LLM评测框架架构设计:DeepEval的5大核心优势与实战部署方案

企业级LLM评测框架架构设计:DeepEval的5大核心优势与实战部署方案 【免费下载链接】deepeval The LLM Evaluation Framework 项目地址: https://gitcode.com/GitHub_Trending/de/deepeval 在当今AI应用快速发展的时代,大语言模型的质量评估已成为…...

别再死记硬背了!用STM32CubeMX实战配置GPIO的推挽、开漏、上拉、下拉

STM32CubeMX实战:GPIO模式配置全解析与项目应用 第一次接触STM32的GPIO配置时,我被各种专业术语搞得晕头转向——推挽输出、开漏输出、上拉输入、下拉输入...这些概念在数据手册上冷冰冰地排列着,直到我真正用STM32CubeMX动手配置了一个LED闪…...

你的Windows优化助手:Winhance中文版完全指南

你的Windows优化助手:Winhance中文版完全指南 【免费下载链接】Winhance-zh_CN A Chinese version of Winhance. C# application designed to optimize and customize your Windows experience. 项目地址: https://gitcode.com/gh_mirrors/wi/Winhance-zh_CN …...

别扔!2012款Mac Mini升级Monterey保姆级教程(附OpenCore EFI配置与避坑指南)

2012款Mac Mini升级Monterey全流程实战:从废旧设备到高效工作站的蜕变 每次打开那台积灰的2012款Mac Mini,总有种面对老朋友的亲切感。这款曾经风靡一时的小巧主机,如今虽已无法流畅运行最新系统,但它的金属机身和扎实做工依然透露…...

PoeCharm:中文BD计算器与流放之路角色构建优化方案

PoeCharm:中文BD计算器与流放之路角色构建优化方案 【免费下载链接】PoeCharm Path of Building Chinese version 项目地址: https://gitcode.com/gh_mirrors/po/PoeCharm PoeCharm作为Path of Building的中文本地化版本,为流放之路玩家提供了专业…...

PL111 RGB LCD时序配置详解

PL111 RGB LCD 时序说明 1)文档范围 本文从两个维度整理 PL111 时序: 通俗理解(面向调试与沟通)硬件寄存器映射(面向实现与定位问题) 内容与 bsp/qemu-vexpress-a9/drivers/drv_clcd.c 的实现保持一致。2&a…...

从C++20实验性协程到C++27标准落地:某核电DCS系统3年演进路径(217万行代码迁移策略、性能基线对比、FMEA失效模式分析表)

更多请点击: https://intelliparadigm.com 第一章:C27协程标准化工业应用的里程碑意义 C27 将首次将协程(coroutines)从技术规范(TS)正式纳入核心语言标准,标志着其从实验性特性迈向高可靠性、…...

群晖NAS USB 2.5G/5G/10G网卡驱动安装完整教程:突破千兆网络限制

群晖NAS USB 2.5G/5G/10G网卡驱动安装完整教程:突破千兆网络限制 【免费下载链接】r8152 Synology DSM driver for Realtek RTL8152/RTL8153/RTL8156 based adapters 项目地址: https://gitcode.com/gh_mirrors/r8/r8152 还在为群晖NAS的千兆网口速度瓶颈而烦…...

如何免费获取IBM Plex企业级字体:完整指南与实用技巧

如何免费获取IBM Plex企业级字体:完整指南与实用技巧 【免费下载链接】plex The package of IBM’s typeface, IBM Plex. 项目地址: https://gitcode.com/gh_mirrors/pl/plex 在当今数字化时代,字体选择直接影响产品的专业形象和用户体验。IBM Pl…...

douyin-downloader架构深度解析:应对抖音内容采集的3个高效技术方案

douyin-downloader架构深度解析:应对抖音内容采集的3个高效技术方案 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser f…...

MATLAB机器人工具箱rvctools保姆级安装与避坑指南(附常见报错解决)

MATLAB机器人工具箱rvctools从安装到实战:机械臂运动学全流程解析 第一次打开MATLAB准备用rvctools做机械臂仿真时,我盯着报错信息发了半小时呆——路径设置、版本兼容、脚本报错这些坑,教程里从来不会详细告诉你。作为Peter Corke教授开发的…...

Ultimate ASI Loader终极指南:5分钟掌握游戏模组安装的完整解决方案

Ultimate ASI Loader终极指南:5分钟掌握游戏模组安装的完整解决方案 【免费下载链接】Ultimate-ASI-Loader The Ultimate ASI Loader is a proxy DLL that loads custom .asi libraries into any game process. 项目地址: https://gitcode.com/gh_mirrors/ul/Ulti…...

AI教材写作必备:低查重AI工具,一键生成10万字专业教材!

教材编写中的 AI 工具助力 教材编写中的格式问题总是让许多作者头疼。比如,标题应该用多大字体?引用文献要按 GB/T7714 格式,还是其他特定标准?习题的排版选择单栏还是双栏?各种各样的要求让人眼花缭乱,手…...

Sentaurus TCAD准静态分析参数详解:从Increment到Goal,手把手教你读懂那段‘天书’代码

Sentaurus TCAD准静态分析参数实战指南:从代码解析到调参技巧 第一次打开Sentaurus TCAD的仿真脚本时,那些密密麻麻的参数就像电路板上的焊点——看似杂乱无章却各有其存在的意义。特别是Quasistationary块中的那些数值,它们不是随意填写的魔…...

微信聊天记录永久保存指南:用WeChatMsg打造你的数字记忆银行

微信聊天记录永久保存指南:用WeChatMsg打造你的数字记忆银行 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we…...

FAQ DockerCompose启动顺序与健康检查

Skeyevss FAQ:Docker Compose 启动顺序与健康检查 试用安装包下载 | SMS | 在线演示 项目地址:https://github.com/openskeye/go-vss 1. 问题现象 docker compose up 后部分容器反复重启;业务日志报数据库连接失败、etcd 未就绪&#xff1…...

基于Servlet架构的超市进销存管理系统源码(含前后端+SQL脚本+远程调试)

温馨提示:文末有联系方式一、配套清单 1. 全套可编译源码:包含JSP前端页面、Servlet后端逻辑代码及MySQL建表与初始化SQL脚本; 2. 专属远程调试支持:工程师一对一协助配置环境、解决依赖冲突,确保项目在您本地电脑顺利…...

【仅限首批内测开发者】:PHP 9.0 RC3中尚未文档化的async/await语法陷阱——AI聊天机器人token流中断的真实根源曝光

更多请点击: https://intelliparadigm.com 第一章:PHP 9.0 异步编程与 AI 聊天机器人 避坑指南 PHP 9.0 尚未正式发布,但其 RFC 提案已明确将协程(Coroutines)和原生异步 I/O 作为核心特性引入,取代传统基…...

Android位置伪装完整指南:7个实用场景教会你安全使用虚拟定位

Android位置伪装完整指南:7个实用场景教会你安全使用虚拟定位 【免费下载链接】FakeLocation Xposed module to mock locations per app. 项目地址: https://gitcode.com/gh_mirrors/fak/FakeLocation 你是否曾经想过,为什么某些应用总是知道你在…...

DJI DroneID信号深度解析与逆向工程实现指南

DJI DroneID信号深度解析与逆向工程实现指南 【免费下载链接】dji_droneid 项目地址: https://gitcode.com/gh_mirrors/dj/dji_droneid 本文深入探讨DJI DroneID无人机身份识别信号的完整解析流程,从射频信号采集到协议数据提取,提供一套完整的技…...

喜马拉雅音频批量下载:如何安全高效地构建个人离线资源库?

喜马拉雅音频批量下载:如何安全高效地构建个人离线资源库? 【免费下载链接】xmly-downloader-qt5 喜马拉雅FM专辑下载器. 支持VIP与付费专辑. 使用GoQt5编写(Not Qt Binding). 项目地址: https://gitcode.com/gh_mirrors/xm/xmly-downloader-qt5 …...

【补充内外网突然不通的情况】

⚠️ 锁屏后网络不通怎么办? 问题现象 锁屏后再解锁,外网或内网突然不通ping 8.8.8.8 通但 ping www.baidu.com 不通 → DNS 问题内网 IP 突然访问不了 → 路由丢失 快速修复 # 修复 DNS sudo networksetup -setdnsservers Wi-Fi 223.5.5.5 8.8.8.8# 修复…...