基于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

posted @ 2022-07-23 20:05  cau_par  阅读(2621)  评论(0编辑  收藏  举报