STM32高级开发(5)-gcc-arm-none-eabi

发布者:二进制游侠最新更新时间:2022-06-20 来源: eefocus关键字:STM32  高级开发 手机看文章 扫描二维码
随时随地手机看文章

在完成对ubuntu的基本操作和指令的学习后,我们下面正式的进入有关于我们stm32/ARM单片机的软件安装过程。首先我们就要介绍这个会贯穿我们整个开发过程中的软件gcc-arm-none-eabi。


gcc-arm-none-eabi是什么

最直接的当我说出这个软件的时候,大部分童鞋可能会奇怪他到底是个什么呢?首先他是个软件这就不用多说了,做什么的软件呢?编译软件,或是准确点叫工具链。那么听起来是不是和keil、IAR感觉一样呢?我们是不是安装好他以后,打开获得一个界面导入代码就可以编译hex文件呢?答案是否定的。


又我们国内Keil+IAR环境教育出来的童靴们,很少会理解IDE其本质的含义。也许查询百度,他会告诉你IDE是集成开发环境,那么KEIL、IAR这样的IDE(集成开发环境)集成了什么功能呢?首先我们来看看他们的功能:


文本编辑器

编辑源代码文件,提供基础的文本编辑功能与语法加亮等功能。


编译器

编译与链接文件,使源代码文档可以转化为在单片机上执行的机器码格式文件。


调试器

连接单片机调试器硬件(如:jlink、ST-link等)实现单步执行、寄存器提取、资源监测等调试功能。


我们可以看到的是,在商业化的软件如KEIL之流,他们把很完善的功能都集成在了一个带有界面的程序中,所以叫他们IDE即集成开发环境,固然这样很方便,对于很多新手或刚入职的工程师来说,这样的软件极大的简化了他们距离实际编写程序的距离。但缺点也显而易见:它阻碍了童鞋们对编译器以及编译过程的理解,也在集成化的过程中缺少了很多可选择的高级功能。


经过上面的介绍我想大家已经理解了一个集成开发环境的构成,而我们所讲的gcc-arm-none-eabi就是其中的编译器的功能,更专业的,在嵌入式开发中我们一般将它叫做工具链。(工具链:一般由编译器、连接器、解释器和调试器组成)关于它的调试功能这个比较复杂,我们之后慢慢来讲。


在我们这个系列的第一篇STM32高级开发(1)-开源是什么的文章中我们就介绍了,gcc-arm-none-eabi是GNU项目下的软件,是一个面向裸机arm的编译器。那么说了这么多介绍,它都包含什么具体功能又怎么安装与使用呢,我们继续。


下载安装gcc-arm-none-eabi

首先打开gcc-arm-none-eabi项目的官网:


https://launchpad.net/gcc-arm-embedded/+download


在写这篇文章时它的软件版本已更新到了5_4-2016q3 。我们直接点击下面Linux版进行下载。在下载的过程中建议大家去网站的首页看看,随便逛逛了解一下gcc-arm-none-eabi。

这里写图片描述

在下载完成我们在用户目录下,并新建一个文件夹名叫:

Library,其实叫什么名字都行,只是以后我们所有的库和工具都会放在这里,所以就起名叫这个了,然后把下载好的压缩包放入Library文件夹中,并解压(右键压缩包选择解压到此处)。然后我们就可以删除压缩包了,或者放个地方存着以防以后还要用。

这里写图片描述

随后双击解压后的文件进入 gcc-arm-none-eabi-5_4-2016q3 -> bin

这个文件夹中的便是软件的执行文件了,不过他们都是通过指令行调用的,但是在终端调用之前,我们需要把软件的路径置于系统的环境变量之下,这样系统才能过直接调用程序,否则我们每次执行都需要输入长长的路径系统才能够找到软件。


打开终端输入:


$ sudo gedit /etc/profile


