guangseen 发表于 5 天前

遇到的一个时钟问题,不能启用PLL时钟 | 用AiCube 配置时钟树

1.基本情况:MCU STC8051U PDIP40; VCC=5V;
更新后的硬件选项为:
. 系统ISP工作频率: 24.000MHz
. 内部IRC振荡器的频率: 24.000MHz
. 掉电唤醒定时器的频率: 35.725KHz
. 振荡器放大增益使能
. 用户EEPROM大小被设置为 1 K
. P3.2和P3.3与下次下载无关
. 上电复位时增加额外的复位延时
. 复位引脚用作普通I/O口
. 检测到低压时复位
. 低压检测门槛电压 : 2.00 V
. 上电复位时,硬件不启动内部看门狗
. 上电自动启动内部看门狗时的预分频数为 : 256
. 空闲状态时看门狗定时器停止计数
. 下次下载用户程序时,将用户EEPROM区一并擦除
. 下次下载用户程序时,没有相关的端口控制485
. 下次下载时不需要校验下载口令
. 内部参考电压: 1193 mV (参考范围: 1100~1300mV)
芯片出厂序列号 : F8B4C8FD0299FA
单片机型号: STC8051U-34K64
2. 问题介绍:使用内部IRC时钟和48MHZ时钟都没问题,但无法使用PLL时钟做为系统时钟,usb时钟和IO时钟。计划使用PLL96MHZ三分频后作为SYSCLK,2分频后为USBCLK,不分频到IO和TFPU。
之前使用最小系统时可以运行,但时有时无,有时PLL能启动。不知是硬还是软件问题,目前已在制做新的最小系统进行测试,代码方面参考的例程,请大家帮忙分析一下哪里有问题。P4.7脚有时输出8MHz的时钟。


    void clk_delay(void)    //100us @ 24MHz
{
    unsigned char data i, j;

    i = 3;
    j = 82;
    do
    {
      while (--j);
    } while (--i);
}


    HIRCCR = 0x80;      //打开IRC高速时钟
    while(!(HIRCCR&0x01));   //等待内部IRC时钟稳定
    CLKSEL &=0X7F;      //选择PLL输出为96MHz   
    USBCLK &= 0X1f;   //关闭PLL倍频器,清除分频器设置为00
    USBCLK |= 0X20;         //设置PLL输入分频器2分频
    USBCLK |= 0X80;         //打开PLL倍频器
    clk_delay();
    CLKDIV = 0X03;      //MCLK时钟3分频后送SYSCLK   
    CLKSEL &= 0XF0;      //清除数据
    CLKSEL |= 0X04;   //PLL输出到系统时钟分频器
    IRCBAND &= 0x3f;    //选通USB PLL/2 时钟
    HSCLKDIV = 0x01;   //IO时钟不分频 96 MHz
    CLKSEL |= 0X40;         //选择PLL为IO时钟, IRC为系统时钟
    MCLKOCR = 0X01;         //SYSCLK原频输出到P4.7


以上,谢谢。


神农鼎 发表于 5 天前

AI8051U:
USB用自己的 48MHz, 不要跟其他时钟共享
CPU 时钟独立 《= 40MHz
其他 PWM/TFPU的 PLL时钟,从 CPU时钟分频率后PLL过来






王昱顺 发表于 5 天前

需要提前进入给分频,并且打开PLL后需要等待大概2ms以上稳定时间.
因为你这个代码会出现再设置CLKDIV前,存在超过42Mhz时钟的情况给到了内核,
此时就会导致内核执行混乱异常重启。

所以需要先打开CLKDIV的分频,再切换到PLL

guangseen 发表于 5 天前

王昱顺 发表于 2025-6-12 13:36
需要提前进入给分频,并且打开PLL后需要等待大概2ms以上稳定时间
因为你这个代码会出现再设置CLKDIV前,存 ...

我的代码是这样的啊,先设置的分频再进行选择的。
    CLKDIV = 0X03;      //MCLK时钟3分频后送SYSCLK   
    CLKSEL &= 0XF0;      //清除数据
    CLKSEL |= 0X04;   //PLL输出到系统时钟分频器

我之前也试过把启动PLL倍频器放到最后,还是不行。

王昱顺 发表于 5 天前

guangseen 发表于 2025-6-12 14:38
我的代码是这样的啊,先设置的分频再进行选择的。
    CLKDIV = 0X03;      //MCLK时钟3分频后送SYSCLK ...

可以尝试使用stcisp中的aicube进行时钟树配置
时有时无可能是运行频率超过了内核上限,内核最大运行时钟应该小于42mhz

guangseen 发表于 5 天前

等下我也想试试使用AICUBE,但如果能找到代码上的问题更好。加深对硬件的理解。

guangseen 发表于 4 天前

神农鼎 发表于 2025-6-12 16:01
AI8051U:
USB用自己的 48MHz, 不要跟其他时钟共享
CPU 时钟独立 《= 40MHz


昨晚和今早上试了,用AICUBE配置还是不行,下载到8051U盒子不能运行。附件是项目文件供参考。谢谢。


guangseen 发表于 4 天前

使用AICUBE配置的函数好像不对,
应该是启动内部IRC高速时钟,
但是函数好像是启动了外部32768时钟。


乘风飞扬 发表于 4 天前

代码 启动外部32K晶振 是因为你勾选了 “CRE 自动追频”



guangseen 发表于 4 天前

乘风飞扬 发表于 2025-6-13 16:32
代码 启动外部32K晶振 是因为你勾选了 “CRE 自动追频”

OK, 感谢指出问题。
页: [1] 2 3
查看完整版本: 遇到的一个时钟问题,不能启用PLL时钟 | 用AiCube 配置时钟树