BOOT配置
BOOT是什么
1. 最简单比喻:开机选系统
你可以把STM32单片机想象成一台小电脑:
电脑开机可以选:Windows、U盘启动盘、PE维护系统;
单片机上电,靠 BOOT引脚 选「从哪里读程序运行」,这两个引脚就叫BOOT0、BOOT1。
BOOT = Bootloader = 启动选择开关
2. 单片机里三块能放程序的地方
单片机内部有3块存储区域,上电只能选其中一块启动:
- 主FLASH(日常用)
用ST-Link下载的固件就存在这里,掉电不丢失,产品正常工作就走这个。 - 系统存储器(出厂自带串口下载工具)
芯片出厂时厂家提前烧好一段专用小程序,功能是:通过串口接收新程序,写到FLASH里。
不用调试器,只用串口就能烧录代码。 - 片上SRAM(内存,断电清空)
临时内存,代码放这里断电就没,只用于临时调试。
3. BOOT0、BOOT1两个引脚的作用
上电瞬间,单片机会立刻读取这两个引脚的高低电平,根据电平组合决定"从哪一块区域启动":
| BOOT0 | BOOT1 | 启动位置 | 通俗场景 |
|---|---|---|---|
| 0 | x | FLASH | 正常跑自己写的程序(平时默认) |
| 1 | 0 | 系统存储 | 串口下载程序 |
| 1 | 1 | SRAM | 内存临时调试代码 |
若使用串口下载需要配置为ISP模式,也就是将BOOT0置1 BOOT1置0 ,在梁山派下载的时候先按下BOOT0按键,再按复位按键,最后点击软件上的下载
4. 补充

- 只上电瞬间生效
BOOT引脚只在开机/重启那一刻起作用,单片机正常运行后,你再按按键改变电平,不会有任何效果。 - BOOT1是复用引脚PB2
只有开机那一瞬间它是启动选择脚,程序跑起来之后,PB2可以当成普通IO口控制LED、按键等外设。
5.BOOT引脚为什么下拉电阻
一、不接下拉电阻:引脚悬空(浮空)的危害
BOOT引脚如果什么都不连接,属于高阻浮空状态,存在严重隐患:
- 引脚无固定电压,静电、周边走线干扰、人手触碰都会造成电压随机飘移;
- 电平高低完全不可控,上电时芯片误判BOOT电平;
- 故障现象随机:有时正常FLASH启动、有时自动进入串口下载模式、甚至直接死机跑飞,问题极难复现排查。
二、10k下拉电阻接地三大核心作用
电阻一端接BOOT引脚,一端接GND,实现稳定默认低电平:
- 锁定默认启动电平
按键松开无3.3V输入时,强制BOOT引脚稳定为0电平,上电固定从主FLASH启动,启动模式不会随机错乱。 - 不干扰按键高电平输入
按键按下后3.3V直接接入引脚,电源驱动能力远强于10k下拉电阻,引脚会被强制拉为高电平,下拉电阻不会屏蔽按键信号。 - 限流保护硬件
按键按下瞬间,3.3V通过10k电阻流向GND,限制回路电流;若无电阻会直接3.3V与GND短路,大电流烧毁芯片引脚或电源。
三、阻值选型:为什么统一用10k,不用1k/100k?
| 阻值 | 缺点 |
|---|---|
| 1k(过小) | 按键按下时对地电流大,持续消耗电能,功耗高 |
| 100k(过大) | 引脚阻抗太高,抗干扰能力差,轻微静电就能拉高电平,容易误触发启动模式 |
| 10k(标准值) | 功耗低、抗干扰能力均衡,是单片机IO上下拉通用折中阻值 |
四、一句话总结
10k下拉电阻作用:给BOOT引脚提供稳定默认低电平,避免浮空电平乱跳,保证上电启动模式可控,同时起到限流保护电路的效果。
GD32工程目录结构说明
| 文件夹名称 | 存放内容说明 |
|---|---|
| Project | 存放工程文件、编译生成中间文件、烧录文件等 |
| Firmware | 存放ARM CMSIS内核文件、GD32标准外设库底层文件 |
| Hardware | 存放开发板各类外设硬件驱动(OLED、DHT11、LED等驱动) |
| App | 存放项目业务应用层逻辑代码,功能业务处理 |
| User | 存放main主函数、gd32f4xx_it中断文件、systick系统滴答文件 |
| Doc | 存放readme、工程介绍、接线说明等文档资料 |
存储器
一、存储器基础概念
存储器是大量存储单元的集合,用于存储程序、数据信息;按使用类型分为两大类:
| 分类 | 说明 |
|---|---|
| ROM 只读存储器 | 断电数据不丢失,存放程序固件 |
| RAM 随机存储器 | 断电数据丢失,运行时临时缓存变量 |
二、存储器映射相关知识点
1. 存储器映射
存储器本身无地址,只是功能存储单元;由芯片厂商分配地址,给存储单元分配地址的过程称为存储器映射 。
分配地址后,可通过指针直接操作对应内存地址。
2. 存储器映射表
- GD32 为32位单片机,总寻址空间:232=4GB2^{32}=4\mathrm{GB}232=4GB;
- 存储映射遵循 Cortex-M4 内核统一规则,降低软件移植复杂度;
- 地址空间划分:
- 固定区域:Cortex-M4 系统内核外设占用,地址不可修改;
- 自定义区域:剩余地址由兆易创新芯片厂商分配给片上外设。
3. 寄存器映射
- 寄存器本质:拥有专属功能的特殊内存单元,读写寄存器即可控制外设;
- 操作逻辑:每个外设寄存器有固定起始地址,可用C语言指针访问;
- 寄存器映射定义:对已分配地址、具备特定功能的内存单元定义别名,这个别名就是寄存器名。
4. 总线基地址
片上外设挂载3条总线,总线速度区分,适配不同外设运行速率:
| 总线 | 最高时钟 | 特点 |
|---|---|---|
| AHB | 200MHz | 高速外设挂载 |
| APB2 | 100MHz | 中高速外设挂载 |
| APB1 | 50MHz | 低速外设挂载 |
总线最小起始地址称为总线基地址,也是该总线挂载第一个外设的起始地址。
5. 总线基地址与地址范围
配套参考图:

