更新 linux下stm32开发完整文章 linux下stm32开发gcc版本问题产生如下报错 (注这些报错如果在修改后编译器后仍然出现则使用此方式修改否请向下看)…/…/Drivers/CMSIS/Include/cmsis_gcc.h:833: 错误 number of operands mismatch for ds’…/…/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); }报错错误 no such instruction: wfe 错误 no such instruction: wfi 错误 no such instruction: sev解决方案 修改cmsis_gcc.h#define__WFI()__builtin_arm_wfi()#define__WFE()__builtin_arm_wfe()#define__SEV()__builtin_arm_sev()报错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 -mcpucortex-m3 -mthumb) set(COMMON_FLAGS ${CPU_FLAGS} -masm-syntax-unified -Wa,-mimplicit-itthumb) 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 -specsnano.specs -specsnosys.specs CACHE STRING Linker flags) # 预处理器定义 add_definitions(-DUSE_HAL_DRIVER) add_definitions(-DSTM32F103x6) # 请根据你的芯片型号修改 add_definitions(-D__ARM_ARCH_7M__1) add_definitions(-D__CORTEX_M3)# 设置链接脚本路径 - 使用正确的文件名 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 这三种格式烧录采用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脚本直接烧录 可惜无法调试不过配合终端串口查看其输出也可以openocd-finterface/stlink.cfg-ftarget/stm32f1x.cfg-cprogram path{stm32test} verify reset exit然后就可以成为一个快乐的点灯大师然可能发现stm32cubeMX并没有用到emm其实使用他进行cmake文件和其他配置文件的生成但是发现其生成的cmake需要修改的地方较多上面给出了所以注意里面的时钟配置与SYS DEBUG 设置为Servial Wire 不然烧一次废了 另外他是基于java所以需要一个java环境