摘要:

继上节介绍完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的位置。

stm32f103用stmcubemx编译 stm32编译器_官网

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

stm32f103用stmcubemx编译 stm32编译器_单片机_02

使用

本段简要介绍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

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

stm32f103用stmcubemx编译 stm32编译器_配置文件_03

示例中并没有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位的,我的环境变量设置如下图

stm32f103用stmcubemx编译 stm32编译器_配置文件_04

验证

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

stm32f103用stmcubemx编译 stm32编译器_编译器_05

openocd使用
  1. 复制一个keil工程下的二进制文件到上面新建的test目录下,例如我把点亮LED的二进制文件复制到test目录下
  2. stm32f103用stmcubemx编译 stm32编译器_配置文件_06

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

stm32f103用stmcubemx编译 stm32编译器_单片机_07

  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. stm32f103用stmcubemx编译 stm32编译器_配置文件_08

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

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