Win10配置 STM32/GD32 单片机 GCC+VScode 编译调试总结 2021版_win10配置 stm32/gd32 单片机 gcc+vscode 编译调试总结 2021版_秋阳 -程序员宅基地

技术标签: 嵌入式  单片机  

末尾带全部工具,代码工程打包,直接一步搞定.

  • 本文主题: ARM-GCC 套件 + VScode + OpenOCD + Cortex-debug = 开源 IDE

效果
上图为最终工作环境演示.

为何使用GCC+VScode

在嵌入式开发过程中, 之前都是用的是Keil-MDK, IAR, 等商业集成开发环境(IDE) .

  • Keil MDK
    在这里插入图片描述在这里插入图片描述

MDK被ARM收购以后,AC6 AC6 编译器的性能越来越给力.在官网的说明里,运行效率和代码体积都比开源编译器ARM-GCC好20%以上.

  • IAR SYSTEMS
    在这里插入图片描述
    IAR system(瑞典)的商业编译器在STM8,MSP430,CortexM下的表现非常棒. 代码运行效率也非常不错,IDE软件集成度高,编译,下载,Debug都很流畅.

  • SEGGER Embedded Studio
    在这里插入图片描述

可供选择的还有来自出品J-link公司SEGGER的Embedded Studio. 非商业用途是免费使用. 缺点是仅支持自家的JLINK,Embedded Studio也是采用GCC和CLANG,其中CLANG是个趋势,现在MDK的AC6也是用的CLANG.

以上这三个都是商业编译器/ IDE. 咨询过是MDK的国内代理公司米er科技,一年的授权费用是几w元. 听闻不少同行也收到了来自MDK的警告邮件.

当产品仍然在评估阶段,还没有预算时, 可以选择开源的GCC编译器.

GCC是 GNU C /C++ Compiler 的简称
在这里插入图片描述
编译流程

在开源编译器中,可供选择的有GCC 和 LLVM-Clang(MacOS系统采用), Linux系统默认安装了GCC编译套装, 可以自己编译自己的内核,驱动,程序. 我们要给单片机编程, 在电脑上编译别的芯片的指令这叫做交叉编译.

交叉编译使用的编译器是:gcc-arm-none-eabi

  • arch - 体系架构,如ARM,MIPS
  • verdor - 工具链提供商, 是gcc
  • os - 目标操作系统,none代表裸机开发
  • eabi - 嵌入式应用二进制接口,Application binary interface (ABI), EABI中的E,表示“Embedded”,是一种新的ABI,支持软件浮点和硬件实现浮点功能混用.

目前版本是 GCC 10 2020-q4, gcc-arm-none-eabi ,由自由软件基金会和ARM进行维护, 由 C /C++ Compiler ,Binutils, GDB,NewLib 四个部分,这些我们都会用上,
在这里插入图片描述

https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm

  • C /C++ Compiler: 编译器生成机器代码 .o 文件
  • Binutils: 工具套装,包含ld,ar,objdump等, 例如用于生成Bin文件,Hex文件.
  • GDB: 用于打断点调试,运行时读取内存数据. 找Bug.
  • NewLib: 面向嵌入式系统的C运行库, 主要有libc,libm, 比如常用的math.h数学函数, std标准库, printf() 打印功能.

最新的优化和编译器技术,兼容最新的芯片,需要及时升级版本.
本人在2016年GCC5.x版本的时候,由于Cortex-M7刚刚推出,.
编译STM32F7的芯片的时候就会出现兼容性问题.

现在在上面网页可以看到: Cortex-M7以及2019推出的M0+/M23/M33内核的单片机都已经支持好了.

  • VSCode

在这里插入图片描述
不多介绍, Stack Overflow对2018年的IT生态调查显示:Visual Studio Code超过Visual Studio一跃成为榜首,成为“最受欢迎的开发环境”, 前端后端全栈程序员必备. 当然嵌入式工程师也不能少.

一 .安装软件

1. Mingw-w64 GCC for Windows 64 & 32 bits

第一步, 安装Mingw-w64, 推荐使用离线安装包安装,其实就是解压到方便找到的目录
推荐不要使用Online Installer, 会比较慢,虽然整个软件只要10MB,非常小,

