末尾带全部工具,代码工程打包,直接一步搞定.
- 本文主题: ARM-GCC 套件 + VScode + OpenOCD + CMSIS-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 app
和make 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 app
和make 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文件关键点是设置:
- 正确的elf文件, elf文件是带有调试信息的编译结果,可以告诉gdb那一句汇编对应哪个文件,类似MDK环境下的axf文件.
- 正确的openocd 的2个配置文件.
- 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
更多关于嵌入式,编程欢迎关注,持续更新