使⽤vscode+gcc进⾏STM32单⽚机开发(⼀)编译及调试
简介
众所周知,MCU的开发通常是使⽤keil来进⾏的,但是keil作为⼀款有⼏⼗年历史的IDE,bug层出不穷,界⾯也越来越丑,加上使⽤盗版jlink,导致keil各种崩溃卡死。
故越来越多的单⽚机IDE也如⾬后春笋般冒出,例如 st官⽅出版的st studio、rt-thread出版的rt-studio,⾄于好不好⽤、能不能满⾜⼯作需要,则仁者见仁智者见智了。 反正我本⼈是不喜欢这些IDE的。
本⽂介绍的使⽤ (visual studio code)来进⾏单⽚机MCU的开发。 vscode是⽬前在互联⽹软件⾏业中,最⽕最流⾏的编辑器之⼀。 其特点有:
轻量、解耦:
· 本⾝只有编辑器的功能,安装包⼤⼩仅不到100MB。flash控件怎么下载
· 其他⼤部分功能都是通过插件的形式安装,按需安装。
· ⽀持全⾯,c语⾔、c++、java、python、JavaScript。 ⼏乎所有语⾔
编辑功能完善
· 界⾯好看,不会崩溃。
· 多⾏编辑、多⾏注释、多⾏选择、⾃动补全、⾃动跳转等功能⽀持到位。
整体架构
上⽂说道,vscode只是⼀个单纯的编辑器,并没有什么其他额外的功能,更不⽤说进⾏STM32这种嵌⼊式的开发了。
因此要理解如何使⽤vscode进⾏STM32开发,就必须要先理解STM32这种MCU软件的本质和开发流程。
MCU开发的原理
如下图所⽰,MCU的开发流程如下:
1. 编写代码,通常是C语⾔的代码。 但是也可以是ASM汇编,甚⾄c++、python、rust等其他语⾔。
2. 编译、链接,相信绝⼤部分⼈都亲⾝体验过这⼀步,其实就是keil中的build按钮。在keil中,点击build后,会默认⽣成hex格式的⼆进
制⽂件。
3. 烧录,这⼀步根据MCU的⼚商制定的要求来操作。 有些⼚商,例如国产的STC,只需要串⼝即可烧录。 但是⼤部分的MCU,都还是
需要J-link、ST-link这⼀类烧录器。 烧录操作可以单独进⾏,⽐如你可以下载j-link的驱动,然后单独的点开j-link flash这个软件进⾏烧录;也可以直接在keil中点击download进⾏烧录。
4. 最后复位MCU,会⾃动执⾏代码。
上述的步骤2:编译链接,也可以不⽤keil,⽽是使⽤cmd命令⾏的形式利⽤gcc编译器进⾏编译链接。
所以,上述的所有步骤,其实都可以单独的执⾏,⽽不需要依赖keil以及任何其他的IDE
举个例⼦:
1. 使⽤STM32CubeMX,⽣成⼀个makefile⼯程。
2. 下载arm-gcc编译器:developer.arm/tools-and-software/open-source-software/developer-tools/gnu-
toolchain/gnu-rm
3. 编译: 在命令⾏中输⼊ make 命令
4. 打印⼀⼤段编译和链接log后,⾃动⽣成:main.bin ⽂件
5. 打开j-flash,加载main.bin,进⾏烧录
6. 烧录完成,执⾏代码
MCU调试的原理
⽤过 keil 的同学都知道,keil虽然很多功能都不好⽤,但是唯独有⼀点除外:调试功能。 keil的调试功能既⽅便⼜强⼤,点击调试可以⼀键调试,⼜可以直接打断点、看变量、看寄存器等等。
下⾯我来介绍⼀下MCU调试的原理,从⽽理解怎么才能不⽤keil也能实现调试功能:
如上图所⽰,MCU的调试原理:
1. 绝⼤部分的MCU⾃⾝都⽀持调试接⼝以及对应的调试协议。以STM32为例,最常⽤的就是 SWD接⼝和SWD协议,关于SWD这⾥就
不详述了,简⽽⾔之,通过SWD,可以对STM32 MCU实现断点、暂停、单步、变量查看等功能。
2. J-link:由于我们的PC机⼤部分没有SWD这种接⼝,因此中间需要通过J-link进⾏⼀次转接。 同时,为了⽅便PC机上的软件开发,J-
link也⽀持GDB远程调试协议。
3. 最后,通过⼀根USB线和⼀个标准的GDB调试器,我们就可以直
接调试MCU了。
⽰例
下⾯我通过⼀个⽰例来展⽰如何通过vscode来开发和调试STM32
准备⼯作:
硬件:
任意⼀个STM32开发板
⼀个jlink
软件:
vscode
gcc编译器(arm-none-gnueabi-):arm官⽅下载地址:
STM32CubeMX:协助搭建⼯程
第⼀步:⽣成⽰例代码
打开STM32CubeMX,随便配置⼀下,点击⽣成⼯程,⽣成⼯程时选择Makefile⼯程,如下图所⽰:
第⼆步:使⽤vscode打开和编译⼯程
打开⼯程很简单,vscode本⾝只是⼀个编辑器,因此最简单的⽅法就是直接把⼯程⽂件夹拖到vscode⾥⾯,即可打开;当然你也可以在vscode⾥⾯,点击“⽂件 - 打开⽬录”。
打开后如下图所⽰:
可以看到,界⾯确实有“⾼级”程序员那味了。 我们底层程序员终于也迎来了今天。
下⼀步我们进⾏编译,编译这⽐较关键,请重点关注。
在上述准备过程中,下载的arm 编译器,解压出来,如下图所⽰:
把gcc编译器添加到系统路径(环境变量),从⽽可以从命令⾏调⽤。
windows中打开环境变量(根据win7、win10⽅法不同,这⾥不再累述),如下图所⽰:
⽐如我这⾥添加的路径就是:Z:\gcc-arm-none-eabi-10.3-2021.10-win32\gcc-arm-none-eabi-10.3-2021.10\bin