1. GPIO
1.1 GPIO引脚分布
引脚主要分为特殊功能的引脚和普通IO引脚;
其中灰色的是普通引脚,可以通过编程控制;
黄色的是特殊功能引脚,无法通过编程控制,具有独特的功能。
- VDD VSS用来接电源
- VBAT用来接备用电池
- BOOT0用来启动模式选择

VDD VSS名字来源:
MOS管中电流从漏极(D)流向源极(S):

为普通引脚分组为:
GPIOA GPIOB GPIOC GPIOD
1.2 IO的复用和重映射
一个IO引脚可以具备多个不同的功能:
例如如下的引脚,可以选择多个引脚的作用:

单片机上的外设很多引脚会重复,所以为了可以同时使用这些功能,
单片机具有引脚复用的功能,通过复用可以使得多个外设同时工作,
例如下图所示:
复用功能重映射:将冲突的复用功能映射到其他引脚上。

1.3 GPIO的四种输出模式
| 推挽 | 开漏 | |
|---|---|---|
| 通用 | 通用输出推挽 | 通用输出开漏 |
| 复用 | 复用输出推挽 | 复用输出开漏 |
具体的介绍细节可以参考:
https://blog.csdn.net/2301_81230001/article/details/166373728
1.4 GPIO的输出速度
具体的介绍细节可以参考:
https://blog.csdn.net/2301_81230001/article/details/166373728
1.5 GPIO-HAL库编程
首先生成代码模板后:
会在main函数中进行初始化:
如下所示:
c
int main(void)
{
/* 1. HAL库底层初始化 */
HAL_Init();
/* USER CODE BEGIN Init */
// 【时钟未升频!】MCU仍在内部低速时钟,慎用HAL_Delay()
/* USER CODE END Init */
/* 2. 配置系统主时钟(HSE/PLL,升到目标主频) */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
// 【时钟已经配置完成】主频正常,可以使用HAL_Delay()
/* USER CODE END SysInit */
/* 3. 所有外设初始化 */
MX_GPIO_Init();
MX_USART1_Init();
MX_ADC1_Init();
// ...其他MX_xxx_Init()
/* USER CODE BEGIN 2 */
// 所有外设初始化完毕后,放自己的初始化代码
/* USER CODE END 2 */
/* 主循环 */
while (1)
{
/* USER CODE BEGIN 3 */
/* USER CODE END 3 */
}
}
重点函数的功能:
| 函数 | 核心作用 | 关键限制 |
|---|---|---|
| HAL_Init() | 复位外设、初始化 Flash、SysTick 滴答定时器、设置中断分组 | ⚠️系统时钟仍是默认低速,不要在这里用串口、ADC 等外设,HAL_Delay 不准 |
| SystemClock_Config() | 配置 PLL、AHB/APB 分频,把系统时钟设置为 CubeMX 选定频率 | ⚠️必须在 HAL_Init 之后,所有 MX 外设初始化之前 |
| MX_GPIO_Init() | 开启 GPIO 端口时钟,配置引脚模式:推挽 / 开漏 / 输入 / 复用、上下拉、速率 | ⚠️必须在 SystemClock_Config 之后,否则 GPIO 外设时钟不生效 |
1.6 使用bootloader清除程序
如果没有选择调试接口-则单片机默认烧录一次就锁死芯片。
解锁的操作过程可以参考如下链接:
https://docs.baud-dance.com/docs/stm32/FAQ/CompilationFailed
1.7 GPIO四种输入模式
| 输入模式 | 核心说明 | 典型用途 | 要点 |
|---|---|---|---|
| 浮空输入(GPIO_NOPULL) | 引脚不接上拉/下拉电阻,电平不确定,受外界干扰大 | 外接自带上下拉的信号 | 悬空时电平抖动,一般不推荐单独使用 |
| 上拉输入(GPIO_PULLUP) | 内部接上拉电阻,无外部信号时默认高电平 | 按键输入(按键一端接GND) | 按键按下→低电平;松开→高电平 |
| 下拉输入(GPIO_PULLDOWN) | 内部接下拉电阻,无外部信号时默认低电平 | 按键输入(按键一端接VCC) | 按键按下→高电平;松开→低电平 |
| 模拟输入(GPIO_ANALOG) | 关闭数字输入缓冲,引脚进入模拟通道,不读高低电平 | ADC采集模拟电压 | 不能用GPIO_ReadPin读取,只能ADC采样 |
具体的介绍细节可以参考:
https://blog.csdn.net/2301_81230001/article/details/166373728
2. UART
2.1 UART基础知识
具体的介绍细节可以参考:
https://blog.csdn.net/2301_81230001/article/details/166490981
2.2 使用串口发送数据
在CubeMX中,串口具有多种工作模式:

串口 句柄
HAL库句柄:管理对应外设的结构体实例,保存外设地址、配置与运行状态,作为HAL库函数识别和操作外设的唯一凭证。
3. IIC
3.1 IIC基础知识
IIC- Inter-Integrated Circuit(集成电路间总线)
具体的介绍细节可以参考:
https://blog.csdn.net/2301_81230001/article/details/166373789
4. 时钟系统
4.1 时钟基础知识
具体的介绍细节可以参考:
https://blog.csdn.net/2301_81230001/article/details/166788037
HAL库中具有对应的时钟树图形化设置:
分为两部分:
- 小时钟树-主要涉及实时时钟 和看门狗

- 大时钟树- 主要涉及AHB ,APB1 APB2 等等挂载外设。

5. SPI
5.1 SPI基础知识
SPI= Serial Peripheral Interface- 串行外设接口
适用于高速,双向数据传输场景
具体的介绍细节可以参考:
https://blog.csdn.net/2301_81230001/article/details/166490957
5.2 SPI与外部Flash通信
首先需要选择SPI的工作方式:
在图形化界面有如下的选项;
一般单片机作为主机使用,

5. 中断
5.1 中断的基础知识
具体的介绍细节可以参考:
https://blog.csdn.net/2301_81230001/article/details/166788037
6. 定时器
6.1 基础知识
具体的介绍细节可以参考:
https://blog.csdn.net/2301_81230001/article/details/166794087?spm=1001.2014.3001.5501