注意我们使用软件要在官方提供的地址进行下载,警惕百du网盘(除非明确知道来源)和其他下载站. 官方链接一般是
官方项目主页,SourceForge ,或者官方项目Github release页面进行下载. SourceForge
是全球最大的开放源代码软件开发平台和仓库。它集成了很多开放源代码应用程序,为软件开发提供了整套生命周期服务

下面红框里任选, 都是可以用,区别是Windows下实现的系统调用细节不一样.
我选的是i686-posix-dwarf,可能是最佳兼容性,这个是在线下载器默认安装的版本.

下载地址:
https://sourceforge.net/projects/mingw-w64/files/
在这里插入图片描述
上图不同版本区别的参考文章 :
https://blog.csdn.net/AMDDMA/article/details/111600238

Mingw-w64 包含了Windows下的本机GCC编译器套件, 编译产物一般是原生 Windows 应用, 学习C/C++语言,不使用微软的VC的话,就可以使用GCC进行编译windows下的程序.

安装(或解压缩)完毕, 会得到一个bin目录(后面要放入系统环境变量里面Path), 里面有很多exe,都是是windows系统的GCC软件套装.
在这里插入图片描述
记住这个bin文件夹,这个是我们make安装目录

为了方便以后在命令行执行make指令,而不是输入较长的"mingw32-make", 要把mingw32-make.exe 复制为make.exe.

一些题外话:
在嵌入式开发上,我们只要用到Mingw-w64提供的make.exe程序,make是用于解析Makefile文件的软件,

可以认为Makefile文件是自动调用gcc,把目录里一个个*.c .*h文件喂给gcc去编译的一个自动脚本文件,用户可以自由决定那些文件是需要编译的,哪些是不用编译的,还可以设置编译的选项,比如"编译优化等级",“宏定义”,"警告等级"等等.

更多Makefile相关资料,参考: GNU Make 使用手册(中译版),
内容较多仅作查阅,实际使用时我们只要输入make这四个字母就行.
https://blog.csdn.net/weixin_40535588/article/details/89336051

到此make安装完毕.

2. 安装 ARM-GCC 交叉编译器

进入ARM开发者官网下载编译器安装包,下面一个是压缩包,另外一个是安装包,本文章软件都是不需要"安装"的,都是win32可执行二进制文件,是一个解压的动作即可.

https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads
在这里插入图片描述
安装解压完成后,可以找到一个bin文件夹,这个就是我们编译器安装目录.
在这里插入图片描述
到此GCC交叉编译器安装完毕

3. 安装 Debug 调试工具 openocd 0.10.0

有了以上两个工具, 已经可以编译出Bin 或者 Hex文件, 但是编写程序遇到Bug,就免不了使用Debug功能, 实时加入断点,获取某个内存的数值, 或者查看系统Hardfault前的调用,快速找到出错代码. 可以大大加快排除Bug的速度.

Debuger 的硬件可以是: CMSIS-DAP / STlink V2 / Jlink OB V8 V9 , 这里更加推荐ARM官方开源的CMSIS-DAP. 接口速度和兼容的型号上是超过了Jlink V8, 本身软硬件也是开源的,可以直接上网购买别人做好的模块, 实际CMSIS-DAP硬件上就是一片带usb的stm32而已,价格30元以内,带接口隔离或者无线调试的可能贵一些.
在这里插入图片描述
官网 http://openocd.org

最新版本是2017年发布的 OpenOCD 0.10.0, 加入ARM Cortex-M7 支持,以及当年推出的STM32F7等一些列的支持, 这个开源项目更新比较慢 一般2-3年一更.

有了硬件,使用openocd (Open On-Chip Debugger/) 可以驱动CMSIS-DAP硬件,最终实现GDB服务,这样借助IDE的图形界面发送指令给GDB server, 我们就可以一键获得芯片内部的内存,一键操作代码的流程,打断点, 同时也支持烧写Flash到指定地址.

下载地址
找到sysprogs公司网站上(是卖一个叫做VisualGDB软件的 )提供的win系统编译版本,版本新,下载速度比较快:
https://sysprogs.com/getfile/1364/openocd-20201228.7z

