上一篇已经完成了一个空工程的建立,那程序要能跑起来,下面的第一步肯定就是:时钟配置。
先大概说一下我的攻克RCC的步骤:
1)看懂F0系列的时钟数(我真实用的芯片是STM32F072RBT6);
2)详细分解原子例程中的RCC初始化操作;
3)模拟原子的RCC初始化步骤实现在F0系列上的RCC寄存器操作移植(是的,我觉得我目前做到的就是一个类似移植;
开始吧!
首先来说一下RCC的配置流程:
1、时钟初始化,即将时钟的寄存器采用默认值。
2、开始外部时钟且外部时钟起震准备就绪。
3、设置PLLXTPRE(只能在关闭PLL时才能写入此位),可选择分频不分频。
4、设置进入PLL的源时钟(只能在关闭PLL时才能写入此位)。因为采用外部时钟所以只有一种设置。
5、设置PLL倍频系数PLLMUL(只有在PLL关闭的情况下才可被写入)。
6、开启PLL,且准备就绪。
7、设置SW,选择时钟源为系统时钟。
8、判断是否是预选的时钟为系统时钟。
目录
1)复位APB1RSTR和APB2RSTR(由于这两个寄存器和F103的完全一样,可以直接照搬即可),其实就是寄存器清零操作。
2)使能闪存和SRAM(这里的目的应该是为了程序能正常运行吧,我是这么理解的)
3)使能HSION的情况下,去清空寄存器(备注:这时其实很多位还是不一定清空的,因为有些为必须在一些条件下才能写)
3)写入PLLMUL作为倍频数(因为前面的复位已经让其他的倍频和分频复位成默认的1倍,因此只需要再写要倍多少倍就可以实现最终的频率配置)
4)打开PLL、等待PLL锁定(这里都是操作相应的寄存器位既可)
1. 时钟树详解:
我按我自己的理解讲吧,很多特别细节的地方肯定没有说明白,但是应该足够应用了吧(至少我是这么理解的);
1)首先就是时钟输入源
有两个选项:图中的IN1-----外部晶振,一般选8M晶振;
图中的IN2------内部8M的RC振荡时钟;
一般来说,会选择外部的晶振作为时钟源(比RC振荡时钟的精度肯定是要高很多的)。
2)时钟倍频及分频:
输入时钟经过多次倍频和分频后得到各外设时钟的时钟源;
具体流程大家看图就好,这里我说几个跟时钟配置比较相关的点就可以了。
图中几个重要的倍频和分频系数都是在RCC的寄存器中需要进行配置的,如PLLMUL、AHB预分频器、APB预分频器、PLLNODIV等。
一般比较简单的设置流程就是这样的:
选择外部时钟源作为PLL的输入时钟,然后PLLMUL倍频系数选择*6,即可把PLLCLK倍频到48M(F0系列最高时钟48M,这里就以设置48M为例),后续其他的分频和倍频系数都选择默认的1既可以;
这样最后就可以得到主频48M,外设的频率也都是48M的工作时钟;
个人觉得,这是最简单的配置模式,当然,如果对时钟有比较高的要求,可以再细研究吧!
2. 原子例程中的RCC初始化操作
下面是原子例程里的时钟初始化函数,大概说一下我的理解:
第一步:复位向量表
这里的工作主要是把RCC_CFGR寄存器清0,因为CFGR寄存器有几个位是需要再某些条件下才能进行写操作,所以就有了先写CR寄存器把条件满足,再给相应位清零;
第二步:配置CR和CFGR
是的,最主要的就是这两个寄存器。
原理就是我前面说的,先选择时钟源为外部晶振时钟源,然后把PLLMUL(CFGR寄存器的某几位)设置成相应的值即可。
整个逻辑还是比较简单的,下面我在F0下移植一遍应该就更清楚了。