摘要:
继上节介绍完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,因此生成的文件不能在电脑上运行,仅作为概念性示范。
-
新建文件夹test,打开vscode,在vscode中选择打开文件夹,打开test文件夹。并新建test.c文件
-
在test.c中输入以下代码,这个代码不实现任何功能,仅作为测试
void test(void)
{
int i;
for(i=0;i<100;i++)
{
}
}
- 打开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使用
-
复制一个keil工程下的二进制文件到上面新建的test目录下,例如我把点亮LED的二进制文件复制到test目录下
-
连接电脑、下载器和开发板,例如我是使用stlink+stm32f103
- 在上面的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
-
烧录完成后应该能看到程序运行结果
-
有的教程是先让openocd连接调试器后再用telnet连接到openocd下载,但windows没有telnet这个指令,因此采用这种一次性下载并退出的方式。
至此,我们介绍了编译器arm-gcc和下载器openocd的安装和使用,并使用openocd实际下载了程序到stm32中。
下一节将介绍编译控制和工程管理工具make。