Keil MDK-ARM(µVision5)工程模板
STM32F103C8T6:汇编启动文件调用 C 函数 add()
归档与使用说明

────────────────────────────────

  1. 目录结构(建议)

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 工程

  1. 打开 µVision5 → Project → New µVision Project
    选择器件:STMicroelectronics → STM32F103C8

  2. Manage Run-Time Environment

    • CMSIS → Core

    • Device → Startup

  3. 添加已有文件
    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” 可查看汇编列表,便于调试。

结果正确

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