使用vscode + gcc进行 STM32 单片机开发(一)编译及调试 | 您所在的位置:网站首页 › 单片机硬件平台调试程序流程 › 使用vscode + gcc进行 STM32 单片机开发(一)编译及调试 |
简介
众所周知,单片机MCU的开发通常是使用keil来进行的,但是keil作为一款有几十年历史的IDE,bug层出不穷,界面也越来越丑,加上使用盗版jlink,导致keil各种崩溃卡死。 故越来越多的单片机IDE也如雨后春笋般冒出,例如 st官方出版的st studio、rt-thread出版的rt-studio,至于好不好用、能不能满足工作需要,则仁者见仁智者见智了。 反正我本人是不喜欢这些IDE的。 本文介绍的使用vscode (visual studio code)来进行单片机MCU的开发。 vscode是目前在互联网软件行业中,最火最流行的编辑器之一。 其特点有: 轻量、解耦: · 本身只有编辑器的功能,安装包大小仅不到100MB。 · 其他大部分功能都是通过插件的形式安装,按需安装。 · 支持全面,c语言、c++、java、python、JavaScript。 几乎所有语言 编辑功能完善 · 界面好看,不会崩溃。 · 多行编辑、多行注释、多行选择、自动补全、自动跳转等功能支持到位。
上文说道,vscode只是一个单纯的编辑器,并没有什么其他额外的功能,更不用说进行STM32这种嵌入式的开发了。 因此要理解如何使用vscode进行STM32开发,就必须要先理解STM32这种MCU软件的本质和开发流程。 MCU开发的原理如下图所示,MCU的开发流程如下: 编写代码,通常是C语言的代码。 但是也可以是ASM汇编,甚至c++、python、rust等其他语言。编译、链接,相信绝大部分人都亲身体验过这一步,其实就是keil中的build按钮。在keil中,点击build后,会默认生成hex格式的二进制文件。烧录,这一步根据MCU的厂商制定的要求来操作。 有些厂商,例如国产的STC,只需要串口即可烧录。 但是大部分的MCU,都还是需要J-link、ST-link这一类烧录器。 烧录操作可以单独进行,比如你可以下载j-link的驱动,然后单独的点开j-link flash这个软件进行烧录;也可以直接在keil中点击download进行烧录。最后复位MCU,会自动执行代码。
所以,上述的所有步骤,其实都可以单独的执行,而不需要依赖keil以及任何其他的IDE 举个例子: 使用STM32CubeMX,生成一个makefile工程。下载arm-gcc编译器:https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm编译: 在命令行中输入 make 命令打印一大段编译和链接log后,自动生成:main.bin 文件打开j-flash,加载main.bin,进行烧录烧录完成,执行代码 MCU调试的原理用过 keil 的同学都知道,keil虽然很多功能都不好用,但是唯独有一点除外:调试功能。 keil的调试功能既方便又强大,点击调试可以一键调试,又可以直接打断点、看变量、看寄存器等等。 下面我来介绍一下MCU调试的原理,从而理解怎么才能不用keil也能实现调试功能:
下面我通过一个示例来展示如何通过vscode来开发和调试STM32 准备工作:硬件: 任意一个STM32开发板一个jlink软件: vscodegcc编译器(arm-none-gnueabi-):arm官方下载地址:https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rmSTM32CubeMX:协助搭建工程 第一步:生成示例代码打开STM32CubeMX,随便配置一下,点击生成工程,生成工程时选择Makefile工程,如下图所示: 打开工程很简单,vscode本身只是一个编辑器,因此最简单的方法就是直接把工程文件夹拖到vscode里面,即可打开;当然你也可以在vscode里面,点击“文件 - 打开目录”。 打开后如下图所示: 下一步我们进行编译,编译这比较关键,请重点关注。 在上述准备过程中,下载的arm gcc编译器,解压出来,如下图所示: windows中打开环境变量(根据win7、win10方法不同,这里不再累述),如下图所示: 最后重启一下vscode, 在下面的这里直接敲命令: make,就可以直接编译并生成 .elf文件了。如下图所示: 注:针对高端玩家,这里多说两句,make命令直接解析当前目录下得makefile,进行编译和链接。 对于后续的添加源文件、头文件、修改链接脚本、增加堆栈大小、固定链接段等操作,都可以去自己修改makefile来实现 第三步:调试代码请参考上述的架构图,我们需要先启动GDB Server: 安装j-link驱动时,会自动安装j-link GDB Server,如下图所示 GDB调试器已经包含在上述我们下载的 arm gcc编译器中了,具体就是 arm-none-eabi-gdb.exe这个文件。 接下来和第二步:编译链接 过程中类似,我们在vscode中的terminal中输入以下命令: arm-none-eabi-gdb 结果如下图所示: 再输入命令,加载调试文件: file xxx.elf 设置完毕! 接下来我们调试一下试试: 先复位一下单片机: monitor reset 在main.c文件的110行打个断点: b Core/Src/main.c:110 CPU开始正常执行代码: continue 输出如下: 再看看此时的局部变量i的值: print i 最后看看函数的调用栈: backtrace 注:j-link gdb server支持的所有命令:https://wiki.segger.com/J-Link_GDB_Server 第四步:使用插件替代命令行的GDB不难发现,上述的命令行操作,有点蛋疼。 而且理论上来说完全可以像keil那样,使用GUI界面的形式来做。 vscode中通过插件的方法,可以将命令行的操作转换成可视化界面操作,例如b Core/Src/main.c:110 这行命令,可以直接在编辑器上点一下,如下图所示:
以上配置完成后,就可以不再进行第三步操作,而是直接点击F5,这个插件就会自动的帮我们启动GDB Server、GDB调试器、处理断点、变量等。 当然你必须要知道,它的底层原理还是和第三步一样。 最后的效果如下图所示: 本文到这里就结束了,欢迎点击我的头像,并继续阅读本系列第二篇文章: 使用vscode + gcc进行 STM32 单片机开发(二)移植 rtthread 结语最后,代码写的不怎么样,我就没有上传了。 如果有任何疑问,欢迎在下面留言,我看到了就会回复。 |
CopyRight 2018-2019 实验室设备网 版权所有 |