STC16f40k128——时钟系统

目录

时钟系统简介

时钟配置相关的寄存器

CKSEL

CLKDIV

IRC24MCR​编辑

IRC32KCR

PLLCR​编辑

时钟配置源程序

采用内部高精度IRC

采用内部PLL输出,PLL以内部24MIRC为基准


时钟系统简介

系统时钟控制器为单片机的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

 8位寄存器,最低位和最高位为用户操作位,其余位保留。

最高位为内部高精度IRC的使能位。B7=0:关闭内部高精度IRC;B7=1:打开内部高精度IRC。

最低为位标志位。内部IRC从停振状态到以稳定频率运行需要一定的时间。当频率稳定后,B0=1;否则B0=0。

IRC32KCR

与IRC24MCR寄存器结构类似,位作用也类似。

PLLCR

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频率

 

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

今天美美吃饭啦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值