在这里插入图片描述
在这里插入图片描述
解压到想要安装的地方, 记住bin文件夹得目录. 后面我们设置环境变量的时候需要用到.

4. Visual Studio Code

安装地址
https://code.visualstudio.com/

直接点击下载exe安装即可

二. 配置Path 环境变量

以上有三个工具是需要设置到Win系统得环境变量里面, 在Ubuntu / Linux 里面也是一样的操作,是需要在用户bash脚本内写入Path变量.

win10下也是写入Path,但是比较方便一些. 如下操作:
在这里插入图片描述
在 桌面"此电脑"图标, 右键 - >属性 -> 高级系统设置 -> 环境变量 -> Path ->编辑, 增加 3条我们的bin目录,分别是:

  • 执行 make脚本的 mingw32 的bin目录
  • 交叉编译器 GNU-ARM-… 下的 bin目录
  • 调试器 openOCD 的 bin 目录

完毕, 运行cmd , 或者在vscode界面下面的终端, 就可以直接输入指令查询这些工具的版本.

查询make版本
make -v
查询交叉编译器版本
arm-none-eabi-gcc -v
查询openOCD版本
openocd -v

如果显示诸如: “不是内部或外部命令,也不是可运行的程序或批处理文件” , 说明环境变量不正确, 系统无法在环境变量的路径列表里找到我们需要的工具. 就需要回到上面步骤进行检查. 在Linux下也是如此是Path路径的问题.
在这里插入图片描述
上图三个命令都已经可以在cmd内调用,响应-v参数返回自己版本号.
在这里插入图片描述
在VScode内使用 Ctrl + ~快捷键, 打开内置的power shell终端, 也可以顺利看到命令返回版本.

VScode的终端显示效率高,支持代码高亮. 建议以后就在项目内直接使用, 不再使用 Win10 那个黑色cmd.

到此我们的Win10 已经拥有了和Linux下交叉编译一样的环境, 可以编译任意arm-gcc ,makefile 的工程了.

甚至可以编写本机电脑执行的C++程序在这里插入图片描述
只要输入:gcc main.x -o main.exe一句代码即,0.1秒 一瞬间可完成编译得到可以直接执行的exe文件.

接下来我们编译一个STM32 CubeMX生成的makefile工程. 直接编译单片机程序.

三. 编译STM32代码

1.获取STM32CubeMX工具,直接生成模板

也可以不使用,直接下载文章最后我提供的模板

STM32CubeMX是目前单片机界最强配置工具, 支持Mac,Linux,Win 系统, 可以查询型号, 配置引脚和外设,直接生成代码. 其他厂家还有非常长的路要追赶.
下载地址:
https://www.st.com/zh/development-tools/stm32cubemx.html#get-software
在这里插入图片描述
在这里插入图片描述

2.生成 STM32F103的Makefile工程

( 熟悉CubeMX兄台的请略过)

在起始页面, 点击MCU SELECTOR
在这里插入图片描述
在这里插入图片描述
选择芯片后, 如是第一次选择F1的芯片的话, ,需要一点时间下载F1芯片的支持包,弹框点击YES下载 ,下载速度还可以.

在这里插入图片描述
(上图) 然后可以根据需要配置一下时钟,引脚外设, 接下来就找到: Project Manager, 进行设置.

注意要选择:Mekefile环境,否则是生成Keil或者IAR工程, 最后点击生成即可.

在这里插入图片描述

生成完毕, 可以自动打开目录, 看到生成结果如上. 右键选择Open with Code. 打开VScode 进行查看.

3.编译代码

在这里插入图片描述
先不细看, 直接编译, 按 Crtl + ~, 调出命令行, 输入: make -j
在这里插入图片描述
1秒后, 编译完成, 生成了 .hex 文件 和 bin文件. 位于自动生成的./Build文件夹内.
在这里插入图片描述

由于使用了-j 指令, 会使用多线程编译. 编译速度非常快只要一瞬间就完成了HAL库和main文件的编译并生成 Bin 和 Hex文件.
在这里插入图片描述

