1. 定时器(TIM)
核心功能:提供时间基准、生成PWM信号、实现输入捕获等功能,其运行依赖于“计数规则”与“输出状态”的正确配置。
必须初始化的关键寄存器包括:
- PSC(预分频器):用于设定定时器的计数时钟频率。若未设置,则计数频率无法控制,导致定时误差;
- ARR(自动重载寄存器):决定计数周期长度,例如每
ARR+1
个脉冲产生一次溢出。若未初始化,定时周期将混乱;
- CCMR(捕获/比较模式寄存器):配置通道工作模式(如PWM输出或输入捕获),未设置则通道功能不确定;
- CCER(捕获/比较使能寄存器):启用通道输出并设置极性,否则可能输出关闭或极性错误;
- DIER(中断使能寄存器):若需使用中断功能,必须明确开启更新中断或捕获中断,否则无法触发中断服务程序。
TIM_CLK/(PSC+1)
2. 串口(UART/USART)
核心功能:实现异步或同步数据通信,依赖正确的“数据帧格式”和精确的“波特率匹配”。
必须初始化的关键寄存器如下:
- BRR(波特率寄存器):决定通信速率,如设置不当会导致接收与发送数据错乱;
- CR1(控制寄存器1):启用USART模块,并配置字长(8位或9位)、是否启用奇偶校验等,未初始化则通信无法启动;
- CR2(控制寄存器2):设置停止位数量(1位或2位),若未配置,数据帧结构将出错;
- CR3(控制寄存器3):当使用硬件流控(如RTS/CTS)时必须初始化,否则可能导致缓冲区溢出或数据丢失。
USART_CLK/(16*BRR)
3. SPI/IC(同步通信接口)
核心功能:支持高速同步通信,要求严格匹配“时钟极性与相位”以及“从设备地址”信息。
SPI 需要初始化的寄存器:
- CR1(控制寄存器1):设置CPOL(时钟极性)、CPHA(时钟相位)、主从模式(MSTR)及波特率(BR),否则时钟与数据采样不同步;
- CR2(控制寄存器2):定义数据帧长度(8位或16位),未初始化将导致位宽错误。
IC 需要初始化的寄存器:
- CR1(控制寄存器1):启用IC外设并设置通信时钟频率(如100kHz标准模式或400kHz快速模式),未设置则速率不匹配;
- OAR1(自身地址寄存器1):作为从机时需设定设备地址,否则主机无法正确寻址;
- CCR(时钟控制寄存器):配置SCL线的时钟占空比,若未初始化,可能导致时钟信号畸变。
4. ADC(模数转换器)
核心功能:将模拟电压信号转换为数字值,依赖合理的“采样时间控制”和“数据输出格式”。
必须初始化的关键参数包括:
- SMPR(采样时间寄存器):设定各通道的采样周期(如1.5周期至239周期),未配置则可能造成精度下降或转换速度过慢;
- CR1(控制寄存器1):设置转换分辨率(12/10/8位)及是否启用扫描模式,影响整体转换行为;
- CR2(控制寄存器2):启用ADC模块并选择启动方式(软件触发或外部事件),否则无法开始转换;
- SQR(序列寄存器):定义多个通道的转换顺序,如先通道0后通道1,未初始化则顺序混乱。
5. GPIO(通用输入输出)
核心功能:管理引脚的电气行为与复用功能,依赖对“引脚模式”和“驱动特性”的精确配置。
关键初始化项包括:
- MODER(模式寄存器):确定每个引脚的工作模式(输入、输出、复用功能或模拟输入),未设置则功能不可预测;
- OTYPER(输出类型寄存器):选择推挽或开漏输出方式,错误配置可能导致总线冲突或驱动能力不足;
- OSPEEDR(速度寄存器):设定引脚切换速度等级(低、中、高),高频应用中若未设置会引起信号失真;
- PUPDR(上拉/下拉寄存器):为输入模式配置内部上拉或下拉电阻,避免浮空状态引入噪声干扰。
6. DMA(直接存储器访问)
核心功能:在无需CPU参与的情况下完成数据搬运,依赖清晰的“传输路径”与“操作规则”设定。
必须初始化的核心寄存器有:
- CPAR(外设地址寄存器):指定外设数据寄存器地址(如USART_DR),未初始化则读写目标错误;
- CMAR(内存地址寄存器):设置源或目标内存区域起始地址,否则数据存放位置异常;
- CNDTR(数据数量寄存器):定义需要传输的数据项总数,未设置则无法判断结束条件;
- CCR(控制寄存器):配置传输方向(内存→外设 或 外设→内存)、是否循环传输、数据宽度(8/16/32位)等,缺失则规则混乱。
总结:为何这些模块必须逐一初始化?
上述所有外设模块的共同特征是:
它们的功能实现高度依赖于一组明确且相互关联的初始配置规则。若未进行完整初始化,将引发以下后果:
- 功能失效:例如串口无法通信、定时器无法准确计时;
- 硬件异常:如GPIO引脚处于浮空状态引起外设误动作,或PWM输出异常损坏电机;
- 数据错误:如ADC采样结果偏差大,DMA传输地址错乱导致内存污染。
与DAC这类仅响应数值写入的被动模块不同,这些外设属于主动构建运行机制的类型——它们不是简单地“输出一个值”,而是“建立一套持续工作的逻辑”。因此,必须在系统启动阶段就对每一个相关寄存器赋以确定值,确保从上电到正常运行全过程处于可控状态。