//C8051F340包括一个可编程内部高频振荡器,该振荡器在体系内复位后默以为体系时钟。该高频振荡器为12MHz。
//使能外部振荡器后,至少要等候1ms,再来判别外部晶体振荡器是否安稳作业。
//使能时钟乘法器后需求等候5us,再来初始化时钟乘法器,之后来判别时钟乘法器是否安稳作业。
运用外部晶振的时,【P0MDIN &= 0x3F;】句子必定要在ClockInit()函数调用之前履行。
原因:C8051F340的IO口默许都是数字输出。
【P0MDIN &= 0x3F;】句子意义:P0.6(XTAL1),P0.7(XTAL2)装备为模仿输入。
//函数名: ClockInit()
//描绘 : 体系时钟和USB时钟初始化
//时钟来历为外部振荡器——12MHz晶振
void ClockInit(void)
{
unsigned int Temp; //暂时变量
OSCXCN = 0x67; //外部振荡器为晶体振荡器方法,外部晶体振荡器频率在[10MHz,30MHz]
for (Temp=0;Temp<3000;Temp++); //等候1ms
while ((OSCXCN&0x80) == 0); //判别晶体振荡器作业是否安稳
FLSCL = 0x90; //flash相关频率装备
CLKMUL |= 0x81; //时钟乘法器使能,时钟乘法器的时钟来历为外部振荡器,即12MHz晶振
for(Temp=0;Temp<200;Temp++); //等候5us初始化
CLKMUL |= 0xC0; //初始化时钟乘法器
while ((CLKMUL & 0x20) == 0); //判别时钟乘法器是否安稳
CLKSEL = 0x03; //USB时钟来历为时钟乘法器,体系时钟来历为时钟乘法器,即都为48MHz
OSCICN = 0x00; //制止内部高频振荡器 ,此句子在体系时钟彻底装备好了后履行
}
//函数名: ClockInit()
//描绘 : 体系时钟和USB时钟初始化
//时钟来历为内部振荡器——12MHz晶振
void ClockInit( void )
{
unsigned int Temp;
OSCICN |= 0x80; //使能内部高频振荡器
CLKMUL = 0x00; //复位时钟乘法器,时钟乘法器时钟来历为内部高频振荡器
CLKMUL |= (1<<7); //使能时钟乘法器
for(Temp=0;Temp<200;Temp++); //延时5us
CLKMUL |= (1<<6)|(1<<7); //初始化时钟乘法器
for(Temp=0;Temp<2000;Temp++);
while(!(CLKMUL&(1<<5))); //等候时钟乘法器准备好
CLKSEL = 0x03; //USB时钟来历为时钟乘法器,体系时钟来历为时钟乘法器,即都为48MHz
}