RCC
AHB;自身时钟固定SPL 入口:无结构体;RCC_DeInit、RCC_HSEConfig、RCC_PLLConfig、RCC_SYSCLKConfig、RCC_APB2/APB1/AHBPeriphClockCmd、RCC_GetClocksFreq
寄存器组(基址 0x40021000):CR (00)、CFGR (04)、CIR (08)、APB2RSTR (0C)、APB1RSTR (10)、AHBENR (14)、APB2ENR (18)、APB1ENR (1C)、BDCR (20)、CSR (24)
完整数据流程
- 开 HSE 等 HSERDY
- 设 Flash 等待周期(
FLASH_ACR) CFGR设 HPRE / PPRE1 / PPRE2 分频- 设 PLLSRC、PLLMUL
- 使能 PLL 等 PLLRDY
- SW 切系统时钟到 PLL,等 SWS
- 用各 ENR 给外设开时钟
备注:APB1 ≤ 36MHz、APB2 ≤ 72MHz;APB1 分频 ≠ 1 时挂其下的定时器时钟 ×2;外设时钟位查手册
标准库初始化:上面那条流程的库写法,逐行对着 F11 跟一遍。
展开代码 · 27 行
GPIO
APB2;`APB2ENR`:IOPAEN = 2、IOPBEN = 3、IOPCEN = 4SPL 入口:结构体 GPIO_InitTypeDef(Pin / Speed / Mode);GPIO_Init、GPIO_SetBits、GPIO_ResetBits、GPIO_ReadInputDataBit、GPIO_Write
寄存器组(GPIOA 0x40010800,每路差 0x400):CRL (00)、CRH (04)、IDR (08)、ODR (0C)、BSRR (10)、BRR (14)、LCKR (18)
完整数据流程
- 开 GPIO 时钟
CRL/CRH每引脚配 4 位:MODE [1:0] + CNF [3:2]- 输出:
BSRR/BRR或ODR改电平 - 输入:读
IDR
备注:上拉 / 下拉输入 CNF = 10,由 ODR 决定上拉 (1) / 下拉 (0);BSRR 单条写、原子;引脚位偏移 = 引脚号 × 4
标准库初始化:上面那条流程的库写法,逐行对着 F11 跟一遍。
展开代码 · 26 行
EXTI
APB2;必须开 AFIO 时钟(`APB2ENR` bit0)SPL 入口:结构体 EXTI_InitTypeDef(Line / Mode / Trigger / LineCmd);EXTI_Init、GPIO_EXTILineConfig、NVIC_Init、EXTI_GetITStatus、EXTI_ClearITPendingBit
寄存器组:EXTI(基址 0x40010400)IMR (00)、EMR (04)、RTSR (08)、FTSR (0C)、SWIER (10)、PR (14);AFIO(基址 0x40010000)EVCR、MAPR、EXTICR1~4
完整数据流程
- 开 GPIO + AFIO 时钟
- GPIO 配输入(上拉 / 下拉 / 浮空)
AFIO_EXTICR选该线对应哪个端口- EXTI:IMR 使能、RTSR / FTSR 选触发沿
- NVIC 设优先级并使能
- ISR 处理后写 PR 清标志
备注:Line0~4 各占一个中断;Line5~9 共用、Line10~15 共用;不重映射但用 EXTI 也要开 AFIO
标准库初始化:上面那条流程的库写法,逐行对着 F11 跟一遍。
展开代码 · 40 行
USART
USART1 → APB2(bit14);USART2 / 3 → APB1(bit17 / 18)SPL 入口:结构体 USART_InitTypeDef(BaudRate / WordLength / StopBits / Parity / Mode / HWFlow);USART_Init、USART_Cmd、USART_SendData、USART_ReceiveData、USART_GetFlagStatus、USART_ITConfig
寄存器组(USART1 0x40013800,USART2 0x40004400,USART3 0x40004800):SR (00)、DR (04)、BRR (08)、CR1 (0C)、CR2 (10)、CR3 (14)、GTPR (18)
完整数据流程
- 开 GPIO + USART 时钟
- TX 配复用推挽,RX 配浮空 / 上拉输入
BRR按总线时钟算波特率CR1设字长 / 校验 / TE / RE,最后 UE = 1- 发:等 TXE → 写 DR → 等 TC
- 收:等 RXNE → 读 DR
备注:BRR = USARTDIV(整数 + 小数);中断方式用 CR1 的 RXNE / TXE 使能;printf 重定向 fputc
标准库初始化:上面那条流程的库写法,逐行对着 F11 跟一遍。
展开代码 · 48 行
SPI
SPI1 → APB2(bit12);SPI2 / 3 → APB1(bit14 / 15)SPL 入口:结构体 SPI_InitTypeDef(Direction / Mode / DataSize / CPOL / CPHA / NSS / BaudRatePrescaler / FirstBit);SPI_Init、SPI_Cmd、SPI_I2S_SendData、SPI_I2S_ReceiveData、SPI_GetFlagStatus
寄存器组(SPI1 0x40013000,SPI2 0x40003800,SPI3 0x40003C00):CR1 (00)、CR2 (04)、SR (08)、DR (0C)、CRCPR (10)、RXCRCR (14)、TXCRCR (18)、I2SCFGR (1C)、I2SPR (20)
完整数据流程
- 开 GPIO + SPI 时钟
- SCK / MOSI 复用推挽,MISO 浮空 / 上拉输入
CR1:MSTR、CPOL / CPHA、BR 分频、DFF、SSM + SSI、LSBFIRST- SPE = 1
- 等 TXE → 写 DR;等 RXNE → 读 DR;收尾等 BSY = 0
备注:全双工发 1 字节同时收 1 字节;NSS 常用软件 SSM + SSI;mode0 = CPOL0 / CPHA0,mode3 = CPOL1 / CPHA1;SCK = 总线时钟 / 2^(BR+1)
标准库初始化:上面那条流程的库写法,逐行对着 F11 跟一遍。
展开代码 · 47 行
I2C
APB1;I2C1EN = 21、I2C2EN = 22SPL 入口:结构体 I2C_InitTypeDef(ClockSpeed / Mode / DutyCycle / OwnAddress1 / Ack / AckAddr);I2C_Init、I2C_Cmd、I2C_GenerateSTART、I2C_Send7bitAddress、I2C_SendData、I2C_ReceiveData、I2C_CheckEvent
寄存器组(I2C1 0x40005400,I2C2 0x40005800):CR1 (00)、CR2 (04)、OAR1 (08)、OAR2 (0C)、DR (10)、SR1 (14)、SR2 (18)、CCR (1C)、TRISE (20)
完整数据流程
- 开 GPIO + I2C 时钟
- SCL / SDA 配复用开漏(需外部上拉)
CR2填 APB1 频率;CCR算时序、TRISE;DutyCycleOAR1自身地址、ACK、PE = 1- 发:START → 等 EV5 → 发地址 + W → 等 EV6 → 发数据 → STOP
- 收:START → 地址 + R → 配置 ACK / STOP → 读 DR
备注:标准 100kHz / 快速 400kHz;用事件 EV5 / EV6 / EV7 / EV8 检查;硬件 I2C 易卡死(BUSY 异常),工程常改用软件 I2C
标准库初始化:上面那条流程的库写法,逐行对着 F11 跟一遍。
展开代码 · 48 行
ADC
APB2;ADC1EN = 9、ADC2EN = 10、ADC3EN = 15;ADCK 由 `CFGR` 的 ADCPRE 分频SPL 入口:结构体 ADC_InitTypeDef(Mode / ScanConv / ContinuousConv / ExternalTrig / DataAlign / NbrOfChannel);ADC_Init、ADC_Cmd、ADC_RegularChannelConfig、ADC_ResetCalibration、ADC_StartCalibration、ADC_SoftwareStartConvCmd、ADC_GetConversionValue
寄存器组(ADC1 0x40012400,ADC2 0x40012800,ADC3 0x40013C00):SR (00)、CR1 (04)、CR2 (08)、SMPR1 (0C)、SMPR2 (10)、SQR1~3 (2C / 30 / 34)、DR (4C)
完整数据流程
- 开 GPIO(模拟输入)+ ADC 时钟
- ADCPRE 分频使 ADCK ≤ 14MHz(72 / 6 = 12)
- GPIO 配模拟输入 CNF = 00 / MODE = 00
CR1模式 / 扫描,CR2触发 / 连续 / 对齐 / DMASMPR设采样时间,SQR设转换顺序- ADON 后做复位校准 + 校准并等待
- 软件启动,等 EOC,读 DR
备注:12 位;必须校准;多通道常用 DMA 读 DR;双 ADC 模式由 CR1 配置;参考电压 VREF
标准库初始化:上面那条流程的库写法,逐行对着 F11 跟一遍。
展开代码 · 45 行
TIM
TIM2~4 → APB1(bit0 / 1 / 2);TIM1 → APB2(bit11)SPL 入口:结构体 TIM_TimeBaseInitTypeDef(Prescaler / CounterMode / Period / ClockDivision / RepetitionCounter);TIM_TimeBaseInit、TIM_Cmd、TIM_ITConfig、TIM_OC1Init、TIM_SetCompare1、TIM_CtrlPWMOutputs
寄存器组(TIM2 0x40000000、TIM3 0x40000400、TIM4 0x40000800,TIM1 0x40012C00):CR1 (00)、CR2 (04)、SMCR (08)、DIER (0C)、SR (10)、EGR (14)、CCMR1/2 (18 / 1C)、CCER (20)、CNT (24)、PSC (28)、ARR (2C)、CCR1~4 (34~40)
完整数据流程
定时中断:
- 开 TIM 时钟
PSC分频、ARR重装值CR1计数模式 / ARRPE,DIER使能更新中断- NVIC 使能
- CEN = 1
- ISR 清 UIF
PWM:另把 GPIO 配复用推挽 → CCMR 设 OCxM / 预装载 → CCER 使能 → CCR 设占空比
备注:周期 = (PSC + 1) × (ARR + 1) / TIM_CLK;定时器时钟在 APB1 分频 ≠ 1 时 ×2(= 72MHz);TIM1 高级定时器必须开 BDTR.MOE 才有 PWM
标准库初始化:上面那条流程的库写法,逐行对着 F11 跟一遍。
展开代码 · 60 行
DMA
AHB;`AHBENR`:DMA1EN = 0、DMA2EN = 1SPL 入口:结构体 DMA_InitTypeDef(外设 / 内存地址、DIR、BufferSize、Inc、DataSize、Mode、Priority、M2M);DMA_Init、DMA_Cmd、DMA_GetFlagStatus、DMA_ClearFlag、DMA_ITConfig
寄存器组(DMA1 0x40020000,DMA2 0x40020400):ISR (00)、IFCR (04),每通道 CCR (+0)、CNDTR (+4)、CPAR (+8)、CMAR (+C)
完整数据流程
- 开 DMA + 外设时钟
CPAR填外设地址、CMAR填内存地址CCR:方向、数据宽度、地址自增、正常 / 循环、优先级CNDTR填传输数量- 外设侧使能 DMA 请求(ADC / DMA、SPI CR2、USART CR3)
- EN = 1 启动
- 等 TCIF 或进中断
备注:DMA1 共 7 通道、DMA2 共 5 通道(大容量);通道与外设固定映射,必须查手册表;ADC 连续采集用循环模式
标准库初始化:上面那条流程的库写法,逐行对着 F11 跟一遍。
展开代码 · 31 行
CAN
APB1;CAN1EN = 25、CAN2EN = 26SPL 入口:结构体 CAN_InitTypeDef(Prescaler / Mode / SJW / BS1 / BS2 / ABOM / NART…);过滤器 CAN_FilterInitTypeDef;CAN_Init、CAN_FilterInit、CAN_Transmit、CAN_TransmitStatus、CAN_Receive、CAN_MessagePending
寄存器组(CAN1 0x40006400):MCR (00)、MSR (04)、TSR (08)、RF0R (0C)、RF1R (10)、IER (14)、ESR (18)、BTR (1C);发送 / 接收邮箱、过滤器 FMR / FM1R / FS1R / FFA1R / FA1R
完整数据流程
- 开 GPIO(RX 上拉、TX 复用推挽)+ CAN 时钟
- AFIO 重映射(可选 PA11/12 → PB8/9)
- 进初始化模式,
BTR配波特率 - 配过滤器(组号 / ID / 掩码 / 位宽 / FIFO)
- 退出初始化进入正常模式
- 发:填邮箱 ID / DLC / 数据 → TXRQ → 等完成
- 收:FIFO 有报文 → 读邮箱 → RFOM 释放
备注:波特率 = APB1 / [分频 × (1 + tBS1 + tBS2)];不过滤则收不到;标准帧 11 位 ID、扩展帧 29 位;CAN2 与 CAN1 共用过滤器
标准库初始化:上面那条流程的库写法,逐行对着 F11 跟一遍。
展开代码 · 75 行
没有匹配的模块。