ubuntu搭建基于arm-none-eabi-gcc,jlink驱动的环境,并实现stm32f103c8t6程序的编译链接和烧写
原创文章引用请标明网址,若本文章有侵权之处请联系删除
说明:
本文内容基于VMware上的ubuntu虚拟机,vmware的版本为15.01,安装的Ubuntu版本为19.0.4。虚拟机的安装很简单,大家可以参考网上的教程安装一下,这里推荐这篇博文:https://blog.csdn.net/zhengyangliu123/article/details/54780835。
个人观点
一直以来博主都是在keil环境下进行的stm32的开发,可谓是深深的被keil之流的IDE给惯坏了,但作为一个有追求的程序员,怎么能甘愿一直呆在IDE的象牙塔里,怎么也得出来看看,了解了解底层是怎么工作的,看看传说中只有架构师才触碰的GCC和makefile到底长啥样。
实际上,整个搭建过程可以让我们从更原始的节点了解stm32的工作过程,更能让我们对软件的工作方式有更深刻的印象。博主经历重重困难才实现了最终的烧录,当程序正常运行时,那一刻别提有多开心了,随即决定写一篇博客纪念一下,也希望能够对广大同行有所帮助。
主要步骤
1、安装arm-none-eabi-gcc
2、安装jlink驱动
3、更改工程核心文件
4、选择工程启动文件
5、编写链接文件
6、编写工程makefile
7、使用make进行编译链接并生成.bin和.hex文件
8、使用jlink对芯片进行烧录
1、安装arm-none-eabi-gcc
arm-none-eabi-gcc是属于gcc编译工具链,可以理解为针对arm工程的一个编译器,这个编译器只能用来编译裸奔程序,说白了就是不能编译带操作系统的工程,我们可能马上想到是否有能够编译操作系统的工程的版本,由于本博客属于入门级别,所以博主在这不多说太多,感兴趣的可以多了解以下arm-none-eabi-gcc相关系列,这里主要就是基本应用的使用。
它的主要基本功能就是实现编译:把源文件一般是.c文件(还可能是汇编文件,比如stm32工程的启动文件)编译成为.o文件,然后实现链接:把生成的.o文件链接得到目的文件,也就是最终我们要烧录到板子内的.hex或.bin文件。废话不多说,开始安装。
arm-none-eabi-gcc的安装包可以点这里下载:(https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads)
如图,选择合适的版本下载即可(自己的Ubuntu是多少位的尽量就下多少位的,否则后面会有些麻烦,这里博主用的是64位的,32位的可以到这个网站下载,可能都有点慢,国外网站你懂的)。
为便于管理,我们在根目录建立文件夹“STM32_Work_Space”,里面再建立“ARM_NONE_EABI_GCC”文件夹,把压缩包下载到ARM_NONE_EABI_GCC中并解压到当前目录。
我们可以在gcc-arm-none-eabi-8-2019-q3-update文件夹里bin文件夹里看到很多奇怪的文件,实际上这些文件就是用来编译的文件,不同的文件编译的目标不一样。它们都是要在命令行里进行调用,为了方便,我们把bin文件夹路径加到系统环境变量中去,这样我们就不用每次执行都要到这个目录下了,操作如下:
在终端输入:
$ sudo gedit /etc/profile
会打开一个里面写了看似很高级的内容的文本文档,具体是啥意思咱也不懂,反正在最后一行加上路径就完成任务了,如下:
然后保存,关闭。
输入以下命令更新环境变量文件,也可以重启虚拟机更保险:
$ source /etc/profile
或者:
$ . /etc/profile
然后我们在终端输入arm-none,再按tab键,看会不会自动补全为arm-none-eabi-,如果能,证明环境变量添加成功。
执行:
$ arm-none-eabi-gcc -v
查看版本,如果出现以下版本内容,表明成功安装并可以用了(一般需要重启下,否则只能在那一个终端有正确显示,再开个终端就会识别不了命令)。
2、安装jlink驱动
JLink驱动可以在下面这个网站下载deb版本,可以直接双击安装,省去不少麻烦(下载速度较慢,你懂的):
https://www.segger.com/downloads/jlink
在这里建议不要下载太新的版本,因为我们使用的JLink基本上都不太正版,容易被识别出来,导致使用的时候会出现不愉快,不过好像也能使用。这里博主使用的是5.10.19版本。
具体jlink的应用等到程序烧录时会介绍。
3、更改工程核心文件
好像keil使用的编译工具是ARMCC,这里用的arm-none-eabi-gcc还是有所不同,要在工程的核心文件中改两行,打开核心文件core_cm3.c,大概是要改下图显示的736和753行:
改成下图所示内容:
4、选择工程启动文件
工程启动文件使用的是v3.50库里面提供的启动文件,库路径如下:STM32F10x_StdPeriph_Lib_V3.5.0\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\gcc_ride7\startup_stm32f10x_md.s
玩过stm32对这个汇编写的启动文件应该不陌生,具体作用可以网上查一查了解了解,这里我们只是会用即可。
5、编写链接文件
链接文件主要指示连接过程,里面会指示芯片相关信息,比如flash和ram的大小,会跟具体的芯片类型有关系,这里我们使用的是stm32f103c8t6,需要的链接文件也可以在v3.50库里面找到,路径如下:
STM32F10x_StdPeriph_Lib_V3.5.0\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template\TrueSTUDIO\STM3210B-EVAL\stm32_flash.ld
里面具体内容如下:
/*
*****************************************************************************
**
** File : stm32_flash.ld
**
** Abstract : Linker script for STM32F103VB Device with
** 128KByte FLA