【嵌入式外设精学】Day19时钟HSI/HSE/PLL 与外设时钟今天解决主频怎么来的为什么串口/定时器要按“自己的时钟”算目录问题 2. 原理 3. 代码 4. 误区 5. 自测 6. 答案1. 问题改主频后波特率不对、定时不准外设“配了却不响应”2. 原理2.1 时钟从哪来源特点HSI片内 RC起振快精度一般HSE外接晶振更准通信常用PLL把时钟倍频到系统主频LSI/LSE低速给看门狗/RTC 等2.2 树状分发晶振/HSI → PLL → 系统主频 → AHB → APB1 / APB2 → 各外设UART、TIM、ADC…每个外设挂在哪条总线上就用那条总线的时钟去算波特率、定时周期。2.3 定时器时钟的小细节当 APB 预分频不是 1 时很多 MCU 上定时器时钟会再翻倍以芯片手册为准。所以算 PWM/定时周期时不要死记“等于主频”。2.4 用外设前先开门外设时钟默认可能关闭。不开时钟就配寄存器等于没配。3. 代码示例#includestm32f4xx.hvoidclock_and_bus_init(void){/* 示意HSE PLL 到系统主频具体库函数因系列而异 */RCC_DeInit();/* ... HSE on, wait ready, 配置 PLL, Flash 等待, 切换系统时钟 ... *//* APB1 / APB2 分频按应用配置 */RCC_PCLK1Config(RCC_HCLK_Div2);RCC_PCLK2Config(RCC_HCLK_Div1);/* 打开用到的外设时钟 */RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2|RCC_APB1Periph_USART2,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1|RCC_APB2Periph_GPIOA,ENABLE);}算 UART 分频时用该串口所在 APB 的真实时钟/* 概念根据 uart_pclk 与目标波特率填 USART_BRR */voiduart_set_brr(USART_TypeDef*u,uint32_tuart_pclk,uint32_tbaud){uint32_tdiv(uart_pclk(baud/2u))/baud;/* 简化示意系列相关 */u-BRRdiv;}4. 常见误区误区正解所有外设时钟主频分 APB1/APB2还可能翻倍忘开 RCC 外设时钟外设“死的”随便提主频Flash 等待、USB/通信分频要一起改用 HSI 当精密通信时钟易温漂关键通信优先 HSE5. 自测改主频要连带检查什么外设寄存器写了没反应可能缺什么6. 答案Flash 等待、总线分频、UART/TIM 计算用的时钟基准。该外设的RCC 时钟未使能。作者shuifanyu标签时钟RCCPLL