微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > No.7 时钟配置

No.7 时钟配置

时间:10-02 整理:3721RD 点击:

时钟配置一直忘了讲了,其实早就已经看过了,前几个报告里面你应该也看到了,我用的不是官方提供的sysinit()来初始化时钟,而是自己编写的systemclockinint();
时钟配置是个重要的事情,因为很多地方需要。
比如你要做个串口波特率计算,然后赋值初始值。
比如做个简单延时。
比如各种数据采样。



来详细的理解一下,大体上看出来是4块,一块是ICS,一块是OSC,一块是SIM,一块是PMC。

系统时钟就是Bdiv 后面的这根线名字叫 ICS -OUT- CLK 这样子写比他们那样写更好理解,就是ICS模块输出的时钟。

找到Bdiv,看到它的时钟来源有FLL,ICS的IRC和OSC输出的时钟。

我们都追求高速,实际上可以看出使用内部IRC经过FLL锁频以后能达到48MHz还是很高的。


但是板载了外部10MHz晶振,也不能浪费了资源啊,一般来说外部的晶振温飘小。

下面是我想要的时钟配置路线。



那就要自己写systemclockinit了

void SystemClockInit(void)
{      
    OSC->CR = 0XB6;         //打开osc外部晶振 高增益
    while(!(OSC->CR & OSC_CR_OSCINIT_MASK));//等稳定
    ICS->C1 = 0X1B;         //256分频给FLL
    ICS->C2 = 0X00;         //不分频给系统时钟应该是50M
    while(ICS->S != 0X40);  //等稳定
}

好吧,这里我用了寄存器直接操作了,因为当时读datasheet顺手就写上了。毕竟没有那么复杂。

按照刚才的想法我们先配置OSC。



bit7 OSC模块使能位,不用说了 1.
bit 6,bit3,预留没用。
bit5 在停止模式下OSC使能位,我们只是学习使用还没考虑到各种省电和节能,就开着喽。1.
bit4 OSC输出选择是振荡器还是外部时钟源,这俩什么区别呢?清楚的人一下子就明白了,模糊的人可能会绕不过去这个弯。
什么是振荡器



这就是使用震荡器,我们的晶振就是。这个时候使用的是XTAL的时钟。



这个时候就是外部时钟源,比如你用555产生的脉冲接到EXTAL引脚,此时XTAL引脚可以作为普通IO口使用。
好了估计明白了。那这个位我们就选择 1.
bit2 因为外部晶振频率10M所以我们 这里置1.
bit1 还是那句话我们不考虑省电什么的,这里选择高增益 1.
bit0 是当我们设置这个OSC的时候时钟稳定标志位,当这个位置1的时候就是告诉我们时钟稳定了。
好了图中1位置已经开始了10MHz的震荡时钟,此时我们已经进入ICS模块的范围。



FLL这个锁频器是1280倍输入频率,如果我们把10M给了FLL,想想输出的12GHZ的频率也是很诱人啊!哈哈。
这肯定是不行的啦,况且也有要求FLL的输入频率要在26K-40K之间。我们的10M需要分频。
算了一下分频256到39.0625K满足要求低于40K。
这个分频在哪里设置呢?因为我们已经到了ICS模块,那就想到了ICS的寄存器去看看。



当当当当!C1寄存器Rdiv看到了。看说明书我们刚才设置OSC的时候rang=1,所以这里Rdiv设置为011就是256分频了,
bit 7.6这俩是选择系统时钟的来源。那肯定是FLL输出时钟作为系统时钟啦,这里设置为00.
bit 5.4.3就是011
bit2 FLL的时钟源选择。来来来。又一个弯弯。
FLL是ICS的一部分,ICS自带了一个37.5K的IRC,OSC输出的时钟相对于ICS就是外部,我们的10M晶振是OSC模块的,然后OSC输出分频后给了FLL,所以自然这个bit就是 0;
bit1 还是那句话我们不考虑省电节能,这个内部IRC就开着吧,设置为1.
bit0 同上,开着。 置1.
所以ICS ->C1  = 0X1B;
到这里我们的FLL已经开始输出的频率是10/256*1280=50MHz。
要成为系统时钟,中间还有一个Bdiv的分频器需要设置,因为我们满足FLL输入要求,所以输出的50M虽然超了说明书的最大48M但是依旧能用。
那么Bdiv还要分频吗?当然不分了,这个频率多爽啊。
但是我们也是要设置一下,万一默认有设置分频了呢!



C2寄存器好简单,就一个Bdiv和LP



所以我们Bdiv就是000,对于LP我们不省电所以0
那自然这个ICS -> C2 = 0x00;
ICS有个寄存器就像OSC的bit0一样是时钟稳定的标志位。
所以我们还有一句
while(ICS->S != 0X40);  //等稳定
好了,时钟配置完了。
时钟还有很多的配置方法,抛砖引玉,自己去了解吧。

这个时候我们的系统时钟就是50MHz

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top