修改这个文件来添加我们的路径,ubuntu的环境变量文件有好多个,他们都在不同的时候起作用,具体的讲解可以看看这篇文章:Ubuntu系统环境变量详解,里面把这个问题讲的很清楚了,这个文章中列举的文件后几个也许你在自己的系统中找不到,但那只是系统没有创建设定,如果新建一个同样名称的文件他们依然是会起作用的。


再打开profile文件后我们在其末尾添加:


export PATH=$PATH:/home/yangliu/Library/gcc-arm-none-eabi-5_4-2016q3/bin


此处export意为设置变量,”PATH”是一个系统默认的内置变量即系统路径。”$PATH”,意为取值PATH变量。“:”代表拼接,用它来分割多个路径。后面的即为我们编译器执行文件的路径,这个根据大家自己的路径设置,可以随便点开一个执行文件查看他的路径复制粘贴即可。此处这行设置意为:将后面的路径与PATH之前的值合并,并更新给PATH,即将一段路径添加入PATH路径内。

这里写图片描述

随后点击保存。在终端中输入指令更新系统路径。


$ source /etc/profile


或,注意下面这个指令“.”后有空格,其效果与source 指令相同。


$ . /etc/profile


为了查看我们是否已经成功设置路径,在终端中输入:


$ arm-non


点击Tab看看系统是否自动补全为:arm-none-eabi-


$ arm-none-eabi-


如果补全了,那么说明我们已经设置成功了,我们此时可以直接键入指令来调用工具链的程序。如果没有,说明你上面的环境变量设置步骤有误请重新检查自己的操作。


双击两下Tab则会吧所有的工具链工具显示出来。

这里写图片描述

同时如果你安装的是64位的ubuntu版本,则需要安装lsb-core才能正常使用这个工具链,使用指令:


$ sudo apt-get install lsb-core


随后我们输入指令,来再次欣赏一下自己的成果,这个条指令意为显示工具链的版本。(是不是很长,记得我们的小技巧吗?只要输入”arm-”再按Tab就能补全指令啦,是不是很方便?)


 $ arm-none-eabi-gcc -v

这里写图片描述

之后重启一下,让系统更新全局环境变量。


注意以上操作,从source 开始请使用一个终端,不要关闭,否则可能出错:无法找到工具链。实际按理说source指令和重启的效果是一样的,但在我安装的过程中却出错了,重启之后才变正常了。


还有个检查的方法就是,使用指令查看当前系统PATH变量的值,查看是否PATH中是否有刚刚设置的路径:


$ echo $PATH

这里写图片描述

实际上Ubuntu的软件源中是有gcc-arm-none-eabi的,可以使用sudo apt-get install gcc-arm-none-eabi来安装,但是由于其版本一般落后于官方release 的版本故没有采用这个方式安装。


gcc-arm-none-eabi工具链工具使用方法及介绍

在我们安装好gcc-arm-none-eabi后,我们可以在终端中输入指令来调用gcc-arm-none-eabi的功能了,那么这个工具链下茫茫多的执行软件都是做什么的呢,可以看到在路径下一共有28个工具。接下来我们就来介绍一下我们将会用到的工具和他的功能及使用方式。


arm-none-eabi-gcc


这个工具为c语言编译器,可以将.c文件转化为.o的执行文件。如果大家不明白,.o是什么作用,建议大家去看一些关于编译过程和原理的介绍,如这篇文章:C语言的编译过程。


它的使用方法是,在终端中cd到工作目录,如编译当前目录下的hello.c文件,生成hello.o文件:


arm-none-eabi-gcc -c hello.c


arm-none-eabi-g++


这个工具为c++语言编译器,可以将.cpp文件转化为.o的执行文件,使用方式如上。


arm-none-eabi-ld


这个工具为链接器即最后链接所有.o文件生成可执行文件的工具。一般我们不使用 arm-none-eabi-ld 的指令调用它,而是通过使用arm-none-eabi-gcc 来调用,因为前者对c/cpp文件混合型生成的.o文件们的支持性不好,所以官方的说明书中也推荐使用arm-none-eabi-gcc 指令来代替arm-none-eabi-ld,如下:


