背景
VsCode作为当下流行的编辑器,且不单单是一个编辑器里面集成了很多插件,使用这些插件可以完成很多功能。
STM32开发环境除了KEIL与IAR,其实还有很多其他的开方方式,ST官方提供了很多的开发软件,基于Eclipse也可以搭建一套,使用VsCode配合其他编译链接工具也可以实现操作,当然还有很多种方式进行开发。
使用VsCode的Platformio的插件,可以直接配置所需的一些底层的编译链接工具,使用的也是arm-gcc,用户可以省去一些操作,同时减少开发可能会遇到一些问题。
同时VsCode配合Platformio也是免费开源的的一套工具,对使用者来说也是一种福音。
开发环境搭建
安装VsCode
在官网下载即可
在VsCode的Extensions搜索添安装PlatformIO IDE即可,PlatformIO依赖于python,需要先安装,同时将python加到环境变量之中。
安装 Python 解释器
PlatformIO Core (CLI) 是用 Python 编写的,它 默认安装在除 Windows 之外的所有常用操作系统上。
请导航到官方网站并下载最新的 Python 并安装它。请阅读下面的注释。
对于Linux的:
大多数 linux 发行版已经包含 Python 安装。您可能需要确保已安装 Python 虚拟环境。
Debian/Ubuntu 衍生产品在 Apt 中将此软件包作为 .python-venv
sudo apt install python3-venv
应该就足够了。
(其实导入工程文件夹的时候,工程自动会引导安装PlatformIO的相关依赖,提示点击安装,跳转网页复制sudo apt install python3.8-venv
指令就好到终端回车,即可自动安装)
必要时换源,服务器根据服务器到你的位置而定
这里用阿里云,滑动找到清华云“http://mirrors.tuna.tsinghua.edu.cn/ubuntu”的服务器
macOS 的:
请阅读安装过程中显示的“重要信息”以获取信息 关于 SSL/TLS 证书验证和运行 “Install Certificates.command”。
如果您不安装 SSL/TLS 证书,PlatformIO 将无法下载 依赖的包、库和工具链。
Windows系统:
请选择(见下文),否则,命令将 不可用。Add Python to Path
python
在下载python完成之后安装时候,选择Install Now,
一定要勾选Add_Python to PATH
,防止手工添加环境变量,正常情况下会有以下两个环境变量:
安装好python后需要验证一下安装是否正常,安装完成后在终端中使用命令行
快捷键 Windows+R 输入 poworshell进入指令页面
先后输入两个指令
python --version
pip --version
会得到如下信息证明Python安装成功
这一步就折腾了我一整天,起初是用的清华pip源,结果一直报错,排查了全部流程,然后发现换了个阿里pip源之后一切问题都解决了
在C:\Users\(这个文件夹名是用户名)\pip的目录下,用文本工具新建pip.ini
例如:我是在C:\Users\Administrator\pip目录下,新建了pip.ini
如果用户名目录无效,改到appdata目录
在pip.ini内填入
[global]
# 超时时间,可自行调整
timeout = 6000
# 源地址
index-url = http://mirrors.aliyun.com/pypi/simple/
# 添加源主机为可信主机,要不然可能报错
trusted-host = mirrors.aliyun.com
国内常用pip源如下:
(1)阿里云 http://mirrors.aliyun.com/pypi/simple/
(2)豆瓣http://pypi.douban.com/simple/
(3)清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/
(4)中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple/
(5)华中科技大学http://pypi.hustunique.com/
查看配置是否成功
pip config list
这一步也很关键,更新pip为最新版
pip install --upgrade pip
如果报错,则按照提示
pip install --user --upgrade pip
安装Platformio插件
VSCode配置
打开vscode按照下图安装platformio
安装后可以看到下面会有个进度条开始安装不同的插件,忽然到某一个瞬间,进度条就会停在下图的位置不动,这是可以打开控制台来查看报错信息。来确定问题。
在菜单点击”help“->"Toggle Developper Tools"菜单,选择”console“标签。
这是你会发现这个部分显示了很多信息,有错误有警告,不要担心,我们一点点看。这个其实是个自动安装的过程
如果这个过程太漫长而且没有任何变化,好像又没有报错,你可以打开下面的这个文件夹。你可以看到这里慢慢的在增加文件数量。看到下面这样了 基本就是安装ok的
最终,在磨砺的驱使下,安装成功
安装成功后,vscode会提示你重启~ 重启后就会像下面这样有一个小蚂蚁。
新建工程
可以选择自己所需的路径,不采用默认的文件存放位置,使用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的时够用,且是开源免费的,对开发者来说是一个不错的选择。