🔬 实验03:寄存器新建工程 & ST-Link 下载

📌 实验目标
  • 掌握基于寄存器方式的工程建立方法
  • 理解 STM32 存储器映射和寄存器地址
  • 学会 ST-Link 调试驱动安装和下载配置
  • 比较寄存器方式与库函数方式的异同

一、实验内容

  1. 不使用固件库,直接通过寄存器地址操作外设
  2. 新建纯寄存器工程模板
  3. 配置 ST-Link 调试器进行下载调试
  4. 使用 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);
    }
}
💡 这段代码怎么用?
  1. 寄存器方式的本质:RCC_APB2ENR(时钟) 与 GPIOB_CRL/ODR(引脚) 都是直接操作内存地址,固件库只是把这些地址封装成函数
  2. CRL 每 4 位控制一个引脚:`[CNF1:CNF0:MODE1:MODE0]`,所以 0x03=输出50MHz、CNF=00 推挽——背下这张表就能看懂所有 GPIO 配置
  3. 本实验的意义在于「看懂底层」,日常开发用库函数更高效;遇到库函数查不到的坑时,回到寄存器就能定位问题

三、ST-Link 下载配置

  1. 将 ST-Link 连接到开发板的 SWD 接口(SWDIO、SWCLK、GND)
  2. Keil 中点击魔法棒 → Debug → 选择 ST-Link Debugger → Settings
  3. Flash Download → 勾选 Reset and Run(下载后自动运行)
  4. 点击 Download 按钮或按 F8 下载程序

四、参考资料

资料文件
寄存器新建工程 RAR 包寄存器新建工程、ST-Link下载.rar
ST-Link 调试教程STLINK调试补充教程.pdf