遇到的一个时钟问题,不能启用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
以上,谢谢。
AI8051U:
USB用自己的 48MHz, 不要跟其他时钟共享
CPU 时钟独立 《= 40MHz
其他 PWM/TFPU的 PLL时钟,从 CPU时钟分频率后PLL过来
需要提前进入给分频,并且打开PLL后需要等待大概2ms以上稳定时间.
因为你这个代码会出现再设置CLKDIV前,存在超过42Mhz时钟的情况给到了内核,
此时就会导致内核执行混乱异常重启。
所以需要先打开CLKDIV的分频,再切换到PLL
王昱顺 发表于 2025-6-12 13:36
需要提前进入给分频,并且打开PLL后需要等待大概2ms以上稳定时间
因为你这个代码会出现再设置CLKDIV前,存 ...
我的代码是这样的啊,先设置的分频再进行选择的。
CLKDIV = 0X03; //MCLK时钟3分频后送SYSCLK
CLKSEL &= 0XF0; //清除数据
CLKSEL |= 0X04; //PLL输出到系统时钟分频器
我之前也试过把启动PLL倍频器放到最后,还是不行。 guangseen 发表于 2025-6-12 14:38
我的代码是这样的啊,先设置的分频再进行选择的。
CLKDIV = 0X03; //MCLK时钟3分频后送SYSCLK ...
可以尝试使用stcisp中的aicube进行时钟树配置
时有时无可能是运行频率超过了内核上限,内核最大运行时钟应该小于42mhz 等下我也想试试使用AICUBE,但如果能找到代码上的问题更好。加深对硬件的理解。 神农鼎 发表于 2025-6-12 16:01
AI8051U:
USB用自己的 48MHz, 不要跟其他时钟共享
CPU 时钟独立 《= 40MHz
昨晚和今早上试了,用AICUBE配置还是不行,下载到8051U盒子不能运行。附件是项目文件供参考。谢谢。
使用AICUBE配置的函数好像不对,
应该是启动内部IRC高速时钟,
但是函数好像是启动了外部32768时钟。
代码 启动外部32K晶振 是因为你勾选了 “CRE 自动追频”
乘风飞扬 发表于 2025-6-13 16:32
代码 启动外部32K晶振 是因为你勾选了 “CRE 自动追频”
OK, 感谢指出问题。