摘要:

继上节介绍完stm32的开发流程和文本编辑工具之后,本节将介绍工具链中最重要的两个工具:编译器和下载器。


一、编译器

百度百科对编译器的解释:编译器就是将“一种语言(通常为高级语言)”翻译为“另一种语言(通常为低级语言)”的程序。一个现代编译器的主要工作流程:源代码 (source code) → 预处理器 (preprocessor) → 编译器 (compiler) → 目标代码 (object code) → 链接器 (Linker) → 可执行程序 (executables)
编译器的工作流程很多,但对于使用者来讲关键的步骤可以归纳为两个,分别是【编译】和【链接】。

  • 编译:对于当前应用场景来讲就是将C语言源文件或者STM32汇编文件编译为对应平台的二进制代码,编译器通过接收特定格式的参数来控制编译过程,比如可以设置目标平台、预定义宏、指定头文件搜索路径、优化等级等。编译器也会自带一些经常用到的库,比如abs函数,strcmp函数等以方便开发。
  • 链接:在一个STM32工程中,往往有许多C源文件,在编译时并不是一股脑塞给编译器,而是一个文件一个文件的编译,然后通过链接器链接起来成为最终的输出文件。
    例如函数foo在a.c中定义,在b.c中使用foo函数,在编译b.c时编译器找不到foo函数的定义也不会报错,而是将其作为一个符号接口记录下来,在链接时连接器负责匹配写符号接口,寻找foo函数的定义,然后将foo的符号接口和定义关联起来,如果找不到foo的定义,则链接器会报错。
  • 上面是关于编译和链接的简要介绍,实际上编译和链接涉及到的知识非常多,如果读者有兴趣研究,可参考《程序员的自我修养:链接、装载与库》这本书 。
  • 编译链接过程如下图

1、arm-gcc下载、安装和使用

本文选用arm-gcc作为编译工具,与vim一样,接触过Linux的读者对gcc的名字也不会陌生,gcc本身是PC平台的编译器,但后来有人在gcc的基础上将其改造为了可编译ARM平台代码的编译器。

下载

  • arm-gcc可直接在ARM官网获取【ARM官网】
  • 如果官网下载慢,可以去下面的百度网盘链接下载
    链接:https://pan.baidu.com/s/1OFFcCGsA-pFH4ns0f5Ecxg
    提取码:mri7

安装

arm-gcc安装比较简单,双击按照提示走就行了。
安装完成后会弹出如下界面,记得勾选“Add path environment variable”这一项,这样windows系统能正确找到arm-gcc的位置。

安装完成后验证,按win+r,然后输入cmd+回车,呼出控制台(win是键盘上印着windows的logo的按键),然后输入arm-none-eabi-gcc回车,如果出现以下输出则表示安装成功。

使用

本段简要介绍arm-gcc的使用方法,编写一个测试文件让arm-gcc编译,但由于目标平台是ARM,因此生成的文件不能在电脑上运行,仅作为概念性示范。

  1. 新建文件夹test,打开vscode,在vscode中选择打开文件夹,打开test文件夹。并新建test.c文件

  2. 在test.c中输入以下代码,这个代码不实现任何功能,仅作为测试

void test(void)
{int i;for(i=0;i<100;i++){}
}
  1. 打开vscode终端(终端->新终端),在终端中输入以下内容
arm-none-eabi-gcc -S test.c  -mcpu=cortex-m3  -o test.s#编译选项
-S  指定编译器只生成汇编代码
test.c 输入文件
-mcpu=cortex-m3    指定目标平台为cortex-m3,即stm32f103的内核
-o test.s  指定输出文件的名字为test.s

回车后能看到编译生成的汇编代码

示例中并没有main函数,这是因为编译阶段并不检查函数是否有定义,这步工作会在链接时完成。

2、openocd下载、安装和使用

有了编译器,还需要能将生成的二进制文件下载(烧写)到stm32的工具,这里的工具有两个,一个是硬件下载器,如stlink、jlink、cmsis-sap等,软件工具就是这里介绍的openocd。
关于openocd更详细的介绍->【openocd介绍】

安装

  • openocd可在其官网直接下载。【OPENOCD官网】
  • openocd是免安装的,下载后解压到一个目录下,然后将这个目录中的bin或bin-x64文件夹添加到环境变量中,目录路径最好不要带中文。【windows怎么添加环境变量】
    例如我的openocd解压到了E:\openocd-0.10.0这个目录下,并且我的电脑是64位的,我的环境变量设置如下图

验证

打开控制台,在控制台中输入openocd并回车,如果出现以下结果表明openocd安装成功,否则请检查你的环境变量是否设置正确。

openocd使用

  1. 复制一个keil工程下的二进制文件到上面新建的test目录下,例如我把点亮LED的二进制文件复制到test目录下

  2. 连接电脑、下载器和开发板,例如我是使用stlink+stm32f103

  1. 在上面的vscode终端中输入以下指令
openocd -f interface/stlink-v2.cfg  -f target/stm32f1x.cfg -c init -c halt -c "flash write_image erase LED_project.hex" -c reset -c shutdown
  • -f interface/stlink-v2.cfg 是下载器配置文件,这个文件在openocd安装目录scripts/interface目录下有,如果你使用的是其他下载器,需要更换成对应的配置文件
  • -f target/stm32f1x.cfg 是目标配置文件,同样在openocd安装目录scripts/target下有,如果要烧录stm32f4或者其他单片机,需要更换对应的配置文件
  • -c init 初始化
  • -c halt 挂起CPU,openocd在下载前需要先挂起停止CPU
  • -c "flash write_image erase LED_project.hex" 指定下载文件,这里的LED_project.hex就是前面复制过来的LED程序。
  • -c reset 复位CPU,运行程序
  • -c shutdown 关闭退出openocd
  1. 烧录完成后应该能看到程序运行结果

  2. 有的教程是先让openocd连接调试器后再用telnet连接到openocd下载,但windows没有telnet这个指令,因此采用这种一次性下载并退出的方式。


