梁山派学习笔记1

BOOT配置

BOOT是什么

1. 最简单比喻:开机选系统

你可以把STM32单片机想象成一台小电脑:

电脑开机可以选:Windows、U盘启动盘、PE维护系统;

单片机上电,靠 BOOT引脚 选「从哪里读程序运行」,这两个引脚就叫BOOT0、BOOT1。

BOOT = Bootloader = 启动选择开关

2. 单片机里三块能放程序的地方

单片机内部有3块存储区域,上电只能选其中一块启动:

  1. 主FLASH(日常用)
    用ST-Link下载的固件就存在这里,掉电不丢失,产品正常工作就走这个。
  2. 系统存储器(出厂自带串口下载工具)
    芯片出厂时厂家提前烧好一段专用小程序,功能是:通过串口接收新程序,写到FLASH里。
    不用调试器,只用串口就能烧录代码。
  3. 片上SRAM(内存,断电清空)
    临时内存,代码放这里断电就没,只用于临时调试。

3. BOOT0、BOOT1两个引脚的作用

上电瞬间,单片机会立刻读取这两个引脚的高低电平,根据电平组合决定"从哪一块区域启动":

BOOT0 BOOT1 启动位置 通俗场景
0 x FLASH 正常跑自己写的程序(平时默认)
1 0 系统存储 串口下载程序
1 1 SRAM 内存临时调试代码

若使用串口下载需要配置为ISP模式,也就是将BOOT0置1 BOOT1置0 ,在梁山派下载的时候先按下BOOT0按键,再按复位按键,最后点击软件上的下载

4. 补充

  1. 只上电瞬间生效
    BOOT引脚只在开机/重启那一刻起作用,单片机正常运行后,你再按按键改变电平,不会有任何效果。
  2. BOOT1是复用引脚PB2
    只有开机那一瞬间它是启动选择脚,程序跑起来之后,PB2可以当成普通IO口控制LED、按键等外设。

5.BOOT引脚为什么下拉电阻

一、不接下拉电阻:引脚悬空(浮空)的危害

BOOT引脚如果什么都不连接,属于高阻浮空状态,存在严重隐患:

  1. 引脚无固定电压,静电、周边走线干扰、人手触碰都会造成电压随机飘移;
  2. 电平高低完全不可控,上电时芯片误判BOOT电平;
  3. 故障现象随机:有时正常FLASH启动、有时自动进入串口下载模式、甚至直接死机跑飞,问题极难复现排查。
二、10k下拉电阻接地三大核心作用

电阻一端接BOOT引脚,一端接GND,实现稳定默认低电平:

  1. 锁定默认启动电平
    按键松开无3.3V输入时,强制BOOT引脚稳定为0电平,上电固定从主FLASH启动,启动模式不会随机错乱。
  2. 不干扰按键高电平输入
    按键按下后3.3V直接接入引脚,电源驱动能力远强于10k下拉电阻,引脚会被强制拉为高电平,下拉电阻不会屏蔽按键信号。
  3. 限流保护硬件
    按键按下瞬间,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. 存储器映射表

  1. GD32 为32位单片机,总寻址空间:232=4GB2^{32}=4\mathrm{GB}232=4GB;
  2. 存储映射遵循 Cortex-M4 内核统一规则,降低软件移植复杂度;
  3. 地址空间划分:
    • 固定区域:Cortex-M4 系统内核外设占用,地址不可修改;
    • 自定义区域:剩余地址由兆易创新芯片厂商分配给片上外设。

3. 寄存器映射

  1. 寄存器本质:拥有专属功能的特殊内存单元,读写寄存器即可控制外设;
  2. 操作逻辑:每个外设寄存器有固定起始地址,可用C语言指针访问;
  3. 寄存器映射定义:对已分配地址、具备特定功能的内存单元定义别名,这个别名就是寄存器名。

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

寄存器点灯核心流程总结

  1. 开时钟:开启对应GPIO端口AHB1总线时钟

  2. 配模式:CTL寄存器设为输出、PUD寄存器设为浮空

  3. 配属性:OMODE设推挽输出、OSPD设输出速度

  4. 控电平: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);
相关推荐
AI云海10 小时前
利用好手机这个工具-碎片化学习
学习
β添砖java12 小时前
2025最新快速构建企业级虚拟专用网络环境学习笔记
笔记·学习
qianpeng413 小时前
IDA PRO笔记
笔记
Yang_jie_0316 小时前
笔记:数据结构(顺序表)
数据结构·windows·笔记
WZF-Sang17 小时前
网络基础——2
服务器·网络·c++·学习·网络编程·php
心中有国也有家18 小时前
E-Brufen 技术选型全景:Flutter + 鸿蒙 + Hive CE
hive·hadoop·学习·flutter·华为·harmonyos
没头脑的男大19 小时前
CMake学习教学
linux·c++·学习
New农民工19 小时前
射频芯片学习-ExpressLRS 对频流程分析
学习
Tom@敲代码19 小时前
js学习笔记-01
javascript·笔记·学习