社区闲人 发表于 2024-10-31 16:08:48

有了倚天剑,何须杀猪刀

通常中高档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%,这样的指标太低。

DebugLab 发表于 2024-10-31 16:21:39

12M是中心频率,理论上可以输入8~16M到PLL,可以变频

soma 发表于 2024-10-31 18:04:00

stm32可以通过外部8m晶振倍频到72m及以上,不知道stc什么时候能支持
页: [1]
查看完整版本: 有了倚天剑,何须杀猪刀