如果要清理Build目录, 只要运行make clean 命令, 由于这个Makefile文件只考虑到Linux系统, 我们需要把clean的命令 -rm -fR $(BUILD_DIR) 改为Windows下的-del /q $(BUILD_DIR).

至此STM32工程编译完成.,STM32工程的芯片

4.下载 Bin文件到目标板

方法1: 使用STLink v2 硬件,SWD接口,用官方STM32 ST-LINK Utility软件下载Bin文件.
方法2: 使用Jlink OB/V8/V9 使用J-flash下载Bin文件.
方法3. 使用芯片内置的ISP功能,手动把BOOT0脚拉高,使用mcu-isp软件,uart1串口烧写.

方法4(推荐). 使用OpenOCD, 硬件使用CMSIS-DAP/STLink v2.
命令行执行:
用CMSIS-DAP:
openocd -f cmsis-dap.cfg -f stm32f1x.cfg -c init -c halt -c "program my_gcc_test.bin 0x8000000" -c reset -c shutdown

用STLink v2:
openocd -f stlink-v2.cfg -f stm32f1x.cfg -c init -c halt -c "program my_gcc_test.bin 0x8000000" -c reset -c shutdown

需要先把接口配置,和芯片配置文件从openocd安装目录/拷贝到工程目录下,
cmsis-dap.cfg 或 stlink-v2.cfg 位于 : 安装目录\share\openocd\scripts\interface
stm32f1x.cfg位于 : 安装目录\share\openocd\scripts\target

参考
https://blog.csdn.net/u011011827/article/details/102643360

芯片 Debug 单步调试步骤参照下面步骤的Debug部分.

四. 编译GD32工程, 并使用OpenOCD进行Debug.

2020年的特殊情况, 导致ST芯片的缺货潮的到来, ST单片机芯片一片难求, 上面举例的STM32F1系列的价格由原先的8-10元直接飙升到30-100元,某些型号甚至2021年全年无货.

以下以GD32单片机为例,MM32 ,AT32,APM32类似, 选用一个ST替代芯片进行Debug部分记录.

1 . 关于获取GD32工程模板.

在英文/中文官网查找,GD32官方固件库只提供了固件库的C源代码以及MDK/IAR工程, 没有提供GCC工具链需要的链接脚本.ld文件,以及.s文件汇编格式启动文件.

  • 方案1: 直接沿用上面STM32的工程, 把HAL库替换为GD32的标准库,再修改makefile文件即可.
  • 方案2: 找到一份可用的GD32 GCC工程.已经写好makefile以及匹配好GD32的库,可以不需要相同的芯片型号,我们可以自己替换库文件.

先选方案2: 在Github搜索GD32 + GCC, 果然有收获
https://github.com/blueskull/GD32F3x0-gcc , 下载下来,发现makefile更加简洁(只要30行),好就它了.
在这里插入图片描述
(同样我做了一些本地化修改, 把make clean时要用的删除文件的rm命令换成了del命令)

2 .GD32工程编译.

