使用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 + gcc进行 STM32 单片机开发(一)编译及调试



整体架构

上文说道,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,会自动执行代码。

使用vscode + gcc进行 STM32 单片机开发(一)编译及调试
上述的步骤2:编译链接,也可以不用keil,而是使用cmd命令行的形式利用gcc编译器进行编译链接

所以,上述的所有步骤,其实都可以单独的执行,而不需要依赖keil以及任何其他的IDE

举个例子:

  1. 使用STM32CubeMX,生成一个makefile工程。
  2. 下载arm-gcc编译器:https://developer.arm.com/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也能实现调试功能:

使用vscode + gcc进行 STM32 单片机开发(一)编译及调试
如上图所示,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官方下载地址:https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm
  • STM32CubeMX:协助搭建工程

第一步:生成示例代码

打开STM32CubeMX,随便配置一下,点击生成工程,生成工程时选择Makefile工程,如下图所示:
使用vscode + gcc进行 STM32 单片机开发(一)编译及调试

第二步:使用vscode打开和编译工程

打开工程很简单,vscode本身只是一个编辑器,因此最简单的方法就是直接把工程文件夹拖到vscode里面,即可打开;当然你也可以在vscode里面,点击“文件 - 打开目录”。

打开后如下图所示:
使用vscode + gcc进行 STM32 单片机开发(一)编译及调试可以看到,界面确实有“高级”程序员那味了。 我们底层程序员终于也迎来了今天。



下一步我们进行编译,编译这比较关键,请重点关注。

在上述准备过程中,下载的arm gcc编译器,解压出来,如下图所示:
使用vscode + gcc进行 STM32 单片机开发(一)编译及调试把gcc编译器添加到系统路径(环境变量),从而可以从命令行调用。

windows中打开环境变量(根据win7、win10方法不同,这里不再累述),如下图所示:
使用vscode + gcc进行 STM32 单片机开发(一)编译及调试比如我这里添加的路径就是:Z:\gcc-arm-none-eabi-10.3-2021.10-win32\gcc-arm-none-eabi-10.3-2021.10\bin

最后重启一下vscode, 在下面的这里直接敲命令: make,就可以直接编译并生成 .elf文件了。如下图所示:
使用vscode + gcc进行 STM32 单片机开发(一)编译及调试使用vscode + gcc进行 STM32 单片机开发(一)编译及调试到这一步,你已经可以直接通过j-flash软件,直接把.bin文件烧录到MCU中了,这里就不再累述了。




注:针对高端玩家,这里多说两句,make命令直接解析当前目录下得makefile,进行编译和链接。 对于后续的添加源文件、头文件、修改链接脚本、增加堆栈大小、固定链接段等操作,都可以去自己修改makefile来实现




第三步:调试代码

请参考上述的架构图,我们需要先启动GDB Server:
安装j-link驱动时,会自动安装j-link GDB Server,如下图所示
使用vscode + gcc进行 STM32 单片机开发(一)编译及调试使用vscode + gcc进行 STM32 单片机开发(一)编译及调试GDB Server启动成功后,我们通过PC上的GDB调试器,连接到GDB Server。

GDB调试器已经包含在上述我们下载的 arm gcc编译器中了,具体就是 arm-none-eabi-gdb.exe这个文件。

接下来和第二步:编译链接 过程中类似,我们在vscode中的terminal中输入以下命令:

arm-none-eabi-gdb

结果如下图所示:
使用vscode + gcc进行 STM32 单片机开发(一)编译及调试然后我们连接到GDB Server,输入命令:
target remote 127.0.0.1:2331 其中127.0.0.1代表本机,2331是上面有提到的端口号。

再输入命令,加载调试文件:
file xxx.elf

设置完毕! 接下来我们调试一下试试:
先复位一下单片机:
monitor reset

在main.c文件的110行打个断点:
b Core/Src/main.c:110

CPU开始正常执行代码:
continue

输出如下:
使用vscode + gcc进行 STM32 单片机开发(一)编译及调试手动查看此时的位置;
where

再看看此时的局部变量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 这行命令,可以直接在编辑器上点一下,如下图所示:
使用vscode + gcc进行 STM32 单片机开发(一)编译及调试
有很多插件理论上都可以用,这里我只尝试了其中一个: Cortex-Debug。
使用vscode + gcc进行 STM32 单片机开发(一)编译及调试
安装完成后,需要先简单配置一下这个插件:
1.打开 .bin文件,点击调试选项卡,新建调试配置,选择 cortex-debug:

使用vscode + gcc进行 STM32 单片机开发(一)编译及调试使用vscode + gcc进行 STM32 单片机开发(一)编译及调试就会自动生成一个默认配置文件了:
使用vscode + gcc进行 STM32 单片机开发(一)编译及调试修改默认配置文件,如下图所示:
使用vscode + gcc进行 STM32 单片机开发(一)编译及调试

以上配置完成后,就可以不再进行第三步操作,而是直接点击F5,这个插件就会自动的帮我们启动GDB Server、GDB调试器、处理断点、变量等。 当然你必须要知道,它的底层原理还是和第三步一样。

最后的效果如下图所示:
使用vscode + gcc进行 STM32 单片机开发(一)编译及调试




