2024年3月24日发(作者:)

Gcc 环境下stm32开发笔记

最近在移植公司的系统到stm32中,发现该系统使用的是gcc 开发的,可是一

般情况下stm32都是在集成环境下开发的,这时候就有很多以前集成开发环境做的事

情需要我们自己编写makefile ,链接器脚本和启动代码。

由于公司的启动代码部分是采用C语言编写的,但是我不喜欢C的启动代码,

所以我查阅了相关资料,把keil里面自带的启动代码,经过转换,转化成在gcc 下可

以用的启动代码,本文中所有的代码经过编译,运行成功的,最后在C环境下点亮

LED等来显示效果,需要完成这些功能至少需要以下几个文件Start.s main.c

system_stm32f10x.c stm32f10x_rcc.c stm32f10x_gpio.c,以及st标准库的所有头文

件以防编译出错。

Gcc 开发最主要的要完成3个步骤,搭建起C语言的编程环境,其他的任何平

台都是一样的。这3个步骤分别是,编写链接脚本,编写Makefile ,编写启动代码,

这些完成了之后,以后的开发工作就都是一样的了。

闲话不说,首先我们把链接脚本贴上来。

/*宏定义处理器架构为arm*/

OUTPUT_ARCH(arm)

/*定义入口函数*/

ENTRY(Reset_Handler)

/*定义内存组织结构*/

MEMORY

{

}

/*定义代码段*/

SECTIONS

{

/*代码最开头部分是中断向量表*/

/*我用的芯片是stm32f103 内存32K Flash 512K*/

RAM(xrw) : ORIGIN = 0x20000000,LENGTH = 32K

FLASH(rx): ORIGIN = 0x08000000,LENGTH = 512K

. = ALIGN(4);

.text :

{

/*4字节对齐*/

KEEP(*(.isr_vector))

*(.text)

} > FLASH

. = ALIGN(4);

__etext = .; /*代码段结束 . 代表单前地址*/

/*定义数据段*/

.data : AT (__etext)

{

__data_start__ = .;

*(vtable)

*(.data*)

. = ALIGN(4);

PROVIDE (__preinit_array_start = .);

*(.preinit_array)

PROVIDE (__preinit_array_end = .);

. = ALIGN(4);

PROVIDE (__init_array_start = .);

*(SORT(.init_array.*))

*(.init_array)

PROVIDE (__init_array_end = .);

. = ALIGN(4);

PROVIDE (__fini_array_start = .);