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为系统时钟
等待设置完成
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为系统时钟
等待设置完成
举报