linux下开发stm32

📅 2026/7/14 7:52:53 👁️ 阅读次数 📝 编程学习
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环境