基于VsCode platformio的stm32开发环境搭建
背景
VsCode作为当下流行的编辑器,且不单单是一个编辑器里面集成了很多插件,使用这些插件可以完成很多功能。
STM32开发环境除了KEIL与IAR,其实还有很多其他的开方方式,ST官方提供了很多的开发软件,基于Eclipse也可以搭建一套,使用VsCode配合其他编译链接工具也可以实现操作,当然还有很多种方式进行开发。
使用VsCode的Platformio的插件,可以直接配置所需的一些底层的编译链接工具,使用的也是arm-gcc,用户可以省去一些操作,同时减少开发可能会遇到一些问题。
同时VsCode配合Platformio也是免费开源的的一套工具,对使用者来说也是一种福音。
开发环境搭建
安装VsCode
在官网下载即可
安装Platformio插件
在VsCode的Extensions搜索添安装PlatformIO IDE即可,PlatformIO依赖于python,需要先安装,同时将python加到环境变量之中。
新建工程
可以选择自己所需的路径,不采用默认的文件存放位置,使用HAL库选择STM32CUBE库即可。
默认文件分布
系统自动生成工程之后,会有一个默认的文件分布,而编译时,只会编译src中的源文件。可以选择将需要编译的文件都移入src之中。
不过这种方式不是很灵活,因此将采用在platformio.ini的配置之中添加所需的编译目录与文件。
编译
新建工程的时候选择了stm32cube这个库,因此我们的工程里面可以不添加hal库的官方代码。
只需添加stm32cube为用户生成的代码,与其他用户自行添加的代码进入编译即可,在链接的时候platformio会自动进行链接。
可以在platformio.ini文件中添加include路径与src的文件
build_flags, include的路径是工程目录,而src_filter的默认路径是src文件夹,此处没有找到合理的依赖。
[env:genericSTM32F103C8]
platform = ststm32
board = genericSTM32F103C8
framework = stm32cube
build_flags =
-I src/Core/Inc
-I src/USB_DEVICE/Target
-I src/USB_DEVICE/App
-I src/Bsp
src_filter =
+<Core/src>
+<USB_DEVICE/Target>
+<USB_DEVICE/App>
+<Bsp>
添加路径之后,直接点击左下角的勾进行build,或者在platformio界面点击Build进行编译
这样显示就可以表示编译成功,不过编译成功并不代表程序可以正常运行,有时因为路径上少了一部分代码,也可以编译成功,不过不能正常工作。
生成hex文件
编译成功后会默认会成bin文件,不会生成hex文件,需要手动添加python脚本来生成hex文件
脚本如下,保存为文件名extra_script.py当然其他文件名也是可以的。
Import("env")
env.AddPostAction(
"$BUILD_DIR/${PROGNAME}.elf",
env.VerboseAction(" ".join([
"$OBJCOPY", "-O", "ihex", "-R", ".eeprom",
"$BUILD_DIR/${PROGNAME}.elf", "$BUILD_DIR/${PROGNAME}.hex"
]), "Building $BUILD_DIR/${PROGNAME}.hex")
)
在platformio.ini文件中添加
extra_scripts = extra_script.py
在编译完成之后会自动调用这个转换脚本,生成hex输出文件
在线调试
在platformio.ini中添加相似的调试器即参数即可,如stlink,然后在debug界面下,开始即可。第一次调试可能需要下载相关的驱动及文件时间会长一些。
debug_tool = stlink
调试小插曲
相同的线路板在调试的时候,使用jlink能用,而使用stlink的时候不能使用
错误提示UNEXPECTED idcode : 0x2ba01477
原因在于应该买到假货stm32
upload的时候可以添加如下参数来达到烧录程序的功能,不过debug还是不行
upload_flags = -c set CPUTAPID 0x2ba01477
需要修改配置文件C:\Users\test.platformio\packages\tool-openocd\scripts\target\stm32f1x.cfg
swj_newdap $_CHIPNAME cpu -irlen 4 -ircapture 0x1 -irmask 0xf -expected-id $_CPUTAPID
========>
swj_newdap $_CHIPNAME cpu -irlen 4 -ircapture 0x1 -irmask 0xf -expected-id $_CPUTAPID -expected-id 0x2ba01477
或者
set _CPUTAPID 0x1ba01477
=======>
set _CPUTAPID 0x2ba01477 || set _CPUTAPID 0
设置0的时候就不会判断expected id,用于兼容不同的芯片,继续进行调试
总结
platformio基本在开发stm32的时够用,且是开源免费的,对开发者来说是一个不错的选择。
参考
https://blog.csdn.net/nick_young_qu/article/details/108217987
https://community.platformio.org/t/debugging-of-stm32f103-clone-bluepill-board-wrong-idcode/14635
https://blog.csdn.net/chang_jiang123/article/details/106215699