arm-none-eabi-gcc -o  hello  hello.o


arm-none-eabi-objcopy


此工具将链接器生成的文件转化为bin/hex等烧写的格式,用以下载进入单片机。如下:


arm-none-eabi-objcopy hello hello.bin


arm-none-eabi-gdb


工具链中的调试器,将它连接到调试器硬件产生的网络端口,就可以进行硬件和代码的调试了。GDB是gnu下一个独特的调试软件,它具有很多自己的特性,也许大家无法想象使用命令行调试的景象,但是之后我们会看到它的强大。


当然这一系列的指令只是一个简单且包含用法错误的例子,实际的使用中我们要输入很多设置参数,才能适配我们的单片机,所以这个样例只是为了让大家理解工具链的调用方式,在我们之后的工程编写中会为大家介绍他们详细的用法。


实际的指令时这样的:

这里写图片描述

总结

至此,我们的工具链便介绍完成了,大家目前可能会有些疑问,难道编译过程就那么多命令行一个一个输入吗?一个一个文件手动编译?GDB又要怎么通过计算机网络端口连接到调试器呢?我们请看下一篇的讲解:STM32高级开发(6)-make与调试器驱动。

关键字:STM32  高级开发 引用地址:STM32高级开发(5)-gcc-arm-none-eabi

上一篇:STM32高级开发(16)-CMSIS DAP调试工程
下一篇:STM32高级开发(17)-使用DFU方案

推荐阅读最新更新时间:2024-11-12 11:15

