一:AI8051的系统时钟控制:
系统时钟控制器为单片机的 CPU 和所有外设系统提供时钟源,系统时钟有4个时钟源可供选择:内部高精度 IRC、内部 32KHz 的 IRC(误差较大)、外部品振、内部 PLL 输出时钟。用户可通过程序分别使能和关闭各个时钟源,以及内部提供时钟分频以达到降低功耗的目的。
时钟框图如下所示:

系统及外设时钟选择参考表如下所示:

二:芯片的工作流程如下所示:
上电复位/复位脚复位/看门狗复位/低压检测复位时,芯片默认从 ISP 系统程序开始执行代码,此时固定使用内部 24MHz 的高速 IRC 时钟,当需要下载用户程序且下载完成后复位到用户程序区或者不需要下载直接复位到用户程序区时,默认会使用上次用户下载时所调节的高速 IC时钟,如果用户程序需要使用外部高速晶振、外部 32.768KHz 晶振或者内部 32KHz低速 IRC,则需要用户软件先启动相应的时钟,然后通过设置 CIKSEL 寄存器进行切换。
三:几种时钟来源的配置过程软件代码:

代码实现的几种时钟来源:IRC主频,主频12分频,PLL 96M 16分频后再2分频,内部32K IRC。
if(mode == 0)
{
mode++;
HIRCCR = 0x80; //启动内部 IRC
while (!(HIRCCR & 1)); //等待时钟稳定
CLKDIV = 0;
CLKSEL = 0x00; //选择内部 IRC ( 默认 )
}
else if(mode == 1)
{
mode++;
HIRCCR = 0x80; //启动内部 IRC
while (!(HIRCCR & 1)); //等待时钟稳定
CLKDIV = 24; //MCLK/24
CLKSEL = 0x00; //选择内部 IRC ( 默认 )
}
else if(mode == 2)
{
mode++;
CLKSEL &= ~CKMS; //选择PLL的96M作为PLL的输出时钟
USBCLK |= PCKI_D2; //输入时钟2分频(选择PLL输入时钟分频,保证输入时钟为12M)
//启动PLL
USBCLK |= ENCKM; //使能PLL倍频
delay_ms(1); //等待PLL锁频
CLKDIV = 16; //主时钟选择高速频率前,必须先设置分频系数,否则程序会当掉
CLKSEL &= ~MCKSEL_MSK;
CLKSEL &= ~MCK2SEL_MSK;
CLKSEL |= MCKSEL_HIRC; //选择内部高速IRC作为主时钟
CLKSEL |= MCK2SEL_PLLD2; //选择PLL输出时钟2分频后的时钟作为主时钟
}
else if(mode == 3)
{
mode = 0;
IRC32KCR = 0x80; //启动内部 32K IRC
while (!(IRC32KCR & 1)); //等待时钟稳定
CLKDIV = 0x00; //时钟不分频
CLKSEL = 0x03; //选择内部 32K
}
我要赚赏金
