🔬 实验03:寄存器新建工程 & ST-Link 下载
📌 实验目标
- 掌握基于寄存器方式的工程建立方法
- 理解 STM32 存储器映射和寄存器地址
- 学会 ST-Link 调试驱动安装和下载配置
- 比较寄存器方式与库函数方式的异同
一、实验内容
- 不使用固件库,直接通过寄存器地址操作外设
- 新建纯寄存器工程模板
- 配置 ST-Link 调试器进行下载调试
- 使用 ST-Link Utility 验证烧录
二、寄存器方式原理
STM32 的外设寄存器有固定的地址映射。通过直接读写这些地址即可控制外设。
寄存器地址定义示例
// GPIOB 基地址: 0x40010C00
// GPIOB_CRL 偏移: 0x00
// GPIOB_ODR 偏移: 0x0C
// RCC_APB2ENR 基地址: 0x40021018
// 定义寄存器指针
#define RCC_APB2ENR (*(volatile unsigned long *)0x40021018)
#define GPIOB_CRL (*(volatile unsigned long *)0x40010C00)
#define GPIOB_ODR (*(volatile unsigned long *)0x40010C0C)
int main(void)
{
// 使能 GPIOB 时钟
RCC_APB2ENR |= (1 << 3);
// PB0 推挽输出,50MHz
// CRL 每4位控制一个引脚:[CNF1][CNF0][MODE1][MODE0]
GPIOB_CRL &= ~(0x0F << 0); // 清除 PB0 配置
GPIOB_CRL |= (0x03 << 0); // MODE=11(50MHz), CNF=00(推挽)
while (1)
{
GPIOB_ODR |= (1 << 0); // PB0 = 1
Delay(0xFFFFF);
GPIOB_ODR &= ~(1 << 0); // PB0 = 0
Delay(0xFFFFF);
}
}
💡 这段代码怎么用?
- 寄存器方式的本质:
RCC_APB2ENR(时钟) 与GPIOB_CRL/ODR(引脚) 都是直接操作内存地址,固件库只是把这些地址封装成函数 CRL每 4 位控制一个引脚:`[CNF1:CNF0:MODE1:MODE0]`,所以0x03=输出50MHz、CNF=00 推挽——背下这张表就能看懂所有 GPIO 配置- 本实验的意义在于「看懂底层」,日常开发用库函数更高效;遇到库函数查不到的坑时,回到寄存器就能定位问题
三、ST-Link 下载配置
- 将 ST-Link 连接到开发板的 SWD 接口(SWDIO、SWCLK、GND)
- Keil 中点击魔法棒 → Debug → 选择 ST-Link Debugger → Settings
- Flash Download → 勾选 Reset and Run(下载后自动运行)
- 点击 Download 按钮或按 F8 下载程序
四、参考资料
| 资料 | 文件 |
|---|---|
| 寄存器新建工程 RAR 包 | 寄存器新建工程、ST-Link下载.rar |
| ST-Link 调试教程 | STLINK调试补充教程.pdf |