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

linux下开发stm32

linux下stm32开发环境搭建

vscode+stm32cubeMX+cmake方式

所需工具链如下:

arm-none-eabi-gcc stlink(ubuntu下为mstlink) make cmake openocd

采用编辑器为

vscode stm32cubeMX

安装命令(ubuntu)

sudo apt install mstflint make cmake openocd

注:arm-none-eabi-gcc请采用链接安装 apt的版本有问题会编译失败

选择linux-x64.tar.gz

测试是否安装成功 如图

st-info --probe 验证stlink

make -v 验证make cmake --version 验证cmake openocd --version 验证openocd

安装arm-gcc

  1. 解压arm-gcc

    tar -xvf xpack-arm-none-eabi-gcc-14.2.1-1.1-linux-x64.tar.gz

  2. 修改环境变量

    使用vim打开家目录下的.bashrc vim ~/.bashrc

    添加 export PATH=$PATH:{此处为你的arm-gcc的路径}xpack-arm-none-eabi-gcc-14.2.1-1.1/bin

    source ~/.bashrc 使配置生效

  3. 测试安装

    arm-none-eabi-gcc --version

gcc版本问题产生如下报错 (注这些报错如果在修改后编译器后仍然出现则使用此方式修改,否请向下看)

  1. …/…/Drivers/CMSIS/Include/cmsis_gcc.h:833: 错误: number of operands mismatch for `ds’
  2. …/…/Drivers/CMSIS/Include/cmsis_gcc.h:823: 错误: no such instruction: `isb sy’

解决方案:
修改cmsis_gcc.h文件

