单片机交流
登录
直播中
陈博
13年用户
591经验值
擅长:12268
私信
关注
[问答]
怎样用gcc-arm-none-eabi去开发stm32呢
开启该帖子的消息推送
STM32
GCC
Linux
为什么不是gcc开发
STM32
呢?
gcc-arm-none-eabi是什么?
怎样用gcc-arm-none-eabi去开发stm32呢?
回帖
(1)
王晋
2021-10-25 17:05:05
1.为什么不是gcc
在开发stm32的时候,编译工具链要使用gcc-arm-none-eabi,为什么不是gcc呢?这就要说到linux下的交叉编译了,因为我们要在PC机上编译出可以运行在ARM上的程序,使用gcc编译出的是在PC上运行的程序,所以我们要使用gcc-arm-none-eabi进行交叉编译~
2.gcc-arm-none-eabi toolchain 介绍及安装
gcc-arm-none-eabi是一个开源的ARM开发工具链,适用于Arm Cortex-M和Coretex-A系列处理器,包括GNU编译器(GCC),以及GDB,可用于Windows,Linux,MacOS上的交叉编译。
选择合适的版本下载(这里我选择Linux64):
解压下来是tar.ba2格式包,使用命令tar -jxf 《要解压的文件》解压到我们要安装的目录:
为了以后使用方便,将文件夹重命名:
它下面的bin目录就是我们要使用的编译工具链:
share目录的doc下包含了大量的使用帮助文档,可以先略读一二,特别是readme.txt:
接下来我们要将bin目录添加到环境变量,这样可以直接在命令行输入要使用的工具名,然后系统就可以找到该工具,在此我们仅为当前用户添加环境变量,使用vim ~/.bashrc编辑当前用户配置文件,在最后添加export PATH=$PATH:/home/mculover666/gcc-arm-none-eabi/bin:
然后使用命令source ~/.bashrc更新系统路径,使添加的环境变量立即生效:
然后输入命令arm-none,然后按三下Tab(一定不要输入全部),检查系统是否可以自动补全:
如果系统可以提示,说明环境变量配置成功,可以开心的使用arm-none-eabi工具链啦~
3.从裸机工程开始
3.1.硬件说明
这里我使用的是野火霸道开发板,板载芯片为STM32F103ZET6,下载器使用e-link,这个下载器使用CMSIS-DAP下载程序,同时并带有一个串口,非常好用~
板载RGB-LED的原理图如图所示:
3.2.新建空的裸机工程
首先新建一个文件夹mkdir 00-template-reg用来存放整个工程,然后整个工程包含三个文件:
startup_stm32f10x_hd.s:从固件库中拷贝,注意不是arm文件夹下的,因为truestudio使用的是gcc编译器,所以我们选择truestudio文件夹下的启动文件;
stm32f10x.h:空文件;
main.c:代码如下:
#include “stm32f10x.h”int main()
{
/* 开启GPIOB时钟 */
*(unsigned int*)(0x40021000+0x18) |= 1《《3;
/* 配置PB0为推挽输出 */
*(unsigned int*)(0x40010c00+0x00) |= 1《《(4*0);
/* PB0输出低电平,点亮绿色LED */
*(unsigned int*)(0x40010c00+0x0c) &= ~(1《《0);
while(1);
}
void SystemInit(void)
{
}
4.编译
接下来就是激动人心的编译步骤了~编译的时候有两种文件,一种是汇编启动文件,一种是c源文件,接下来分别编译
4.1.启动文件编译
启动文件一般是由汇编写成,此处需要注意的是,汇编文件的格式有.S和.s之分:
大写S:表明文件中含有预处理指令(比如#define),需要先进行处理;
小写s:表明文件不需要处理,可以直接编译;
之前我们添加的启动文件是小写.s,所以直接进行编译,另外说一下,如果使用的是.S文件,那么需要带上-x assembler-with-cpp参数。
接下来说明一些汇编文件gcc编译器使用的参数
所以,接下来我们可以使用如下的参数组合来编译启动文件(不进行预处理,并且正常提示告警信息):
arm-none-eabi-gcc -c -mthumb -mcpu=cortex-m3 -g -Wa,--warn -o startup_stm32f10x_hd.o startup_stm32f10x_hd.s
4.2.C文件编译
因为main.c中没有特殊的东西,只是两个函数,所以简单的编译一下就可以了:
5.链接
链接重要的部分有两点:链接文件和传递给链接器的参数。
其中 stm32_flash.ld是针对于STM32F103ZE的链接文件,如果是别的芯片,需要进行修改,将它复制到我们的工程中去:
然后就要让链接器开始根据 stm32_flash.ld这个文件对 startup_stm32f10x_hd.o和 main.o这两个文件开始链接,生成包含了调试信息的elf文件,同时,我们还需要给链接器传递一些参数:
6.生成bin文件和hex文件
利用arm-none-eabi-objcopy工具可以将elf文件转化为适合于单片机的bin文件和hex文件,其中参数-O(大写o)用于指定输出文件的格式(默认是bin格式)
arm-none-eabi-objcopy test.elf test.binarm-none-eabi-objcopy test.elf -Oihex test.hex 7.编写一个makefile雏形
使用命令make编译生成elf文件;
使用命令make bin将elf文件转化生成bin文件;
使用命令make hex将elf文件转化生成hex文件;
使用命令make clean即可清除掉所有编译产生的文件。
1.为什么不是gcc
在开发stm32的时候,编译工具链要使用gcc-arm-none-eabi,为什么不是gcc呢?这就要说到linux下的交叉编译了,因为我们要在PC机上编译出可以运行在ARM上的程序,使用gcc编译出的是在PC上运行的程序,所以我们要使用gcc-arm-none-eabi进行交叉编译~
2.gcc-arm-none-eabi toolchain 介绍及安装
gcc-arm-none-eabi是一个开源的ARM开发工具链,适用于Arm Cortex-M和Coretex-A系列处理器,包括GNU编译器(GCC),以及GDB,可用于Windows,Linux,MacOS上的交叉编译。
选择合适的版本下载(这里我选择Linux64):
解压下来是tar.ba2格式包,使用命令tar -jxf 《要解压的文件》解压到我们要安装的目录:
为了以后使用方便,将文件夹重命名:
它下面的bin目录就是我们要使用的编译工具链:
share目录的doc下包含了大量的使用帮助文档,可以先略读一二,特别是readme.txt:
接下来我们要将bin目录添加到环境变量,这样可以直接在命令行输入要使用的工具名,然后系统就可以找到该工具,在此我们仅为当前用户添加环境变量,使用vim ~/.bashrc编辑当前用户配置文件,在最后添加export PATH=$PATH:/home/mculover666/gcc-arm-none-eabi/bin:
然后使用命令source ~/.bashrc更新系统路径,使添加的环境变量立即生效:
然后输入命令arm-none,然后按三下Tab(一定不要输入全部),检查系统是否可以自动补全:
如果系统可以提示,说明环境变量配置成功,可以开心的使用arm-none-eabi工具链啦~
3.从裸机工程开始
3.1.硬件说明
这里我使用的是野火霸道开发板,板载芯片为STM32F103ZET6,下载器使用e-link,这个下载器使用CMSIS-DAP下载程序,同时并带有一个串口,非常好用~
板载RGB-LED的原理图如图所示:
3.2.新建空的裸机工程
首先新建一个文件夹mkdir 00-template-reg用来存放整个工程,然后整个工程包含三个文件:
startup_stm32f10x_hd.s:从固件库中拷贝,注意不是arm文件夹下的,因为truestudio使用的是gcc编译器,所以我们选择truestudio文件夹下的启动文件;
stm32f10x.h:空文件;
main.c:代码如下:
#include “stm32f10x.h”int main()
{
/* 开启GPIOB时钟 */
*(unsigned int*)(0x40021000+0x18) |= 1《《3;
/* 配置PB0为推挽输出 */
*(unsigned int*)(0x40010c00+0x00) |= 1《《(4*0);
/* PB0输出低电平,点亮绿色LED */
*(unsigned int*)(0x40010c00+0x0c) &= ~(1《《0);
while(1);
}
void SystemInit(void)
{
}
4.编译
接下来就是激动人心的编译步骤了~编译的时候有两种文件,一种是汇编启动文件,一种是c源文件,接下来分别编译
4.1.启动文件编译
启动文件一般是由汇编写成,此处需要注意的是,汇编文件的格式有.S和.s之分:
大写S:表明文件中含有预处理指令(比如#define),需要先进行处理;
小写s:表明文件不需要处理,可以直接编译;
之前我们添加的启动文件是小写.s,所以直接进行编译,另外说一下,如果使用的是.S文件,那么需要带上-x assembler-with-cpp参数。
接下来说明一些汇编文件gcc编译器使用的参数
所以,接下来我们可以使用如下的参数组合来编译启动文件(不进行预处理,并且正常提示告警信息):
arm-none-eabi-gcc -c -mthumb -mcpu=cortex-m3 -g -Wa,--warn -o startup_stm32f10x_hd.o startup_stm32f10x_hd.s
4.2.C文件编译
因为main.c中没有特殊的东西,只是两个函数,所以简单的编译一下就可以了:
5.链接
链接重要的部分有两点:链接文件和传递给链接器的参数。
其中 stm32_flash.ld是针对于STM32F103ZE的链接文件,如果是别的芯片,需要进行修改,将它复制到我们的工程中去:
然后就要让链接器开始根据 stm32_flash.ld这个文件对 startup_stm32f10x_hd.o和 main.o这两个文件开始链接,生成包含了调试信息的elf文件,同时,我们还需要给链接器传递一些参数:
6.生成bin文件和hex文件
利用arm-none-eabi-objcopy工具可以将elf文件转化为适合于单片机的bin文件和hex文件,其中参数-O(大写o)用于指定输出文件的格式(默认是bin格式)
arm-none-eabi-objcopy test.elf test.binarm-none-eabi-objcopy test.elf -Oihex test.hex 7.编写一个makefile雏形
使用命令make编译生成elf文件;
使用命令make bin将elf文件转化生成bin文件;
使用命令make hex将elf文件转化生成hex文件;
使用命令make clean即可清除掉所有编译产生的文件。
举报
更多回帖
rotate(-90deg);
回复
相关问答
STM32
GCC
Linux
gcc-arm-none-eabi
编译器有何作用
2022-01-26
1400
Linux下
开发
STM32
之使用
gcc-arm-none-eabi
工具链编译生成bin、hex文件
2021-07-01
951
基于
arm-none-eabi-gcc
和jlink如何
去
实现
stm32
f103c8t6程序的编译
2021-12-17
1244
在windows7上编译rtt遇到了
arm-none-eabi-gcc
的问题如何解决
呢
2022-06-27
2627
在
STM32
CubeIDE中如何修复
arm-none-eabi-gcc
错误
呢
2022-12-02
291
在
STM32
上如何使用
GCC
去
编译模板
呢
2021-10-25
723
arm-none-eabi-gcc
编译
STM32
F103C8流水灯没有闪
2019-03-08
3588
从Keil uVision执行
arm-none-eabi-gcc
.exe时导致错误的原因是什么?
2018-08-22
7374
FreeVTOS示例导入到Vivado 2017.2会产生多个错误
2019-04-28
2477
按照荔枝派nano教程移植rt-thread,提示make:
arm-eabi-gcc
:命令未找到怎么解决?
2022-03-25
1832
发帖
登录/注册
20万+
工程师都在用,
免费
PCB检查工具
无需安装、支持浏览器和手机在线查看、实时共享
查看
点击登录
登录更多精彩功能!
首页
论坛版块
小组
免费开发板试用
ebook
直播
搜索
登录
×
20
完善资料,
赚取积分