STM32F1系列HAL库配置系统时钟
其实一开始对于时钟我也是知之甚少,在MSP432中我就一直忽视时钟配置,其实也是在STM32学习时落下的病根,现在趁有空补一下。
时钟简单讲解
对于时钟系统,在之前我写启动文件涉及到,其实,每个功能的实现都涉及到时钟。我们首先说明一下RCC
RCC:复位和时钟控制
什么是复位,什么又是时钟?在STM32参考手册中文版我们可以看到
注意“除了时钟控制器的RCC_CSR寄存器中的复位标志位和备份区域中的寄存器(见图4)以外,系统复位将复位所有寄存器至它们的复位状态。”这句话告诉我们复位时,让寄存器(除了上述提及的CSR以及备份区域寄存器外)恢复至初始状态,也就是我们上电后寄存器的默认状态。
我们使用时也是在不断复位中使用的,为什么这么说?
复位的情况包含了三种:系统复位,电源复位和备份域复位;
系统复位就包含了我们的NRST引脚复位,看门狗,软件复位;电源复位就包含我们每次烧录断电后的情况;而备份域复位比较特殊,我们断电后,烧写的程序在下一次上电还会执行,这就是备份域起到了作用,我们单片机有一个电池,当我们断电时,他会给备份域供电,手册上也详细解释到了。
但当我们电池也没电且没有向单片机供电时,就引发了备份域复位
复位大致就讲到这里。
时钟控制
手册后面也是直接讲到了时钟,时钟是一个很重要的概念,我记得在电赛初选的时候考场老师就问了我这个问题(我那时没回答出来,哭哭/(ㄒoㄒ)/~~)。
时钟,打个比方就相当于我们的心跳脉搏,我们人是在一天的心跳中完成身体各部分的运转,我们单片机上的芯片根据时钟来有节拍的工作,像我们之前看到的72MHZ,48MHZ,就是系统主时钟,芯片在主时钟中协调模块的各种工作。
比如以下是一个信号接收器,它以某种频率来向out发送高低电平信号,信号接收器的工作时间就受时钟控制,时钟1与2是两个不同频率的时钟,而阴影部分是其工作时间,我们看到时钟频率低(时钟1)的,他的工作精度是没有2好的,在检测时肯定会漏接收很多信号,而2不同,他的工作速度很高,能接收很多次电平信号。
以上虽是一个不太恰当的例子,但也是说明了,时钟对于模块的作用,可以给到不同的工作速度,但相对应的,你觉得第二个相比第一个检测波形哪个更为整齐?这就引出了其他问题,你可以让一个普通的芯片时钟频率很高并用于出波(后面的PWM),但是他的输出波形是会有幅频失真和相频失真,总之不会太理想,更高性能的芯片也是有他的极限频率的,并且高频率带来的功耗也是很大的,你可以尝试魔改时钟频率,摸摸你的芯片有多热情,问问你芯片的香味。 总之,功耗,性能,频率,这些都是相互牵制的。
我们在产品手册上5.3.1也可以看到,(f频率)是有限制的。
时钟源
系统时钟可以以HSI,HSE振荡器和PLL作为时钟源,二级时钟源一般是有固定用途的,
比如RTC(32.768KHz)时钟专门用来给RTC 时钟模块提供时钟源
时钟树
在CUBEMX中是有时钟树的,与我们手册上的图神似,很方便我们去配置
配置时钟树
1.选型及RCC配置
选择你的芯片类型
以F103ZETx为例
打开RCC,在MODE一栏我们可以看到HSE,LSI
我们一般用高速外部时钟配置系统时钟,他的来源一般是用户输入或者外部晶振,后者常选
而HSI是由8M的RC振荡器产生的,集成在芯片内部
剩下的就是PLL(锁相环倍频),它用于将我们的其实时钟频率通过倍频增大,这也正是解释了那些频率较高的时钟怎么来的
低速时钟有特殊用途,我们用到再考虑。故我们如下配置MODE
2.时钟树配置
接着打开时钟树,
系统时钟包括三种来源也可以看到,PLL也是由HSE或者HSI作为倍频输入,我们一般选择HSE,再倍频以便输出更高的频率。
在手册时钟树图的后面,我们知道:外设的时钟都是由系统时钟而来的,所以我们先配置好系统时钟
在系统时钟之后是HCLK(内部AHB时钟频率),如果我们想要72MHz,只需输入72并回车,他就会给我们配置好一种方案。但是我们之前也说过,频率是有限制的
如果你手动配置时变红了,很有可能是超过最大范围了。
CUBEMX的优点在于它可以帮你选择时钟方案,还有分频因子,实际上就是对输入的频率做除法,我们可以修改它来修改外设使用时钟频率
这些时钟都是有各种去向的,我们也可以清楚看到
其他去向不过多解释了,之后都会接触到大部分。
点击生成代码
这些都是和我们之前配置是一样的,CUBEMX配置时钟很方便。