6. 外设基地址
每条总线下包含多个外设,每个外设拥有独立起始地址,即外设基地址。
配套参考图:
7. 外设寄存器地址
单个外设内部包含多个功能寄存器,每个寄存器相对外设基地址有固定偏移地址 。
寄存器完整地址 = 外设基地址 + 寄存器偏移量
配套参考图:

三、两种寄存器操作方式(实例:GPIOA全部引脚置高)
计算示例
GPIOA 基地址:0x40020000
输出寄存器 OCTL 偏移:0x14
寄存器完整地址:0x40020000+0x14=0x400200140\mathrm{x}40020000 + 0\mathrm{x}14 = 0\mathrm{x}400200140x40020000+0x14=0x40020014
方式1:绝对地址直接访问
c
// GPIOA 16个引脚全部输出高电平
*(unsigned int*)(0x40020014) = 0xFFFF;
方式2:宏定义别名访问
写法1:宏为地址指针
c
#define GPIOA_OCTL (unsigned int*)(0x40020014)
*GPIOA_OCTL = 0xFFFF;
写法2:宏直接封装解引用(常用标准库写法)
c
#define GPIOA_OCTL *(unsigned int*)(0x40020014)
GPIOA_OCTL = 0xFFFF;
LED
一、LED 电气参数(压降与工作电流)
直插 LED 参数
| 直插LED类型 | 压降范围 |
|---|---|
| 红色发光二极管 | 2.0~2.2V |
| 黄色发光二极管 | 1.8~2.0V |
| 绿色发光二极管 | 3.0~3.2V |
额定正常工作电流:20mA
1.2 贴片 LED 参数
| 贴片LED类型 | 压降范围 | 工作电流 |
|---|---|---|
| 红色发光二极管 | 1.82~1.88V | 5~8mA |
| 绿色发光二极管 | 1.75~1.82V | 3~5mA |
| 蓝色发光二极管 | 3.1~3.3V | 8~10mA |
二、梁山派板载 LED 硬件电路

