PlatformIO + CubeMX开发STM32时的几个小坑

源文件路径问题

CubeMX生成的代码和库文件都在Core/SrcCore/Inc下面而非默认的src目录下,所以编译时会找不到代码文件(main.c, etc.):

.pio\build\genericSTM32F103C8\libFrameworkCMSISDevice.a(startup_stm32f103xb.o): In function LoopFillZerobss': (.text.Reset_Handler+0x2e): undefined reference to main' collect2.exe: error: ld returned 1 exit status *** [.pio\build\genericSTM32F103C8\firmware.elf] Error 1

因此需要在ini文件里手动指定代码目录。一种办法是:

[platformio]
src_dir = Core/Src
[env:genericSTM32F103C8]
platform = ststm32
board = genericSTM32F103C8
framework = stm32cube
upload_protocol = stlink
debug_tool = stlink
build_flags = -ICore/Inc

注意这个字段的层级,不要写在env下面。不写src_dir而有env下面指定build_src_filter = +<Core/Src/>是没有用的,官方文档明确说了filter这个参数是在src_dir下搜索文件。

STLink的驱动问题

CubeIDE下直接用STLink理论上应该是没问题的,但是PIO使用OpenOCD调试,CubeMX之前装的驱动把 ST-Link 绑定成ST-Link USB Driver(ST 官方)是无法识别的。于是:

hla_swd Error: libusb_open() failed with LIBUSB_ERROR_NOT_SUPPORTED 
Error: open failed in procedure 'program' 
** OpenOCD init failed **

GPT告诉我,它的意思是OpenOCD 通过 libusb 打开 ST-Link,但 Windows 当前给这个 USB 设备绑定的驱动 不支持 libusb。用zadig替换成WinUSB驱动即可。之后如果要用默认驱动再用zadig换回来即可。

国产STM32F103芯片的STLink下载问题

OpenOCD报错:CPU ID不符,它觉得这块板子不是真的F103C8T6。

hla_swd
Warn : UNEXPECTED idcode: 0x2ba01477
Error: expected 1 of 1: 0x1ba01477
in procedure 'program'
** OpenOCD init failed **

在ini配置文件里加一句

upload_flags =
  -c set CPUTAPID 0x2ba01477

暂时性地解决了这一问题。

USB串口的库文件问题

CubeMX里把USB设成串口,生成代码后,需要把USB_DEVICE/App 目录加到编译器的 include 路径里
改完是这个样子

[platformio]
src_dir = ./

[env:genericSTM32F103C8]
platform = ststm32
board = genericSTM32F103C8
framework = stm32cube
upload_protocol = stlink
debug_tool = stlink
build_src_filter =
  +<Core/Src/>
  +<USB_DEVICE/App/>
  +<USB_DEVICE/Target/>

build_flags =
  -ICore/Inc
  -IUSB_DEVICE/App
  -IUSB_DEVICE/Target

upload_flags =
  -c set CPUTAPID 0x2ba01477
posted @ 2026-01-16 13:11  不学习的小锴  阅读(6)  评论(0)    收藏  举报