guangseen 发表于 2025-1-17 18:13:01

求助:关于8051U使用PLL无法正常获得时钟的问题

各位坛友好,

本来准备使用PLL来提供系统时钟,同时关闭48MHz的USB时钟。通过寄存器设置无法获得正确的频率。
通过P4.7输出SYSCLK后用示波器观察,实际频率为8MHz。 IRC设置的是24MHz, 通过PLL锁频后输出96MHz, 再3分频给到SYSCLK,从结来看似乎PLL没起到作用。但检查寄存器又没找到问题,因此发上来希望有高手指导一下。 谢谢。

1.寄存器设置如下:

      HIRCCR |= 0X80;
      MCLKOCR = 0X01; //SYSCLK原频输出到P4.7
      HSCLKDIV = 0x02; //IO对96MHz 2分频
      CLKSEL = 0x44;      //选择PLL96MHz为系统时钟和IO时钟;
      USBCLK &= 0x0f;
      USBCLK |= 0xa0; //使能PLL倍频, HIRC 2分频送PLL, HIRC为24MHz
      CLKDIV = 0x03; //对PLL 3分频后送给SYSCLK
      IRC48MCR &= 0x7f; //关闭48MHz USB专用时钟.
      IRCBAND = 0x02;
      while(!(HIRCCR&0x01))         //等待内部IRC时钟稳定
      {
                _nop_();
                _nop_();
      }



2.ISP设置:
继续检测目标单片机 ...
单片机型号: STC8051U-34K64

当前芯片的硬件选项为:
. 系统ISP工作频率: 24.010MHz
. 内部IRC振荡器的频率: 24.000MHz
. 掉电唤醒定时器的频率: 35.725KHz
. 振荡器放大增益使能
. 用户EEPROM大小被设置为 1 K
. P3.2和P3.3与下次下载无关
. 上电复位时增加额外的复位延时
. 复位引脚用作普通I/O口
. 检测到低压时复位





3.输出频率为8MHz,和程序跑的情况一致。

DebugLab 发表于 2025-1-17 20:09:52


设计好时钟路径,然后挨个寄存器配置一遍

guangseen 发表于 2025-1-17 23:00:08

已经搞定了, 问题出在代码执行顺序上, 不能一开始就选通时钟路径。 等PLL启动后再选通道就可以了。 寄存器值设置本身没有问题。


      IRC48MCR &= 0x7f;
      while(!(HIRCCR&0x01))         //等待内部IRC时钟稳定
      {
                _nop_();
                _nop_();
      }
      CLKSEL = 0X00;//可以不写这行
      USBCLK &= 0X0f;
      USBCLK |= 0X20;
      USBCLK |= 0X80;
      clk_delay();
      CLKDIV = 0X03;      
      CLKSEL |= 0x04; //选通MCLK
      IRCBAND &= 0x3f;//选通USB 96Mhz/2 时钟
      HSCLKDIV = 0x02; //IO时钟分频 96/2 MHz
      CLKSEL |= 0X40;//选通IO时钟
      MCLKOCR = 0X01; //SYSCLK原频输出到P4.7


开心



guangseen 发表于 2025-1-17 23:01:44

DebugLab 发表于 2025-1-17 20:09
设计好时钟路径,然后挨个寄存器配置一遍

已解决,谢谢。
页: [1]
查看完整版本: 求助:关于8051U使用PLL无法正常获得时钟的问题