STM32寄存器白话手册第二章聊聊最让人头大的时钟系统。很多朋友学寄存器上来就点灯点完灯就开始懵为什么GPIO配置明明对着参考手册写的程序就是不跑为什么同一个程序换个晶振就翻车十有八九问题都出在时钟这一关。时钟是STM32的脉搏所有外设的每一次翻转、每一次采样都依赖内部那棵庞大的时钟树。这章我就用大白话把RCCReset and Clock Control复位与时钟控制这部分掰开揉碎把CR、CFGR、AHB1ENR这些核心寄存器讲明白再带你把系统时钟从默认的HSI一步步切到PLL输出的72MHz全程用寄存器操作不用一行库函数。这套内容适合正在从库函数转向寄存器操作的人也适合那些已经能点灯但一直没搞懂时钟树原理的人。看完这章你能自己看懂时钟配置相关的代码能定位大部分程序跑不起来的时钟问题还能顺手把系统主频改成你自己想要的数值。1. 为什么要跟寄存器死磕时钟1.1 寄存器操作的本质先说个很多人纠结的问题有库函数不用非要去翻寄存器图什么库函数本质上是官方对寄存器的封装HAL库的HAL_RCC_ClockConfig()几十行代码展开来看就是连续对RCC寄存器做读-改-写操作。问题在于封装得越好离底层越远一旦出现问题你看到的只是函数返回HAL_ERROR但不知道它到底卡在哪一步。寄存器操作正好相反你能精确知道现在写的是哪个寄存器、操作的是哪一位、硬件会有什么反应。时钟这部分我尤其推荐用寄存器方式学原因很简单RCC是片上所有模块的电源总闸它出问题整个系统都瘫。而RCC寄存器数量不多每个寄存器的位段定义又很规整非常适合用来建立寄存器操作的心智模型。学会了RCC再去操作GPIO、定时器、串口都是同一个套路。1.2 时钟树到底在干什么STM32F1/F4系列的芯片内部有一个时钟树它做的事情就是把某个时钟源内部RC振荡器或外部晶振产生的信号经过一系列分频、倍频、开关控制最终送到CPU内核、存储总线、外设总线等各个模块。可以把它理解成一个水厂供水系统时钟源是水源PLL锁相环是加压泵AHB/APB预分频器是不同口径的管道外设时钟使能位就是各家各户的水阀。水厂不供水你家里拧开水龙头当然没水某个外设的时钟没使能你配置它的寄存器就毫无反应。这里有个新手最容易忽略的坑在F4系列上绝大多数外设的时钟默认是关闭的。注意不是频率不对而是彻底没时钟。你往GPIO的MODER寄存器里写数据如果该GPIO外设的时钟没打开写进去的数据根本到达不了硬件寄存器。表现就是你配置了半天引脚一点反应没有。1.3 这一章围绕三个问题展开整个RCC的操作归根结底就三个问题第一个时钟源选谁是内部的HSIHigh Speed Internal高速内部RC振荡器、HSEHigh Speed External高速外部晶振还是经过PLL倍频之后的主时钟第二个总线频率怎么分CPU核