本文到这里就结束了,欢迎点击我的头像,并继续阅读本系列第二篇文章: 使用vscode + gcc进行 STM32 单片机开发(二)移植 rtthread



结语

最后,代码写的不怎么样,我就没有上传了。 如果有任何疑问,欢迎在下面留言,我看到了就会回复。文章来源地址https://www.toymoban.com/news/detail-404773.html

到了这里,关于使用vscode + gcc进行 STM32 单片机开发(一)编译及调试的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32单片机开发-01 STM32介绍

    通过野火开发板学习单片机 从内核上分有Cortex-M0、M3、M4 和M7 F1 代表了基础型,基于Cortex-M3 内核,主频为72MHZ F4 代表了高性能,基于Cortex-M4 内核,主频180M。 数据手册:用于芯片选型和设计原理图 参考手册:用于编程时查阅 Icode总线 – 该总线讲M3内核的指令总线与闪存指令

    2024年01月21日
    浏览(22)
  • 使用gcc 工具链开发单片机程序,怎么查看内存映像

    一、概述 1.1 功能 1.2 命令格式 1.3 支持的目标文件 二、基本应用示例 2.1 查看单个对象文件 2.2 查看整个工程的内存映像 三、命令选项描述 3.1 以不同的进制格式显示内存映像 示例:以十六进制格式显示 3.2 不同的输出方式 3.2.1 可选的表示方式与对应的选项 3.2.2 -A (–format=

    2024年01月19日
    浏览(22)
  • 使用标准库和HAL库的STM32单片机进行串口通信/解决因例程为HAL库的传感器,而其他模块都是标准库,需要将数据用串口传送给标准库的单片机的相关问题

    (本文使用STM32F103C8T6,在CubeMX里演示用的是RBT6,但实际上引脚是一样的)         本文 着重解决一个大工程中,某些传感器的例程是HAL库的,而其他模块(或算法)都是标准库,导致难以移植的问题。 本文的解决方法是:使用一片单片机用HAL库(CubeMX)配置例程,然后

    2024年02月06日
    浏览(24)
  • proteus结合keil-arm编译器构建STM32单片机项目进行仿真

        proteus是可以直接创建设计图和源码的,但是源码编译它需要借助keil-arm编译器,也就是我们安装keil-mdk之后自带的编译器。     下面给出一个完整的示例,主要是做一个LED灯闪烁的效果。     新建工程指定路径,Schematic,PCB layout都选择默认,在最后创建项目工程向导的时

    2024年02月13日
    浏览(23)
  • 使用STM32CubeProgrammer工具读取单片机Flash数据读取

    本文主要介绍,如何使用STM32CubeProgrammer工具读取和写入单片机Flash内部的数据,方便调试使用。 2.1 连接Stlink和单片机,点击“connect”进行连接 2.2 读取固定长度的数据 根据程序的大小,设置需要读取的字节数,如下图所示。点击“read”将单片机Flash中的数据读取到STM32Cube

    2024年02月12日
    浏览(18)
  • 在VSCode平台上使用Embedded IDE搭建单片机开发环境

    本文介绍了如何在VSCode平台上通过Embedded IDE插件搭建单片机开发环境,包括软件安装、插件配置、编译器安装和项目构建等步骤。

    2023年04月08日
    浏览(26)
  • STM32F103RCT6开发板M3单片机教程06--定时器中断

    除非特别说明,本章节描述的模块应用于整个 STM32F103xx 微控制器系列,因为我们使用是 STM32F103RCT6开发板是mini最小系统板。 本教程使用是( 光明谷SUN_STM32mini开发板 )   首先了解一下是STM32F10X定时器(Timer)   注: 小容量产品是指闪存存储器容量在16K至32K字节之间的STM32F101

    2024年02月04日
    浏览(24)
  • 使用DMA传输实现单片机高效串口转发——以STM32系列为例

    Date Author Version Note 2023.08.06 Dog Tao V1.0 1. 完成了文档的撰写。 2023.08.23 Dog Tao V1.1 1. 增加了STM32F103-USART2的DMA传输配置示例。 2. 增加了STM32F103与F407单片机的DMA控制器介绍并更改了第一章节的结构。 应用场景 在许多现实应用场景中,例如工业自动化控制、嵌入式通信设备等领域,

    2024年02月14日
    浏览(17)
  • GD32单片机和STM32单片机的对比分析

    GD32单片机和STM32单片机都是基于Arm Cortex-M3/M4内核的32位通用微控制器,广泛应用于各种嵌入式系统和物联网领域。两者之间有很多相似之处,但也有一些不同之处,本文将从以下几个方面对比分析两者的特点、优势和开发成本。 GD32单片机采用的是二代的M3/M4内核,而STM32单片

    2024年02月16日
    浏览(25)
  • J-LINK J-FLASH 下载STM32单片机程序使用教程

    J-LINK J-FLASH 下载程序使用教程 -V1.0 2023.05.09 Introduction 本教程用于演示如何使用JLINK V9配套J-FLASH软件烧写更新MCU程序的教程 安装提供的 JLINK驱动程序。JLink_Windows_V722a.rar。全程默认安装,只能安装在C盘,不可安装于其它盘。 安装驱动完成后,将JLINK V9仿真器上USB口插上电脑,

    2024年02月11日
    浏览(19)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包