本文使用的开发板为 stm32f103C8T6,使用的驱动库为stm32标准库。
目录
一、软件下载
1、stm32 标准库
2、arm-none-eabi 工具链
3、烧录器
二、Keil 工程改造
1、Keil 工程
2、基本 Makefile 工程
3、添加启动文件
4、添加链接脚本
5、去掉 core_cm3.c
三、Makefile 脚本
1、添加环境变量
2、Makefile 脚本
四、烧录
一、软件下载
工程搭建阶段:stm32f10x 标准库
工程编译阶段:arm-none-eabi 工具链、cmake(包含make指令)
程序烧录阶段:ST-Link
1、stm32 标准库
stm32 标准库下载地址:Download | Stm32 Standard Library
2、arm-none-eabi 工具链
arm-none-eabi 交叉编译工具链下载地址:Download | arm-none-eabi
stm32f103C8T6 内不含操作系统,所以需要选择裸机运行的工具链,这里选择arm-none-eabi 工具链。arm-none-eabi 的 “arm”代表支持 arm 架构,“none” 表示不指定目标操作系统,“eabi” 是 Embedded ABI 的缩写。
相比之下,arm-linux-gnueabi 虽然也支持 arm 架构,但面向的是 Linux 操作系统,“gnu” 表示使用的 C 库是 GNU C Library(通常称为 glibc),这是 Linux 系统上常用的标准库。
3、烧录器
ST-Link 下载地址:STSW-LINK004 - STM32 ST-LINK utility - STMicroelectronics
stm32 最合适的烧录器便是 ST-Link。ST-Link 是意法半导体(STMicroelectronics)开发的一种嵌入式调试器和编程器,专门用于STM8和STM32系列的微控制器。ST-Link的功能主要包括:
- 在线调试:通过SWD(Serial Wire Debug)或JTAG接口连接到目标微控制器,ST-Link允许用户使用集成开发环境(IDE)如STM32CubeIDE、Keil μVision 或 IAR Embedded Workbench进行源代码级别的调试。用户可以设置断点、单步执行、查看和修改内存及寄存器内容。
-
固件编程:ST-Link可以将编译好的HEX或BIN文件烧录到微控制器的闪存中,完成固件的更新或初次编程。
二、Keil 工程改造
1、Keil 工程
现在使用 Makefile 编译,我们需要将原本的工程进行简化,去掉一些 Keil 平台独有的文件,仅保留源文件和头文件。原 keil 工程结构如下。
- MODULE:保存自定义模块
- STM32F10x_LIB:stm32 标准库
- USER:保存主函数文件、启动文件、stm32系统文件
2、基本 Makefile 工程
MODULE、STM32F10x_LIB 无需做任何变动,USER 仅保留.c源文件、.h头文件,其他的先删除,.s 文件也不要,因为后续编译用的 gcc 编译器,需要使用支持 gcc 编译器的startup汇编文件。筛过一遍的Makefile工程如下(Makefile 文件留到最后写)
3、添加启动文件
解压stm32 标准库的压缩包,在 Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup 下包含了各种环境适配的启动文件。
选择 gcc_ride7 目录下的 startup_stm32f10x_md.s,md 代表了 flash 容量大小为medium density。
后缀 | flash 容量区间 |
ld | [0, 16KB] |
md | [32KB, 64KB) |
hd | [64KB, 128KB) |
4、添加链接脚本
链接脚本指示编译生成的各个段应如何被放置在内存中,Keil 存在默认配置,所以使用Keil 时无需关心这些,现在不使用 Keil 则需要通过链接脚本实现。标准库中也提供了链接脚本的模板,使用 everything 搜索 stm32_flash.ld 。下面任意一个均可。
添加到工程后,需要做一点改动,原 Keil 工程中有默认的配置,我们需要应用到链接脚本中。
起始地址可以直接照搬,IROM1 的Size 需要转换一下,0x10000 的单位是字节,需要转换成 KB,0x10000 Byte = 64 KB。
5、去掉 core_cm3.c
如果标准库中包含 core_cm3.c ,暂时先去掉,实际在编译时,该文件无法编译通过。
ps:如果要保留这个文件,修改方法可以参考这篇文章末尾:如何用gcc+makefile改造STM32Keil项目 - lqxhgd - 博客园 (cnblogs.com)
三、Makefile 脚本
1、添加环境变量
解压交叉编译工具链压缩包,并添加环境变量 ARM_NONE_EABI_ROOT,对应的值为 交叉编译工具链 arm-none-eabi 的根目录。同时将 bin 目录添加到环境变量 PATH
2、Makefile 脚本
Makefile 脚本参考:Linux Makefile Template
四、烧录
如果编译通过,会在 build 目录下生成 .elf、.bin 以及 .hex 文件,其中 .hex 和 .bin 适用于裸机环境,.elf 适用于包含操作系统的环境。
打开 ST-Link,连接到开发板,若连接成功可以看到右边的设备信息。
准备开始烧录
烧录成功后
参考文章:
keil 采用 makefile 实现编译_keil makefile-CSDN博客
如何用gcc+makefile改造STM32Keil项目 - lqxhgd - 博客园 (cnblogs.com)
【嵌入式】基于makefile的STM32编译方法探索 - 简书 (jianshu.com)