可以看到makefile编译分为 make appmake driver两个编译目标. make driver把整个官方库文件生成driver.a文件, make app 会编译app/*.c , 并链接刚刚的库 driver.a 得到最终bin文件.

所以先输入 make driver, 再输入 make app , 即可看到编译出bin文件.
在这里插入图片描述
这样设计有个好处,driver.a 一旦生成, 就是一个lib文件, 不需要进行反复编译,后面的开发阶段编译会更加的快,很多时候我们不需要编译lib部分了,但如果我们改动了Lib库的部分的代码,就需要执行一次make driver.

我们也可以添加一个 make all, 自动完成先删除所有编译, 重新编译Lib, 再编译app.
在这里插入图片描述
如上图增加 all: clean driver app , all这个目标会顺序自动执行clean, driver ,app. 整个过程也是非常快.

为什么使用all 这个名称 ? 因为只输入make, 等同于输入了make all, 这个是makefile的规则.
由于过程有先后顺序,就不能使用-j选项进行多线程加速了, 但在make appmake driver两个编译目标是支持 -j 选项加速的.

插入一个题外话: 在GCC编译下, 涉及到几万个文件的工程高级加速,可以使用ccache进行进一步的加速.
如果使用Ninja编译脚本替换Makefile进行编译,还可以获得50%的编译加速. 让原本小时级别大工程的编译进入若干分钟以内.

3 .GD32工程的Debug.

参考: https://blog.csdn.net/qq_40833810/article/details/106713462

安装VScode插件 Cortex-debug.
内建了不输于Keil-mdk 的界面,包括寄存器,watch,外设,反汇编等功能.
在这里插入图片描述
点击VScode左边插件图标,搜索cotrex-debug,点击install安装.

在 Debug 界面,点击 “add configuration”, 添加以下内容:

launch.json文件关键点是设置:

  1. 正确的elf文件, elf文件是带有调试信息的编译结果,可以告诉gdb那一句汇编对应哪个文件,类似MDK环境下的axf文件.
  2. 正确的openocd 的2个配置文件.
  3. servertype,type类型填对. 这样才能启动openocd.
    在这里插入图片描述

同下载步骤, 需要先把接口配置,和芯片配置文件从openocd安装目录/拷贝到工程目录下,
cmsis-dap.cfg 或 stlink-v2.cfg 位于 : 安装目录\share\openocd\scripts\interface
stm32f1x.cfg(我改名为了openocd_target)位于 : 安装目录\share\openocd\scripts\target

stm32f1x.cfg, 我改名为了openocd_target,且通用于国产m3 m4,因为里面主要是写了一个debug寄存器( DBGMCU_CR 0xE0042004)的地址,配置了一下芯片,这点都是一样的,不一样的话可以找芯片datasheet来改stm32f1x.cfg内容就可以了.GD32等各种32是一模一样的.

下一部点击左边瓢虫, 开始dubug环境,

在这里插入图片描述
全文完

上文所有用的的软件, 代码模板:
链接:https://pan.baidu.com/s/1K5C6x6krvdmLUaYjrB3Mvw
提取码:1pe2

如有帮助,支持1c币: https://download.csdn.net/download/cqy1028/15493896

更多关于嵌入式,编程欢迎关注,持续更新

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/cqy1028/article/details/113984775

智能推荐

eclipse交叉编译linux内核,【已解决】Ubuntu下Eclipse中交叉编译Uboot出错:make[1]: arm-xscale-linux-gnueabi-gcc: Command no...-程序员宅基地

文章浏览阅读406次。【问题】折腾:期间,编译出错:22:21:49 **** Build of configuration Default for project HART-IP ****make allmake[1]: arm-xscale-linux-gnueabi-gcc: Command not foundmake[1]: Entering directory `/home/crifan/develop/ec..._uboot arm-linux -gcc command not found

原码、反码、补码和移码其实很简单_0111-1011-程序员宅基地

文章浏览阅读3k次。计算机组成原理,看到书中关于原码、反码、补码和移码的定义如下(n是机器字长):原码:反码:补码:移码:看完这些定义以后,我的脑袋瞬间膨胀到原来的二倍!这样变态的公式不管你记不记得住,反正我是记不住!其实没必要弄得这么麻烦,它们完全可_0111-1011

Linux创建后台进程_linix后台进程创建-程序员宅基地

文章浏览阅读1k次。void setdaemon(const char * pid_file){ pid_t pid; if(!pid_file) { return; } if((pid = fork()) < 0) { exit(-1); } if(pid) { exit(0); } setsid(); if ((pid = fork()) < 0) { ..._linix后台进程创建

让react用起来更得心应手——(react-router原理简析)_hashchange和popstate无法触发-程序员宅基地

文章浏览阅读1.1k次,点赞3次,收藏10次。让react用起来更得心应手系列文章:让react用起来更得心应手——(react基础简析) 让react用起来更得心应手——(react-router原理简析) 让react用起来更得心应手——(react-redux原理简析)前端路由和后台路由在刚入行的时候一直明白什么单页面应用是什么,说白了就是混淆了前台路由和后台路由,现在来缕缕它们:前台路由:页面的显示由前台js控制,在..._hashchange和popstate无法触发

Git应用笔记整理(全)_git 记笔记-程序员宅基地

文章浏览阅读913次,点赞2次,收藏4次。1. Git 配置1.1. git config  git config 语法:git config [–环境参数] key value   有三个环境参数:–global 全局配置,写到~/.gitconfig中,即用户路径C:\Users\li.liu下的.gitconfig文件。–local 工作目录配置,即所在仓库的配置,写到当前仓库下的.git/config文件中。..._git 记笔记

matlab批量读取文件夹里面的文件名,并且调整图片大小,再按照原名称输出_matlab导出图片且和原图片一样的文件名-程序员宅基地

文章浏览阅读1.8k次。举个例子,我要批量修改某文件夹里面的图片大小,我不想用顺序命名,之后我还想原名输出fileFolder=fullfile('E:\caffe\SegNet_ip\CamVid\test');%读取图片路径dirOutput=dir(fullfile(fileFolder,'*.jpg'));%读取文件夹里面文件OtpDir = 'E:\test';%输出路径fileNames = {di_matlab导出图片且和原图片一样的文件名

随便推点

Greenplum优化--SQL调优篇_vacuum analyze 很慢-程序员宅基地

文章浏览阅读3.6w次,点赞10次,收藏78次。目录数据库查询预准备 VACUUMANALYZEEXPLAIN执行计划两种聚合方式关联重分布查询优化 explain参数选择合适分布键分区表压缩表分组扩展窗口函数列存储和行存储函数和存储过程索引使用[NOT IN](#NOT IN)聚合函数太多资源队列其它优化技巧参考数据库查询预准备VACUUMvacuum只是简单的回收空间且令其可以再次使用,没有请求_vacuum analyze 很慢

CheckBoxList中DataTextFormatString的设置_checkboxlist设置左右间距-程序员宅基地

文章浏览阅读168次。user_CheckBoxList.DataTextField = "limit3_name"; user_CheckBoxList.DataValueField = "limit3_id"; user_CheckBoxList.DataTextFormatString = " "+"{0: S}"; user_CheckBoxList.DataSource = ds.Tab..._checkboxlist设置左右间距

NYOJ38 布线问题(Prim)-程序员宅基地

文章浏览阅读577次。布线问题时间限制:1000 ms | 内存限制:65535 KB难度:4描述南阳理工学院要进行用电线路改造,现在校长要求设计师设计出一种布线方式,该布线方式需要满足以下条件:1、把所有的楼都供上电。2、所用电线花费最少输入第一行是一个整数n表示有n组测试数据。(n每组测试数据的第一行是两个整数v,e.v表示学校里楼的总个数(v随后

【多线程与高并发3】常用锁实例_多线程枷锁的案例-程序员宅基地

文章浏览阅读328次。各式锁的实际应用乐观锁 cas(要改的对象,期望的值,要给的值)无锁操作,其实是一个乐观锁…cas本身可以看成是一个锁automic : 一种使用 cas 实现的原子性操作原子操作的简单方法:函数效果备注AtomicInteger a = new AtomicInteger(0);int a = 0;创建对象a并且赋初值为0;a.incrementAndGet( );i++;对原值+1后返回;a.getAndIncrement( );_多线程枷锁的案例

强化学习笔记(5)之时序差分法_td error-程序员宅基地

文章浏览阅读2.2k次,点赞4次,收藏18次。强化学习笔记(5):时序差分法求值函数标签(空格分隔): 未分类文章目录强化学习笔记(5):时序差分法求值函数时序差分法与动态规划法和蒙特卡洛法的区别TD方法的反演同策略的时序差分法:SARSASARSA的收敛性SARSA($\lambda$)时序差分法与动态规划法和蒙特卡洛法的区别动态规划法(DP): 需要状态模型,即状态转移矩阵Pss′aP_{ss&#x27;}^aPss′a..._td error

intellij 下编译单个(没有main函数的)java文件_没有main idea编译-程序员宅基地

文章浏览阅读1.8w次,点赞7次,收藏9次。图中这个按钮可以实现对单个没有main函数的java文件进行编译这个问题真是大写的草泥马,之前google了无数文章,也许是觉悟太低,就是没有找到问题解决方法,在今天偶的看到一篇叫“关于Intellij IDEA菜单项中Compile、Make和Build的区别”的文章后才无意间解决了这个问题,踏破铁鞋无觅处,得来全不费功夫啊啊啊啊!!_没有main idea编译