三、LED 限流电阻计算公式
计算公式原理
单片机系统供电电压:3.3V
电阻分压公式:UR=VCC−VLEDU_R = V_{CC} - V_{LED}UR=VCC−VLED
欧姆定律:R=URIR = \dfrac{U_R}{I}R=IUR
计算示例
已知:贴片红色LED压降 1.8V ,工作电流取 5mA
1)电阻分担电压:3.3V−1.8V=1.5V3.3V - 1.8V = 1.5V3.3V−1.8V=1.5V
2)电阻阻值:R=1.5V5mA=300ΩR = \dfrac{1.5V}{5mA} = 300\OmegaR=5mA1.5V=300Ω
阻值选择说明
-
计算出的 300Ω 为临界参考阻值
-
实际可选用更大阻值电阻(如 1k、4.7k)
-
电阻越大 → 回路电流越小 → LED亮度越暗
-
可通过修改限流电阻阻值,自由调节LED亮度
寄存器版 LED 点灯配置流程
以 PD7(LED2) 为例,全程直接操作寄存器配置。
开启 GPIO 端口时钟
GD32 所有外设时钟默认关闭,配置外设前必须先开启对应总线时钟。
c
// 写法1:直接赋值
RCU_AHB1EN |= 0x00000008;
// 写法2:位操作(推荐、可读性高)
RCU_AHB1EN |= (1 << 3);
配置 GPIO 工作模式
分两步配置:模式选择 + 上下拉模式
配置为通用输出模式(GPIOx_CTL 寄存器)
c
// 写法1:掩码清零后赋值
GPIOD_CTL &= 0xffff3fff;
GPIOD_CTL |= 0x00004000;
// 写法2:通用位操作(通用适配任意引脚)
GPIOD_CTL &= ~(0x03 << (2*7)); // 清空PD7原有模式
GPIOD_CTL |= (0x01 << (2*7)); // 设置为输出模式
配置为浮空模式(GPIOx_PUD 寄存器)
c
GPIOD_PUD &= ~(0x03 << (2*7)); // 清空上下拉配置
GPIOD_PUD |= (0x00 << (2*7)); // 设置浮空模式
配置输出类型与速度
配置推挽输出(GPIOx_OMODE)
c
GPIOD_OMODE &= ~(0x01 << 7); // PD7 设置为推挽输出
配置最大输出速度 50MHz(GPIOx_OSPD)
c
GPIOD_OSPD &= ~(0x03 << (2 * 7)); // 清空原有速度配置
GPIOD_OSPD |= (0x02 << (2 * 7)); // 设置50MHz输出速度
寄存器控制 LED 亮灭(两种方式)
OCTL 端口输出控制寄存器
c
GPIOD_OCTL &= ~(0x01 << 7); // PD7 输出低电平,点亮LED2
GPIOD_OCTL |= (0x01 << 7); // PD7 输出高电平,熄灭LED2
BOP 端口位操作寄存器
BOP 寄存器高16位清零、低16位置1,无需移位取反,效率更高
c
GPIOD_BOP |= (0x01 << (7 + 16)); // 清零PD7(低电平)点亮LED2
GPIOD_BOP |= (0x01 << 7); // 置位PD7(高电平)熄灭LED2
寄存器点灯核心流程总结
-
开时钟:开启对应GPIO端口AHB1总线时钟
-
配模式:CTL寄存器设为输出、PUD寄存器设为浮空
-
配属性:OMODE设推挽输出、OSPD设输出速度
-
控电平:OCTL/BOP寄存器修改引脚高低电平,控制LED亮灭
库函数版 LED 点灯配置流程
一、GPIO 初始化配置流程
1. 开启 GPIO 端口时钟
开启 GPIOD 端口时钟,GD32 外设默认时钟关闭,必须先开启时钟。
c
/* enable GPIOD clock */
rcu_periph_clock_enable(RCU_GPIOD);
2. 配置 GPIO 工作模式
GPIO 模式配置分为两步:配置为输出功能、配置浮空模式。
c
gpio_mode_set(GPIOD, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_7);
3. 配置 GPIO 输出属性
配置推挽输出模式、输出速度为 50MHZ。
c
gpio_mode_set(GPIOD, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7);
二、库函数点灯操作(LED2-PD7)
点亮 LED2:让 PD7 输出高电平,三种库函数写法。
c
// 写法1:引脚置高
gpio_bit_set(GPIOD,GPIO_PIN_7);
// 写法2:指定引脚电平写入
gpio_bit_write(GPIOD,GPIO_PIN_7,1);
// 写法3:整端口电平写入
gpio_port_write(GPIOD,1);