ubuntu 编译源码 无法开机-Linux下开发STM32:使用gcc-arm-none

1. 为什么不使用海湾合作委员会

开发stm32时ubuntu 编译源码 无法开机,编译工具链必须使用gcc-arm-none-eabi。 为什么不是海湾合作委员会? 这是关于Linux下的交叉编译。 由于我们需要在PC上编译一个可以在ARM上运行的程序,使用gcc来编译在PC上运行的程序,所以我们需要使用gcc-arm-none。 -eabi 用于交叉编译~

2.gcc-arm-none-eabitoolchain介绍及安装

gcc-arm-none-eabi 是适用于 ArmCortex-M 和 Coretex-A 系列处理器的开源 ARM 开发工具链,包括 GNU 编译器 (GCC) 和 GDB,可在 Windows、Linux、MacOS 上交叉编译。

这里我们选择合适的版本从【ARM官方下载链接】()下载(这里我选择Linux64):

解压后的包是tar.ba2格式的包。 使用命令 tar -jxf 将其解压到我们要安装的目录:

为了以后方便使用,将文件夹重命名为:

它下面的bin目录就是我们要使用的编译工具链:

共享目录的doc包含大量的使用帮助文档。 可以先默读一两篇,尤其是readme.txt:

接下来我们需要将bin目录添加到环境变量中,这样我们就可以在命令行中直接输入要使用的工具的名称,然后系统就可以找到该工具了。 这里我们只为当前用户添加环境变量,使用 vim~/.bashrc 编辑当前用户配置文件,在最后添加exportPATH=$PATH:/home/mculover666/gcc-arm-none-eabi/bin:

然后使用命令source~/.bashrc更新系统路径,使添加的环境变量立即生效:

然后输入命令arm-none,然后按Tab键三下(一定不要输入全部),检查系统是否可以手动完成:

如果系统提示,则说明环境变量配置成功,可以愉快的使用arm-none-eabi工具链了~

3.从裸机项目3.1开始。 硬件说明

这里我使用的是Wildfire Overlord开发板。 板载芯片为STM3232FF103103ZETZET6。 下载器使用电子链接。 这款下载器使用CMSIS-DAP来下载程序,还带有并口,非常好用~

板载RGB-LED原理图如图所示:

3.2. 创建一个新的空裸机项目

首先,创建一个新文件夹 mkdir00-template-reg 来存储整个项目。 那么整个项目包含三个文件:

#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源文件,分别编译:

参数说明

-mthumb

表示使用的指令集(必填)

-mcpu=皮质-m3

表示芯片核心(必填)

-G

生成调试信息

4.1. 开始文件编译

启动文件通常由程序集组成。 这里需要注意的是,汇编文件的格式分为.S和.s:

我们之前添加的启动文件是大写的.s,所以我们可以直接编译它。 另外,如果我们使用.S文件,则需要带上-xassembler-with-cpp参数

接下来,我们将解释gcc编译器在汇编文件中使用的一些参数:

参数说明

-xassembler-with-cpp

首先对文件进行预处理

-Wa,选项

将参数传递给汇编器 Assembler

注意:可以传递给汇编器的参数:

参数说明

-W 或 --no-warn

关闭所有闹钟

--致命警告

将所有警告视为错误

- 警告

正常警告信息

因此,我们可以使用如下参数组合来编译启动文件(不进行预处理,但会提示正常的警告信息):

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中没有什么特别的,只有两个函数,所以简单地编译它:

参数说明

-墙

允许输出所有警告

arm-none-eabi-gcc -c -mthumb -mcpu=cortex-m3 -g -Wall -o main.o main.c

5. 链接

链接有两个重要部分:链接文件和传递给链接器的参数。

其中stm32_flash.ld是STM3232FF103103ZE的链接文件。 如果是其他芯片,需要更改并复制到我们的项目中:

之后,我们需要让链接器根据stm32_flash.ld文件开始链接startup_stm32f10x_hd.o和main.o这两个文件ubuntu 编译源码 无法开机,生成包含调试信息的elf文件。 同时,我们还需要向链接器传递一些参数:参数描述

-T

指定链接文件

arm-none-eabi-gcc -o test.elf main.o startup_stm32f10x_hd.o -mthumb -mcpu=cortex-m3 -T stm32_flash.ld -specs=nosys.specs -static -Wl,-cref,-u,Reset_Handler -Wl,-Map=test.map -Wl,--gc-sections -Wl,--defsym=malloc_getpagesize_P=0x80 -Wl,--start-group -lc -lm -Wl,--end-group

6.生成bin文件和hex文件

arm-none-eabi-objcopy 工具可用于将 elf 文件转换为适合微控制器的 bin 文件和 hex 文件。 参数-O(小写o)用于指定输出文件的格式(默认为bin格式)

arm-none-eabi-objcopy test.elf test.bin
arm-none-eabi-objcopy test.elf -Oihex test.hex

7. 编译原型makefile

TARGET=test
CC=arm-none-eabi-gcc
OBJCOPY=arm-none-eabi-objcopy
RM=rm -f
CORE=3
CPUFLAGS=-mthumb -mcpu=cortex-m$(CORE)
LDFLAGS = -T stm32_flash.ld -Wl,-cref,-u,Reset_Handler -Wl,-Map=$(TARGET).map -Wl,--gc-sections -Wl,--defsym=malloc_getpagesize_P=0x80 -Wl,--start-group -lc -lm -Wl,--end-group
CFLAGS=-g -o
$(TARGET):startup_stm32f10x_hd.o main.o
    $(CC) $^ $(CPUFLAGS) $(LDFLAGS) $(CFLAGS) $(TARGET).elf
startup_stm32f10x_hd.o:startup_stm32f10x_hd.s
    $(CC) -c $^ $(CPUFLAGS) $(CFLAGS) $@
main.o:main.c
    $(CC) -c $^ $(CPUFLAGS) $(CFLAGS) $@
bin:
    $(OBJCOPY) $(TARGET).elf $(TARGET).bin
hex:
    $(OBJCOPY) $(TARGET).elf -Oihex $(TARGET).hex
clean:
    $(RM) *.o $(TARGET).*

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 源码编译 ubuntu 编译源码 无法开机-Linux下开发STM32:使用gcc-arm-none https://www.wkzy.net/game/196969.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务