至此,我们介绍了编译器arm-gcc和下载器openocd的安装和使用,并使用openocd实际下载了程序到stm32中。
下一节将介绍编译控制和工程管理工具make。

【STM32开发】win平台开源工具链开发STM32(二)编译器和下载器相关推荐

  1. 官方iPhone SDK和开源工具链

    当Jobs宣称"iPhone SDK提供的是和苹果内部开发人员使用的相同的工具"时,他显然忘了在iPhone SDK发布之前几个月,就有人开始使用开源的Open Tool Chai ...

  2. linux mipi驱动分析_寒武纪社招内推数字IC设计、DSI驱动、软件架构、产品经理、芯片架构、工具链开发、深度学习、FAE工程师...

    点击上方蓝字关注我吧! 为什么内推更靠谱?内推是基于人脉关系链的推荐,其背后有一定的信用背书,靠谱的人推荐的人相对也会比较靠谱,所以企业一般职位都是从内部开始分享的,相较于自己海投简历,内推的效率和成 ...

  3. devops 开源工具链_使用开源工具构建DevOps管道的初学者指南

    devops 开源工具链 DevOps已成为修复缓慢,孤立或其他功能不正常的软件开发流程的默认答案. 但是,当您不熟悉DevOps并且不确定从哪里开始时,这并不意味着什么. 本文探讨了什么是DevOp ...

  4. 开发环境搭建---交叉工具链、makefile编写、连接器脚本、Eclipse调试

    交叉工具链 安装: 将arm-linux-gcc-4.3.2.tgz文件解压到linux根目录/下,可以发现解压后的文件在/usr/local/arm/4.3.2/文件下. 然后修改环境变量:执行命令 ...

  5. c++ eos智能合约开发_TrustBase平台智能合约的开发与实现

    2020年11月,TrustBase团队研究并实现了基于Web的波卡智能合约应用平台.鉴于波卡智能合约开发缺少完善易用的开发工具的支持,TrustBase团队自主开发了基于Substrate框架的全新 ...

  6. cmake:基于MDK(Keil)的Nationstech.N32G45x平台交叉编译工具链定义

    Keil MDK是非常常用的单片机开发集成环境,Keil公司2005年由ARM公司收购,现在是ARM主要的嵌入系统开发平台(ARM的另一个开发环境ds-5早在九年前就停止更新了). Keil虽然是个集 ...

  7. 区块链应用开发人员_每个区块链开发人员都应该了解这些Web3和Metamask用例

    区块链应用开发人员 by Igor Yalovoy 由Igor Yalovoy 每个区块链开发人员都应该了解这些Web3和Metamask用例 (Every blockchain developer ...

  8. 你必须知道的linux开发快捷键,熟知工具快速开发

    前言 节省时间就是提高效率,时间就是金钱,时间就是生命. 鲁迅名言:时间就是生命,无端地空耗别人的时间,其实是无异于谋财害命的.那如果你看到这篇文章不学习不点赞,无异于自杀. 你看了又不转发分享,无异 ...

  9. GNU工具链简介(GCC编译器+Binutils工具集+GDB调试器+make工具)

    以下内容源于网络资源的学习与整理,如有侵权请告知删除. 一.什么是工具链 在软件工程中,工具链(toolchain)是一系列用于制作软件的工具.它包括用来编辑源代码的文本编辑器.生成可执行文件的编译器 ...

最新文章

  1. 使用Python、OpenCV计算轮廓的中心
  2. CSS复合选择器(后代选择器、子元素选择器、并集选择器、伪类选择器、:focus伪类选择器)
  3. 我之我见:samba共享
  4. 【运筹学】表上作业法 ( 闭回路示例 )
  5. 服务器怎么虚拟化内存,服务器虚拟化内存大小
  6. Android7.0 PowerManagerService(1) 启动过程
  7. Java笔记-concurrent集合及线程池
  8. 第三节 整型和浮点型
  9. python运用列表编写水仙花数_Python 实现找出所有水仙花数的方法
  10. Excel 中的日期格式变成时间戳
  11. java-idea-常用的快捷键
  12. 读《C专家编程》笔记-关于内存泄漏
  13. 可任意设置时间的ppt倒计时软件
  14. tomcat配置前台访问日志记录
  15. 滴滴出行用户运营分析
  16. 【C/C++】fstream详解
  17. 00012.01抽象类与抽象方法(abstract)
  18. vant表单checkbox验证问题
  19. nexus配置阿里云仓库
  20. 【转】PPOE常见错误

热门文章

  1. HTML简单照片墙+CSS样式设计
  2. 沙拉查词配置浏览器外翻译(为你的电脑配置一个随时翻译器吧!)
  3. 如何精心设计CDN架构?
  4. 交叉熵损失函数原理详解
  5. VS Code菜单栏被隐藏如何恢复
  6. javaHTML5互动游戏新闻网站设计与实现计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
  7. matlab17b的tsne程序,TSNE三维图形
  8. java反射getmethod用法_Java反射之 getMethod() 与invoke的使用
  9. 腾讯团队,微信中使用到的视频技术,音视频研究
  10. Vue3.0引入Jquery