//使能外部振荡器后,至少要等待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
}
上一篇:51单片机的data,xdata,code区别详解
下一篇:控制灯闪烁的MCS-51单片机程序举例及详解
推荐阅读最新更新时间:2024-03-16 14:30