STM32单片机(六)-STM32F103 时钟与F407时钟
STM32f103的时钟有四个来源 高速外部时钟信号(HSE)、低速外部时钟信号(LSE)、高速内部时钟信号(HSI)和低速内部时钟信号(LSI),图中分别用蓝色的①~④标注。 ①HSE高速外部时钟:由外部4~16MHz的晶体或有源晶振提供,通常采用8MHz,ST三合一板上的也是8MHz。 ②LSI低速外部时钟:外部晶体提供,主要是给实时时钟(RTC),一般为32.768kHz。 ③HSI高速内部时钟:由内部RC振荡器产生的8MHz时钟,但不够稳定。④LSI低速内部时钟:内部RC振荡器产生的供给RTC的时钟,频率在30kHz~60kHz之间,通常约40kHz。 时钟在STM32内部最终是供给四大块,图中用红色
[单片机]
<font color='red'>STM32</font>单片机(六)-STM32F103 时钟与F407时钟
stm32 串口通讯不成功的解决办法
首先要注意所用到的USART是否用到了复用功能 千万别忘了打开复用时钟!!!!!!!!! 代码如下:Hello! everyone,welcome to class! #include void delay_ms(u16 x) { u8 t; while(x--){for(t=0;t 120;t++);} } void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE); GPIO_InitS
[单片机]
<font color='red'>stm32</font> 串口通讯不成功的解决办法
关于stm32 的 USB 转串口 virtual_Com_Port的例程的一些问题
当从虚拟串口到真实串口发数据时,没有错误,但发送一个稍微大一点的文件时(如1M),误码率很高。不知是为什么? 其中: int main(void) { #ifdef DEBUG debug(); #endif Set_System(); Set_USBClock(); USB_Interrupts_Config(); USB_Init(); while (1) { if (count_out != 0) { USB_To_USART_Send_Data(&buffer_out , count_out);//这句是发数据的函数,原型如下。 count_out = 0;
[单片机]
基于STM32的逆变电源系统的设计与实现
在电气智能化发展无处不在的今天,无数用电场合离不开逆变电源系统(Inverted Pow er Supply System,IPS)为现场设备提供稳定的高质量电源,特别在如通信机房、服务器工作站、交通枢纽调度中心、医院、电力、工矿企业等对电源保障有苛刻要求的场合。许多IPS产品因遵循传统设计而不符合或落后于现代电源理念,突出表现为控制模块的单一复杂化,控制器芯片落后且控制任务繁重,模拟闭环控制而得不到理想的监控和反馈调节效果,并由此带来单个控制设备软硬件设计上的隐患,这对IPS电源输出造成不利影响,甚至对用电设备因为供电故障而导致灾难性后果。数字化控制技术日趋成熟,而且在某些理念的电源设备控制应用场合得到应用,凸显出模块化、数字化
[单片机]
STM32之CAN---接收管理分析
1 前言 当bxCAN接收到报文,经过过滤器过滤后,会将报文存储到FIFO中,由http://blog.csdn.net/flydream0/article/details/8148791一文中可知,每个过滤器组都会关联一个FIFO,由此可见,当接收到的报文通过过滤器后会被存储到此过滤器组关联的FIFO中(STM32共两个接收FIFO)。这个FIFO为3级邮箱深度,且完全由硬件来管理,从而节省了CPU的处理负荷,简化了软件并保证了数据的一致性。应用程序只能通过读取FIFO输出邮箱,来读取FIFO中最先收到的报文。 2 什么是FIFO输出邮箱? 在回答这个问题之前,首先要知道一些内容,STM32的bxCAN模式共有两个接收FIFO
[单片机]
<font color='red'>STM32</font>之CAN---接收管理分析
stm32基础知识汇总有哪些是你不知道的呢
  STM32是一种功能比较强大的32位单片机,广泛应用于各种嵌入式设备中,由于它的普及性及丰富的资源,受到广大嵌入式开发者的喜欢,但要想学好用好STM32也并非易事,毕竟,相比8位、16位产品,STM32要复杂得多。   STM32的时钟   其中,高速时钟(HSE和HSI)提供给芯片主体的主时钟.低速时钟(LSE和LSI)只是提供给芯片中的RTC(实时时钟)及独立看门狗使用,图中可以看出高速时钟也可以提供给RTC。内部时钟是在芯片内部RC振荡器产生的,起振较快,所以时钟在芯片刚上电的时候,默认使用内部高速时钟。而外部时钟信号是由外部的晶振输入的,在精度和稳定性上都有很大优势,所以上电之后我们再通过软件配置,转而采用外部
[单片机]
stm32 GPIO速率
GPIO的输出速率:GPIO电平每秒切换的最大次数, 单纯GPIO意义不大,不过在通讯方面对于GPIO是有要求的。 这个输出速率主要体现I/O驱动电路的输出反应能力,通过选择不同的输出驱动速率,实现最佳的噪声与和功耗控制。不难理解,选择输出驱动速率越高,噪声也越大,相应的芯片功耗也会越大。所以对于这个输出频率的选择,不要太随意,合适就好。在满足应用的需求的前提下,就不要随意往高端速率选择 gpio不同速率设置对实际开发的影响: 1、LED闪烁快慢不一致 2、Audio 噪声 其中有I2S的音频播放功能。在调试时用到Printf串口打印,发现使用printf输出时会出现噪音,如果关闭printf则正常。直到将UART的TX输出端口
[单片机]
大型车辆内轮差危险区域双向示警系统设计
摘 要:大型车辆由于自身车长,轴距长等特点在转弯过程中前轮与后轮轨迹不重合,形成“内轮差”区域。大型车辆发生的恶性 交通事故 中,由于“内轮差”引发的事故占70%以上。针对大型车辆转弯视觉盲区“内轮差”问题,本设计提出一套大型车辆 内轮差危险区域 双向示警系统的设计方案。整个系统模拟真实车辆转向过程。主控模块采用 STM32 进行控制,通过连接电路、实验调试后,该系统可以模拟真实车辆转向过程,并计算“内轮差”危险区域,进行相关 双向声光示警 ,能够达到预期目标,对有效减少大型车辆“内轮差”事故的发生提供解决方案。 *本项目获得“2020全国大学生集成电路创新创业大赛·创新实践项目组”辽宁省一等奖、东北赛区二等奖、国家级三等奖。
[汽车电子]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved