上一篇我们介绍了整套开发环境中的最重要的一环 :编译工具链。而在这篇中我们会介绍与其配合使用的makefile与调试器驱动,将这些工具结合,我们所需要的开发环境就简单的搭建完成了。最激动人心的:在这篇文章的最后我们将去尝试编译一个流水灯程序。
#Makefile
Make可以说是在Linux下最出色的一个工具,也许在我们刚刚接触时觉得它晦涩难懂,用着也不方便。但当你渐渐熟悉了他的用法,你会发现原来它是那么的强大。
那么Makefile到底是做什么的呢?这里我们就可以顺带着解释之前我们提出的问题了,难道编译的指令要一个一个文件的敲吗?显然不是。而Makefile就是帮助我们来敲编译指令的工具。也许这样描述有些抽象,而直接看Makefile的教程又有些生硬,让我们先来看一个样例工程的Makefile文件,先来简单的看看它到底是做什么的。
#工程的名称及最后生成文件的名字
TARGET = LED_project
#设定临时性环境变量
export CC = arm-none-eabi-gcc
export AS = arm-none-eabi-as
export LD = arm-none-eabi-ld
export OBJCOPY = arm-none-eabi-objcopy
#读取当前工作目录
TOP=$(shell pwd)
#设定包含文件目录
INC_FLAGS= -I $(TOP)/CORE \
-I $(TOP)/HARDWARE \
-I $(TOP)/STM32F10x_FWLib/inc \
-I $(TOP)/SYSTEM \
-I $(TOP)/USER
CFLAGS = -W -Wall -g -mcpu=cortex-m3 -mthumb -D STM32F10X_HD -D USE_STDPERIPH_DRIVER $(INC_FLAGS) -O0 -std=gnu11
C_SRC=$(shell find ./ -name '*.c')
C_OBJ=$(C_SRC:%.c=%.o)
.PHONY: all clean update
all:$(C_OBJ)
$(CC) $(C_OBJ) -T stm32_f103ze_gcc.ld -o $(TARGET).elf -mthumb -mcpu=cortex-m3 -Wl,--start-group -lc -lm -Wl,--end-group -specs=nano.specs -specs=nosys.specs -static -Wl,-cref,-u,Reset_Handler -Wl,-Map=Project.map -Wl,--gc-sections -Wl,--defsym=malloc_getpagesize_P=0x80
$(OBJCOPY) $(TARGET).elf $(TARGET).bin -Obinary
$(OBJCOPY) $(TARGET).elf $(TARGET).hex -Oihex
$(C_OBJ):%.o:%.c
$(CC) -c $(CFLAGS) -o $@ $<
clean:
rm -f $(shell find ./ -name '*.o')
rm -f $(shell find ./ -name '*.d')
rm -f $(shell find ./ -name '*.map')
rm -f $(shell find ./ -name '*.elf')
rm -f $(shell find ./ -name '*.bin')
rm -f $(shell find ./ -name '*.hex')
update:
openocd -f /usr/share/openocd/scripts/interface/stlink-v2.cfg -f /usr/share/openocd/scripts/target/stm32f1x_stlink.cfg -c init -c halt -c "flash write_image erase $(TOP)/LED_project.hex" -c reset -c shutdown
先说说这个文件怎么用吧,我们进入工程目录后使用make指令来执行它(Ubuntu是自带make工具的,所以不用下载安装),make工具就会调用目录下名为Makefile的文件,并根据其中的设置来执行指令。在这个makefile中就是生成hex和bin文件。
make
关于makefile的具体说明和教程,论坛大神陈皓曾经写过一个系列跟我一起写 Makefile其中把Makefile的功能和用法写的已经十分详尽了,大家可以去他的博客阅读学习或是百度下载一个网友总结好的PDF文档来学习。基本上看完前20%,你就可以理解上面这个makefile的意思和作用了。
在这篇中我们重点讲述软件的安装和功能介绍,其具体的用法会在之后的篇章中慢慢讲解。所以接下来我们先来看调试器驱动的介绍。
#调试器驱动
虽然我更建议大家且实际经常使用的是OpenOCD作为调试器驱动,但是我仍然会为大家讲解一下其他的驱动方式。
##st-link
在Linux上,st-link是有是一个专门的驱动的,在用户文件夹下输入git指令,从GitHub上下载驱动或直接打开网页下载也行。当然啦在使用git工具前首先要安装它。
$ sudo apt-get install git
$ git clone https://github.com/texane/stlink.git
https://github.com/texane/stlink
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fxKoejUu-1572081861901)(https://img-blog.csdn.net/20170130230840843?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhlbmd5YW5nbGl1MTIz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)]
在使用git下载命令后或下载好压缩包解压后我们就会得到一个文件夹,使用终端进入文件夹后,首先执行一下指令安装libusb和cmake程序,这2个程序是st-link驱动编译时需要的,所以需要先安装它。
$ sudo apt-get install libusb-1.0.0-dev
$ sudo apt-get install cmake
在安装完后,使用终端进入st-link驱动的文件夹执行指令:
$ cd ./stlink
$ make
$ cd ./build/Release
$ sudo make install
到这里st-link的驱动就安装完成了,下载的文件此时就可以删除了。这时连接st-link调试器,用lsusb命令就可以查看到相关的设备已经连接上,如下图。
注意在设备插上计算机后,要在虚拟机右下脚将st-link连接到虚拟机上
驱动程序可以通过终端指令来使用,如下载bin程序
$ st-flash write $hello.bin 0x8000000
在比如开启调试器将它接在计算机网络端口:4242上
$ sudo st-util
##j-link
Ubuntu下jlink的驱动安装可以参考这个文章,我之前安装过但好久没用了,所以不确定这篇文章的正确性,只是看着应该没有问题:(转载)JLink - JLink for Ubuntu
##OpenOCD
接下来就到了我们的重头戏了,OpenOCD,这绝对是是一个神一样的存在,忘了是在那里看到的简介了,如果没记错的话,这是一个国外研究生在上学时构思与完成的软件,它在Linux上运行并且支持几乎所有你见过的arm调试器,它在国内的介绍网页是这个:开源的JTAG上位机程序 OpenOCD
安装好它也就是说,不管什么st-link,j-link,open j-link之流的调试器,只要有OpenOCD就能驱动,就能使用,哈~这软件够强大吧。
下面我们就来介绍它的安装方式:
下载openocd
网址: http://sourceforge.net/projects/openocd/
解压
进入解压之后的目录 cd /openocd-0.10.0
进行配置
$ ./configure
如果这个时候出现错误提示 找不到usb.h,原因是没有安装libusb的库
下面安装Libusb库即可解决。
$ sudo apt-get install libusb++-dev
$ ./configure
在最后我们可以看到这个配置支持的调试器类型,有些偏门的调试器在默认设置下是没有打开的,我们可以通过类似于 ./configure --enable-jlink 的配置指令打开。
$ make
$ sudo make install
至此OpenOCD的安装便完成了,可以删除下载的文件了。完成安装后,我们可以在**/usr/local/share的路径下看到一个openocd**文件夹,在其下scripts文件夹下保存着我们以后使用OpenOCD连接调试器的配置文件。
如,在连接 stlink-V2+stm32f1xx 的硬件系统时我们使用指令来加载配置文件,从而下载程序:
openocd -f /usr/share/openocd/scripts/interface/stlink-v2.cfg -f /usr/share/openocd/scripts/target/stm32f1x_stlink.cfg -c init -c halt -c "flash write_image erase $(TOP)/LED_project.hex" -c reset -c shutdown
后加:有些同学的安装目录可能在其他位置,为了避免安装目录不同的影响,我们在运行openocd时可以简写路径,openocd会自动在其script路径下搜索脚本:
openocd -f interface/stlink-v2.cfg -f target/stm32f1x_stlink.cfg -c init -c halt -c "flash write_image erase $(TOP)/LED_project.hex" -c reset -c shutdown
#编译第一个程序
不论大家是否学会了使用前面那些工具,我们先放放让我们来编译一个小的流水灯工程来体会一下我们之前安装好的软件的功能吧。同时也体会一下在实际开发中,编译与下载程序的方式。
$ mkdir ~/workspace
$ cd ~/workspace
$ git clone https://github.com/zhengyangliu/simple-gcc-stm32-project.git
$ cd ./simple-gcc-stm32-project
使用文件浏览器打开工程目录,此工程目录结构与原子开发板教程配置的工程结构相同,我们打开user目录下的main.c文件,将其中的流水灯的GPIO口配置根据自己的 stm32f103 开发板修改。如果你是用的是原子的stm32f1战舰开发板V1版本,那么恭喜你,你不需要做任何的修改就可以使用了。
修改后我们使用终端在工程目录下执行make指令,生成hex和bin文件
$ make
make update
在下载完成后我们便能看到开发板上的LED闪烁了。
#总结
教程至此,我们已经将最基本开发环境的软件安装配置完成,而且也学到了很多新的指令如git、mkdir、make 等,也尝试了一个简单的流水灯工程的编译。但是我想大家距离理解这个开发环境的程度还很远,首先就是我们不理解makefile文件的语法和用法。这点就要求大家必须要去看至少20%的那篇跟我一起写 Makefile的文章,只有粗略的看得懂makefile我们才有继续下去的资本。
在你能多少理解makefile语法的基础上,我们接下来的几篇会为大家讲述编译器的指令和编译器的输入参数,同时我们会结合这篇中最后提供的样例工程中的makefile来分析在这个工程中makefile的意思和用法。
参考文章:
http://blog.163.com/brave_smile_heart/blog/static/187238171201261884412718/
http://blog.csdn.net/xiaofeng1234/article/details/38083211
http://blog.csdn.net/haoel/article/details/2886