目录
时钟系统简介
系统时钟控制器为单片机的CPU和所有外设系统提供同一的时钟源。系统时钟有四种:内部高精度IRC、内部32KHz的IRC、外部晶振和内部锁相环输出时钟。掉电模式下所有时钟源关闭。
具体通过时钟控制选择寄存器CKSEL的字段MCKSEL[1:0]进行时钟源配置,选择出主时钟MCLK,通过对时钟分频寄存器CLKDIV写入值后进行分频,得到系统时钟SYSCLK。若输出系统时钟或进行时钟频率检测与校验,可以配置MCLKOCR寄存器以达到要求。
时钟配置相关的寄存器
- CKSEL时钟选择寄存器
- CLKDIV时钟分频寄存器
- IRC24MCR内部24M振荡器控制寄存器
- XOSCCR外部晶振控制寄存器
- IRC32KCR内部32K振荡器控制寄存器
- PLLCR内部PLL控制寄存器
- MCLKOCR主时钟输出控制寄存器
CKSEL
8位寄存器,低两位[1:0]为用户可写入字段,高位保留
对MCKSEL写值为
- 00-内部高精度时钟IRC
- 01-外部晶振
- 10-内部PLL时钟
- 11-内部32KHz低速IRC
CLKDIV
8位寄存器,全字段用户可写入
CLKDIV寄存器的值代表对主时钟MCLK的分频系数,CLKDIV=x时,表示系统时钟SYSCLK是对主时钟MCLK的x分频。
注:CLKDIV=0时,主时钟不分频。
IRC24MCR
![](https://i-blog.csdnimg.cn/blog_migrate/6feccf208fe27896d89b2c36264d6a85.png)
8位寄存器,最低位和最高位为用户操作位,其余位保留。
最高位为内部高精度IRC的使能位。B7=0:关闭内部高精度IRC;B7=1:打开内部高精度IRC。
最低为位标志位。内部IRC从停振状态到以稳定频率运行需要一定的时间。当频率稳定后,B0=1;否则B0=0。
IRC32KCR
与IRC24MCR寄存器结构类似,位作用也类似。
PLLCR
![](https://i-blog.csdnimg.cn/blog_migrate/dc3200d4e90703df62b97f2669bc1d06.png)
8位寄存器,全字段可写入。
ENPLL为内部PLL使能位,高电平有效。
PLLSSEL为PLL时钟源选择:
- 00-内部高精度IRC
- 01-外部晶振
- 10-内部32KIRC
- 11-1.7口外部输入
PLLINCTRL为PLL时钟源分频控制(自动会额外分频一个6MHz提供给USBPLL):
- 00-不分频
- 01-2分频
- 10-4分频
- 11-内部高精度IRC2分频
PLLTOMSEL为PLL输出时钟到主时钟MCLK的控制
- 00-PLL分频后的6MHz
- 01-PLL输出的24MHz
- 10-PLL输出的32MHz
- 11-PLL输出的48MHz
PLLST为输出时钟稳定标志位
0:内部PLL输出未稳定;1:内部PLL输出稳定
注:以上寄存器均为特殊寄存器,并且为扩展SFR,逻辑地址位于XDATA区域。对这些寄存器进行读写操作时,需要将P_SW2寄存器的最最高位写1。
时钟配置源程序
采用内部高精度IRC
void Config_MCLK(void)
{
WTST = 0; // MCU初始化,读取程序
P_SW2 |= 0x80; // 将P_SW2寄存器的最高位置1,访问扩展SFR特殊寄存器
IRC24MCR = 0x80; // enable IRC24MHz
IRCBAND = 0;
while(!(IRC24MCR & 0x01)); // wait IRC24MHz into steady state
CLKDIV = 0;
CLKSEL = 0x00; // select IRC24MHz as main clock
MCLKOCR = 128+100; // 主时钟输出到P1.6口,并且分频100倍
// 若要校验内部时钟,必须初始化相应的端口
P_SW2 &= 0x7F; // 关闭xdata逻辑段访问
}
采用内部PLL输出,PLL以内部24MIRC为基准
void Config_MCLK(void)
{
IRC24MCR = 0x80; // enable IRC24MHz
IRCBAND = 0;
while(!(IRC24MCR & 0x01)); // wait IRC24MHz into steady state
// PLLCR = 0x80; // PLL输出24MHz作为主时钟
// PLLCR = 0x82; //
// PLLCR = 0x86;
PLLCR = 0x92; // 使能锁相环,并选择PLL输入为内部高精度IRC,主时钟24MHz
// PLLCR = 0x90; // 最终PLL的输出为6MHz,系统时钟SYSCLK为6MHz
// PLLCR = 0x94; // 主时钟32MHz,
// PLLCR = 0x96; // 主时钟48MHz
while(!(PLLCR & 0x01)); // wait PLL
CLKDIV = 0; // frequency divide
CLKSEL = 0x02; // select PLL as main clock
}
重要提醒!!!
在烧写程序到芯片中的时候,一定要选择IRC频率