- 打卡等级:以坛为家II
- 打卡总天数:514
- 最近打卡:2025-05-02 10:18:47
荣誉版主
- 积分
- 990
|
通常中高档MCU,使用6--12M晶振 + PLL ,倍频到需要的频率。
AI32也配置了PLL,可惜只有固定12x的倍率。强烈建议STC将PLL升级都可变倍率!
HPLL就是可变倍率,说明STC有这个技术!!!
用12M的外部晶振,通过PLL倍频到32M用于系统时钟:
void OSC_SET(void)
{
u16 j;
// P_SW2 = 0x80;
P5IE = ~0xc0; //P5.6 P5.7关闭数字输入功能
//XOSCCR = 0x80; //启动外部有源时钟, 此时P1.6固定为高阻, 仅能用于数字输入或ADC输入.
XOSCCR = 0xc0 + 0x08; //启动外部晶振(8051U系列),12M以下+0x08, 24M以下+0x04, 48M以下+0x00.
for(j = 0;j < 32766;j ++)
{
if(XOSCCR & 1) //等待时钟稳定
{
CLKSEL = 0x01; //切换到外部晶振
CLKDIV = 0x03; //对主时钟 MCLK 进行 4 分频--> 96/3 = 32
// HIRCCR = 0x00; //关闭内部高速时钟-----用了USB,就不要关闭内部IRC
break;
}
}
}
void PLL_Init()
{
CLKSEL &= ~0x80; //选择PLL的96M(*8)作为PLL的输出时钟
// CLKSEL |= 0x80; //选择PLL的144M(*12)作为PLL的输出时钟
USBCLK &= ~PCKI_MSK; //PLL 输入时钟 不 分频 默认 2分频
// USBCLK |= 0x00; //PLL输入时钟为12M则选择1分频
// USBCLK |= 0x20; //PLL输入时钟为24M则选择2分频
// USBCLK |= 0x40; //PLL输入时钟为48M则选择4分频
// USBCLK |= 0x60; //PLL输入时钟为96M则选择8分频
//启动PLL
USBCLK |= 0x80; //使能PLL倍频
delay(); //等待PLL锁频,建议50us以上
// CLKDIV = 0x03; //对主时钟 MCLK 进行 4 分频--> 96/3 = 32
CLKSEL |= 0x04; //主时钟源选择内部 PLL 输出
}
用32.768K的外部晶振, 用内部锁频,用于系统时钟 . 频率稳定度为+-0.5%,这样的指标太低。
|
|