文章目录
- Linux环境下STM32开发
- 1前言
- 2环境搭建
- 3点灯:
- 脚本方式
- 命令行操作方式具体见参考2
- vscode将以上命令集成起来
- 4总结
Linux环境下STM32开发
1前言
最近在使用Keil开发STM32的时候总感觉代码写起来很很费劲,然后打算用vscode试试,刚开始用的是KeilAssitance这个插件,本质还是使用Keil进行配置,vscode写代码,体验了一下感觉还是不方便。后来想到了Linux,毕竟在写代码这方面,Linux的体验还是非常棒的。综合考虑加查资料,最终决定使用Linux+vscode+STM32CubeMX+gnu-arm编译工具+openocd烧录工具的方式进行stm32的开发。
下面这一段对我启发很大,转自知乎:
工具链一般用gcc-arm-none-eabi,可以用包管理装,也可以到arm官网下,也可以自己编译,毕竟gnu源有这个配置。如果keil自带的armcc就比较缺乏调试工具。纯用命令行的话,cubemx可以生成makefile工程,改下编译器路径就能make,会生成bin文件。
用IDE的话,可以用eclipse,参考wiced sdk。可以用vscode,体验要优于sublime。网上搜搜怎么配环境,主要就是设置工具链的目录。烧录程序,如果烧的是bin的话需要一个烧录程序。用jlink的话可以用segger官网下的jlinkexe工具。用stlink的话可以用github上的stutils什么的。用cmsis-dap或者ft2232的话就只能配openocd了。如果想直接烧elf,那么就要先搭好gdb server或者jtag bridge之类的东西,比方说jlink的就是jlinkgdbserver,然后xxxx-gdb连上,用load命令下载。keil的axf没研究过怎么用。
调试的话可以用IDE,关键还是先搭好gdb server然后让IDE里的gdb连上它。剩下的体验就跟调自家程序那样了,只是这些IDE没有像keil那样的看外设寄存器之类的功能了。
2环境搭建
- 安装ubuntu虚拟机,用vmware即可,教程自行搜索。硬盘最好分配30G以上。系统装好以后需要安装一些必要的软件
sudo apt-get update\
sudo apt-get upgrade\
sudo apt install gcc git vim -y
-
安装vscode Linux版,安装过程自行搜索。
-
安装STM32CubeMX Linux版,安装过程自行搜索。
-
安装
gcc-arm-none-eabi
编译工具,当执行CubeMX生成的makefile时会调用该工具。sudo apt install gcc-arm-none-eabi
-
安装
openocd
,openocd是一个开源的烧录工具
3点灯:
- 生成代码框架
使用STM32CubeMX生成点灯程序的代码框架及初始化代码。具体可以参考网上的教程
注意-要选择生成Makefile的工程文件。
- 完善代码
把初始化代码加每隔1S反转一次LED代码。
这里还有vscode会有红色波浪线的错误提示,虽然也能正常编译,作为强迫症这是绝对不能忍的
解决方法:
在c_cpp_properties.json中加入圈起来的这段代码,重启vscode即可。也可以在C/C++的插件里设置,具体参考网上教程
- 编译
通过安装的gcc-arm-none-eabi编译工具链编译。
在新建的工程里使用make命令编译工程文件,编译后在build文件夹下会生成工程名.elf
,工程名.hex
,工程名.bin
文件。
当后期项目文件中增添了新文件,可以通过修改makefile文件的方式重新构建编译规则。
一文搞懂Makefile
- 烧录
硬件使用野火DAP仿真器,CMSIS标准接口。软件使用openocd
。
openocd介绍:
OpenOCD是一种开放式片上调试器,可为嵌入式设备提供编程,调试和边界扫描测试。OpenOCD作为服务器,并通过端口3333接受来自GDB的传入连接或通过端口4444接受来自telnet的传入连接。GDB用于源文件步骤调试。telnet连接用于刷新。OpenOCD连接到 DAPLINK仿真器。DAPLINK适配器连接到目标。参考如下
https://zhuanlan.zhihu.com/p/41517198
下载openocd
:sudo apt install openocd
使用方式:
1通过openocd命令行
2把命令封装成shell脚本运行
3将命令集成到vscode的配置文件中
三种方式的本质都是一样的,这里主要使用shell脚本的方式
脚本方式
在gitee下载一个被人写好的脚本,直接运行脚本即可。
git clone https://gitee.com/delbertzopenocd-toolbox.git
下载完切换到该文件夹下
cd openocd-toolbox/sricpts/linux/stm32f4x # 后面这个根据自己的stm32型号选择
脚本文件如下:
连接好开发板和仿真器后,运行attach.sh,openocd通过端口连接DAP仿真器如下:
在vscode中 ctrl+ ` 调出终端,运行命令
program hex文件所在的路径
程序开始烧录
- telnet localhost 4444 通过telnet连接openocd,DAP仿真器灯变红表示开始工作
- program /home/lps/stm32/test01/build/test01.hex 烧录hex文件
- reset 复位STM32
- exit 关闭连接
命令行操作方式具体见参考2
通过运行<scripts>带参脚本命令运行Server,通用格式为
-f <interface> -f <target>
<interface>仿真器配置: 代表你的仿真器类型,DAPLINK就是interface/cmsis-dap.cfg
<target>目标板配置: 代表你的烧录的单片机类型,如STM32F407就是target/stm32f4x.cfg
支持的烧录器在/usr/share/openocd/scripts/interface
支持的芯片在/usr/share/openocd/scripts/target
如下:
首先连接板子执行命令
openocd -f interface/cmsis-dap.cfg -f target/stm32f4x.cfg
通过以上命令openocd打开4444端口
打开vscode ctrl + `打开终端,接下来的操作和脚本的方式一样了,参考上面脚本的方式。
vscode将以上命令集成起来
vscode通过tasks.json
这个配置文件的形式,提供了类似shell脚本的方式执行自动任务。具体参考:
https://code.visualstudio.com/Docs/editor/tasks
在.vscode文件夹下新建tasks.json文件内容如下:
{
"version": "2.0.0",
"tasks": [
{
"label": "build",
"type": "shell",
"command": "make",
"args": [
"/home/linuz/em/stm32/Projects/HAL/HAL_LED/Makefile"//makefile路径
],
"group": {
"kind": "build"
//"isDefault": true 配置为默认任务
},
"problemMatcher": []
},
{
"label": "download",
"type": "shell",
"command": "openocd",
"args": [
"-f",
"/usr/share/openocd/scripts/interface/cmsis-dap.cfg",
"-f",
"/usr/share/openocd/scripts/target/stm32f4x.cfg",
"-c",
"program /home/linuz/em/stm32/Projects/HAL/HAL_LED/build/HAL_LED.elf verify reset exit"
],
"group": "build",
"problemMatcher": []
}
]
}
具体内容根据自己的路径设置即可
以上文件就是对之前用命令行的方式进行封装,只需要ctrl+shift+b
即可快速执行一个任务,非常方便。
4总结
整个过程收获很大,对vscode的使用更明白了一些,同时对嵌入式开发的过程理解的更通透了。以上是我各种搜索查资料总结出来的,对配置过程有疑问的小伙伴欢迎留言讨论。
参考:
- 1 https://blog.csdn.net/u010000843/article/details/114531922
- 2 openocd命令操作
- 3 vscode 有关task.json的文档