stm32的时钟

155 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第11天,点击查看活动详情

1、时钟树

在这里插入图片描述

2、刨析

2.1、系统时钟(不配置默认内部8MHz,如寄存器版点亮LED)

3个时钟来源(HSI、HSE、PLL倍频)

2.1.1、HSI时钟

内部时钟8MHz(不稳定) 2个走向 1、到SW 2、经过2分频到PLLSRC

2.1.2、HSE时钟

外部晶振(4-16MHz) 4个走向 1、到PLLXTPRE 2、2分频到PLLXTPRE 3、到SW 4、128分频到RTCSEL CSS:时钟监视系统(外部时钟不工作,自动切换内部时钟)

2.1.3、PLL时钟

3个选择PLLXTPRE和PLLSRC(内部2分频,外部,外部2分频)

2.2、RTC和看门狗时钟

2.2.1、RTC时钟来源

1.高速外部HSE128分频 2.低速外部LSE 3.低俗内部LSI

2.2.2、看门狗时钟来源

3.低速内部LSI

2.3内部时钟输出(PA8)

1.系统时钟 2.高速内部 3.高速外部 4.PLL的2分频

3、库函数SystemInit()分析

3.1内部8MHz高速脉冲开启

在这里插入图片描述 在这里插入图片描述

3.1.1 RCC_CR

RCC时钟基地址强制转换为TypeDef指针类型 在这里插入图片描述 因为结构体成员都是32位(4字节),所以字节从CR一直往下都是4个字节4个字节的分配,符合寄存器的地址 所以可以直接引用改地址内容 在这里插入图片描述

3.2条件编译

在这里插入图片描述 因为是HD的,所以不满足CL,跳过编译,编译else后面语句 个人感觉没什么用(&运算F不变,0清0) 因为复位值就是0 在这里插入图片描述

3.3PLL设置

在这里插入图片描述 1.CR寄存器16、19、24位清0,HSE振荡器关闭、时钟监测器关闭、PLL关闭 2.CR寄存器18位清0,外部4-16MHz振荡器没有旁路 3.CFGR寄存器16、17、18、19、20、21、22位清0,HSI振荡器时钟经2分频后作为PLL输入时钟、 在这里插入图片描述

3.4清除中断标志位

在这里插入图片描述 因为是HD,所以前面都不会执行,直接执行最后 CIR寄存器16、17、18、19、20、23位置1, 在这里插入图片描述 在这里插入图片描述

3.5函数SetSysClock()

条件编译直接进入函数 在这里插入图片描述 前面定义了72MHz(可以换成想要的时钟,换宏定义) 条件编译直接进入函数72MHz 在这里插入图片描述 在这里插入图片描述

3.6函数SetSysClockTo72(void)

1.定义2个32位的变量,CR寄存器16位置1,HSE振荡器开启。 在这里插入图片描述 2.等待17位外部3-25MHz时钟就绪 或 到定时时间结束,跳出while 判断外部时钟是否就绪,就绪变量赋1,否则赋0 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 3.判断是否打开就绪 闪存编程手册 1启用预取缓冲区。2清零。3两个等待状态 设置分频系数:HCLK=72,PCLK2=72,PCLK1=36(sysclk系统时钟72) 在这里插入图片描述 在这里插入图片描述 4.条件编译 设置PLL 9倍,系统时钟、HCLK、PCLK2 72MHz,PCLK1 36MHz 在这里插入图片描述 5.使能PLL 等待完成 设置PLL为系统时钟 等待设置完成 在这里插入图片描述