__STATIC_FORCEINLINE void __ISB (void) { // __ASM volatile ("isb sy":::"memory"); __builtin_arm_isb (0xF); } __STATIC_FORCEINLINE void __DSB (void) { // __ASM volatile ("dsb sy":::"memory"); __builtin_arm_dsb (0xF); }
  1. 报错
错误: no such instruction: `wfe' 错误: no such instruction: `wfi' 错误: no such instruction: `sev'
  1. 解决方案 修改cmsis_gcc.h
#define__WFI()__builtin_arm_wfi()#define__WFE()__builtin_arm_wfe()#define__SEV()__builtin_arm_sev()
  1. 报错
no such instruction: `cpsid i'

最终解决方案:

tmd cmake配置的编译器错了

添加cmake

#设置交叉编译器 set(CMAKE_C_COMPILER /home/lkb/tools/xpack-arm-none-eabi-gcc-14.2.1-1.1/bin/arm-none-eabi-gcc) set(CMAKE_CXX_COMPILER /home/lkb/tools/xpack-arm-none-eabi-gcc-14.2.1-1.1/bin/arm-none-eabi-g++) set(CMAKE_ASM_COMPILER /home/lkb/tools/xpack-arm-none-eabi-gcc-14.2.1-1.1/bin/arm-none-eabi-gcc) set(CMAKE_SYSTEM_NAME Generic) set(CMAKE_SYSTEM_PROCESSOR ARM) # Setup compiler settings set(CMAKE_C_STANDARD 11) set(CMAKE_C_STANDARD_REQUIRED ON) set(CMAKE_C_EXTENSIONS ON) # 设置ARM编译选项 set(CPU_FLAGS "-mcpu=cortex-m3 -mthumb") set(COMMON_FLAGS "${CPU_FLAGS} -masm-syntax-unified -Wa,-mimplicit-it=thumb") set(CMAKE_C_FLAGS "${COMMON_FLAGS} -ffunction-sections -fdata-sections -fno-builtin -fno-common -Wall -Wextra -Wpedantic") set(CMAKE_CXX_FLAGS "${COMMON_FLAGS} -fno-rtti -fno-exceptions") set(CMAKE_ASM_FLAGS "${COMMON_FLAGS} -x assembler-with-cpp") # 链接器标志 set(CMAKE_EXE_LINKER_FLAGS "${CPU_FLAGS} -Wl,--gc-sections -specs=nano.specs -specs=nosys.specs" CACHE STRING "Linker flags") # 预处理器定义 add_definitions(-DUSE_HAL_DRIVER) add_definitions(-DSTM32F103x6) # 请根据你的芯片型号修改 add_definitions(-D__ARM_ARCH_7M__=1) add_definitions(-D__CORTEX_M=3)
# 设置链接脚本路径 - 使用正确的文件名 set(LINKER_SCRIPT "${CMAKE_SOURCE_DIR}/STM32F103XX_FLASH.ld") # 这是你的实际文件名 # 检查链接脚本是否存在 if(NOT EXISTS ${LINKER_SCRIPT}) message(FATAL_ERROR "链接脚本不存在: ${LINKER_SCRIPT}") else() message(STATUS "使用链接脚本: ${LINKER_SCRIPT}") endif()

最后是烧录

这个算是里面最简单的也是坑最少的了
首先stlink已经连接并检查到端口,则/dev/tty下是否检测到设备,其次检测是否出现端口占用情况,因为ubunto有点坑会有默认的驱动占用端口 emmm(咱也不敢说。。。)

这些都没有问题则可以选择 使用elf bin hex 这三种格式烧录

  1. 采用elf 这个是最简单也是最常见的 因为相比于hex 与二进制文件 这个烧录的起始地址已经记录在其文件内so并不用我们去指定起始地址
    我们可以采用arm-none-eabi-readelf此指令来检测文件头

看到起始地址为0x08000000注:此为stm32f103的如果是其他系列还需查找,搞错了就唧唧了。
2. 开始烧录 (采用gdb)

# 终端1:启动 OpenOCDopenocd-finterface/stlink.cfg-ftarget/stm32f1x.cfg# 终端2:启动 GDBcd/stm32test/build arm-none-eabi-gdb stm32test# 在 GDB 中输入:(gdb)target remote localhost:3333#3333为openocd的端口resethaltflash write_image erase /home/lkb/stm32test/build/stm32test verify_image /home/lkb/stm32test/build/stm32test reset runexit

上述有点麻烦建议写个shell脚本

  1. 直接烧录 可惜无法调试,不过配合终端串口查看其输出也可以
openocd-finterface/stlink.cfg-ftarget/stm32f1x.cfg-c"program path{stm32test} verify reset exit"

然后就可以成为一个快乐的点灯大师

然可能发现stm32cubeMX并没有用到,emm其实使用他进行cmake文件和其他配置文件的生成,但是发现其生成的cmake需要修改的地方较多(上面给出了),所以注意里面的时钟配置与SYS DEBUG 设置为Servial Wire 不然烧一次废了 另外他是基于java所以需要一个java环境

http://www.jsqmd.com/news/1185793/

相关文章:

  • OnscripterYuri WebAssembly优化技巧:提升浏览器游戏性能的10个方法
  • 3种高效部署策略:Qwen3-32B模型优化与资源效率平衡指南
  • C++实现数据归一化:从原理到高性能工程实践
  • AD7490与PIC18F47Q10构建高性价比数据采集系统
  • Cane高级用法:如何自定义检查规则满足团队特定需求
  • 无纺布行业焊接选哪种超声波设备合适? - 中媒介
  • 豆包AI跑高速视频技术解析:从扩散模型到自动驾驶仿真应用
  • 快速上手Phrase:5分钟学会Android字符串动态格式化
  • XMBOX直播功能详解:支持多种直播源协议的播放器
  • A3910与PIC18LF45K40电机驱动方案解析
  • 【JS知识点总结】关于“解构”
  • XUnity.AutoTranslator:5分钟掌握Unity游戏自动翻译的终极指南
  • 统计学与人工智能:从基础概念到Python实战应用
  • C 语言实战:字符串左旋与旋转判断的高效解法
  • 为什么选择Boogu-Image-0.1-Turbo-8bit:6倍加速的Decoupled-DMD蒸馏原理
  • PyTorch自定义优化器实战:5步手写可生产级Optimizer
  • 生鲜农产品的损耗标准一般怎么规定? - 中媒介
  • 第 6 篇 CNN结构全解——机器视觉的“引擎”拆解
  • [具身智能-592]:# 耳机音量+10%amixer set ‘Headphone‘ 10%+# 麦克风增益-10%amixer set ‘Mic‘ 10%- 找不到这两条命令,怎么回事?
  • 终极指南:如何用llama.cpp快速部署LLaMA-Mesh-Q4_K_M-GGUF模型(附完整命令)
  • 05、Hooks系统完整指南:自动化工作流的终极武器
  • Mind2Web:从数据集到实战,如何用它训练一个真正的Web通才智能体?
  • 越过山丘,迎向开阔 | 百分点科技2026新年寄语
  • Cane并行检查功能深度解析:大型Ruby项目提速指南
  • 手把手教你一步步使用基于HAL库的STM32的蓝牙手机控制以及蓝牙调试器APP的使用
  • BepInEx框架解析:Unity游戏插件开发从入门到实践
  • 你是不是正在把科研数据 “喂” 给 AI——从Claude被禁用事件看数据安全红线
  • 解密DLSS版本管理:用DLSS Swapper解锁游戏性能调优的实战秘籍
  • Calories Burned Predictor与Hugging Face集成:模型发布、版本管理和社区协作的最佳实践
  • PullToBounce核心组件解析:BallView与WaveView动画原理