STM32F103C8T6:汇编启动文件调用 C 函数 add()
本文介绍了在Keil MDK-ARM(μVision5)环境下为STM32F103C8T6创建包含汇编启动文件调用C函数的工程模板。主要步骤包括:1)建立合理目录结构;2)创建Keil工程并配置CMSIS组件;3)编写汇编主文件(main.s)实现参数传递和C函数调用;4)实现C函数add();5)设置编译器/链接器选项。重点说明了AAPCS调用规范的使用,以及如何通过汇编设置参数(R0/R1)、
Keil MDK-ARM(µVision5)工程模板
STM32F103C8T6:汇编启动文件调用 C 函数 add()
归档与使用说明
────────────────────────────────
-
目录结构(建议)
ProjectRoot/
├─ Keil_Project/
│ ├─ Project.uvprojx / Project.uvoptx // Keil 工程文件
│ ├─ startup_stm32f10x_md.s // CMSIS 启动文件
│ ├─ main.s // 汇编主文件(含 AREA MYCODE)
│ ├─ add.c // C 函数实现
│ ├─ system_stm32f10x.c // CMSIS 系统时钟初始化(可选)
│ └─ RTE/ // CMSIS & Device 包文件
├─ Doc/ // 本文档
└─ Output/ // 编译输出 *.hex *.bin *.map
2. 创建/配置 Keil 工程
-
打开 µVision5 → Project → New µVision Project
选择器件:STMicroelectronics → STM32F103C8 -
Manage Run-Time Environment
-
CMSIS → Core
-
Device → Startup
-
-
添加已有文件
Project → Add Existing Files to Group ‘Source Group 1’:-
startup_stm32f10x_md.s(CMSIS 提供)
-
main.s(见第 3 章)
-
add.c(见第 4 章)
-
system_stm32f10x.c(如需要)
-
3. main.s(汇编主文件)
AREA MYDATA, DATA, READWRITE
ALIGN
AREA MYCODE, CODE, READONLY
ENTRY
EXPORT __main
IMPORT add ; 声明 C 函数 add
__main
; 设置参数 a = 10, b = 20
MOV R0, #10
MOV R1, #20
; 调用 C 函数 add(10,20)
BL add ; 结果返回在 R0
; 把结果保存到 R2(可替换为 LED 显示、串口发送等)
MOV R2, R0
; 死循环
DeadLoop B DeadLoop
END
说明
-
遵守 AAPCS:R0~R3 传递参数,R0 返回结果,调用者负责压栈 LR。
-
__main
是 Keil 链接脚本默认的入口符号,与 C 库的__main
不冲突(后者在启动文件中通过__iar_program_start
或__main
调用)。
────────────────────────────────
4. add.c
int add(int a, int b)
{
return a + b;
}
-
无需
#include "stm32f10x.h"
,因为函数内部不访问外设寄存器。 -
如需更改编译优化等级:Options for Target → C/C++ → Optimization。
──────────────────────────────── 5. 编译器/链接器设置
-
Options for Target → Output → Create HEX file
-
Options for Target → Linker → 使用默认 scatter file(Keil 自动生成)。
若手动脚本,确保add()
所在段.text
正确链接。 -
Listing → 勾选 “Generate assembler SRC” 可查看汇编列表,便于调试。
结果正确
更多推荐
所有评论(0)