问题1正确, 问题2不对。指令周期固定的是他所用的机器周期个数,不论晶震的频率是多少,1条指令所用的机器周期数是固定的。但是机器周期确与晶振的频率直接相关,如51型片,1个机器周期=12个晶振振荡周期。这样指令周期变与振荡周期相关。如1条指令固定用4个机器周期(SYCLK),1SYCLK=12CLK(晶振周期),这样一个指令周期=4SYCLK(机器周期)=48CLK(晶振周期),这里固定的只是“4”,最终还是却绝于CLK(晶振周期)。 问题3 PLL为锁相环(Phrase lock loop),是一种分频和倍频电路。 你写的程序因该是8051F系列单片机的时钟配置子程序。 void Oscillator_Init() { int i; SFRPAGE = CONFIG_PAGE;//切换到配置时钟的特殊功能寄存器(SFR) 所在的页) OSCXCN = 0x66; //这句好像是配置外部时钟用的,具体是所 使 用的外部时钟类型选择。 for (i = 0; i < 3000; i++); // Wait 1ms for initialization while ((OSCXCN & 0x80) == 0);//等待外部晶振启动并稳定 PLL0CN = 0x04; //PLL使用外部晶振作为振荡源 CCH0CN &= ~0x20; //好像是关闭内部晶振 SFRPAGE = LEGACY_PAGE; //切换SFR页 FLSCL = 0x90; SFRPAGE = CONFIG_PAGE; CCH0CN |= 0x20; //配置PLL参数,主要是驱动电流什么的 PLL0CN |= 0x01; // PLL0DIV = 0x02; //PLL分频系数 PLL0FLT = 0x2F; PLL0MUL = 0x09; //PLL倍频系数 for (i = 0; i < 15; i++); // Wait 5us for initialization PLL0CN |= 0x02; while ((PLL0CN & 0x10) == 0); CLKSEL = 0x02; //使用PLL作为系统时钟源 OSCICN = 0x00; //这个时间长了,不记得了。 }
|