有个不解,为什么用外部晶振时开启PLL切换好后关闭内部的IRC系统不工作?
从道理上说,不应该已经切换到外部晶体上了,内部的就不能这样关闭呢?HIRCCR &= B0111_1111;CPU ,AI8051U
测试可以工作?上传完整工程看看
//时钟配置
//使用11.0592外部晶体,配置主时钟为33.1776Mhz
void Init_OSC(void) {
//禁止通过引脚输出时钟
MCLKOCR = 0x00;
//暂时增加主时钟分频系数(16),防止切换时钟的时候超过频率限制
CLKDIV= 15;
//开启内部48Mhz的USB振荡器
IRC48MCR |= B1000_0000;
//等待48M内部振荡稳定
while(IRC48MCR & 0x01) break;
//USB时钟源来自内部48Mhz的USB振荡器
IRCBAND &= B1011_1111;
IRCBAND |= B1000_0000;
//设置SPI时钟为MCK(132.7104)的1/6 22.1184Mhz
SPI_CLKDIV = 0x06;
//设置浮点数处理单元的时钟为MCK(132.7104)的1/2 66.3552Mhz
TFPU_CLKDIV = 0x02;
//外设时钟来自MCLK(132.7104)不分频
HSCLKDIV = 0;
//外设时钟来自MCLK(132.7104)
CLKSEL &= B1011_1111;
//外部晶体振荡选择低增益,开启晶体振荡器
XOSCCR &= B1101_1110;
XOSCCR |= B1100_1000;
//等待外部晶体振荡稳定
while(XOSCCR & 0x01) break;
//时钟切换为外部晶体振荡
CLKSEL &= B1111_1100;
CLKSEL |= B0000_0001;
//PLL频率源不分频
USBCLK &= B1001_1111;
//使能PLL倍频
USBCLK |= B1000_0000;
//PLL输出11.0592*12= 132.7104Mhz
CLKSEL |= B1000_0000;
//MCLK源自PLL输出
CLKSEL &= B1111_0011;
CLKSEL |= B0000_0100;
//恢复主时钟分频系数(4),CPU频率33.1776
CLKDIV= 4;
//关闭内部高速IRC振荡器
//HIRCCR &= B0111_1111;
}
最后一行注释去掉不工作
xhbwork 发表于 2026-5-15 09:27
//时钟配置
//使用11.0592外部晶体,配置主时钟为33.1776Mhz
void Init_OSC(void) {
发现和使用了PLL有关,开了PLL并切换之后不能关闭HIRC
ercircle 发表于 2026-5-15 09:37
发现和使用了PLL有关,开了PLL并切换之后不能关闭HIRC
好奇怪,为啥呢{:lol:}
所谓的PLL就是个倍频单元,和内部振荡器没啥关系啊
页:
[1]