第六帖 FoUSB下系统时钟处理
时间:10-02
整理:3721RD
点击:
Fousb仿真(串口仿真)时,必须注意系统时钟的问题。
先介绍一下R8C1B的时钟系统:
R8C1B芯片时钟有3种选择:
1)内部时钟125KHz
2)内部时钟8M
3)外部时钟
芯片默认上电之后启动内部125KHz的时钟,但是在用户使用Fousb软件进行仿真时,FoUSB会自动生成了仿真监控代码,并启动外部时钟,与PC机进行通讯。
所以用户在使用FoUSB软件时,即使不设置系统时钟,系统时钟也会运行在外部时钟状态。
此时,如果用户强行在代码中设置时钟,改变了时钟,芯片由于时钟发生变化,UART将改变波特率,从而和HEW软件无法通讯,造成系统假死,无法仿真
在FoUSB中如果用户需要设置时钟,必须设置为外部,并且不分频。
如果设置成其他时钟方式,例如内部时钟,或者分频方式,只能脱机运行,不能仿真运行,请注意。
附上时钟初始化代码,仅供参考。
/**********************************************************
*函数原型:
void InitClock( unsigned char Out_In,
unsigned char High_Low,
unsigned char Dev)
*功能 : 时钟初始化处理程序
Out_In 0--内部时钟 1--外时钟
High_Low 0--低速 1--高速
Dev 1 2 4 8 16
**********************************************************/
void InitClock(unsigned char Out_In,unsigned char High_Low,unsigned char Dev)
{
prcr = 0x01; //关闭和时钟相关的保护寄存器,允许修改时钟
switch(Dev)
{
case 1: cm16=0;cm17=0;cm06=0;break; //f1
case 2: cm16=1;cm17=0;cm06=0;break; //f2
case 4: cm16=0;cm17=1;cm06=0;break; //f4
case 8: cm16=0;cm17=0;cm06=1;break; //f8
case 16:cm16=1;cm17=1;cm06=0;break; //f16
default:break;
}
if(High_Low) //高速时钟
{
hra00 = 1; //高速内部振荡器振荡
hra01 = 1; //使用内部高速振荡器时钟(FRING-Fast)作为内部时钟(FRING)
}
else //低速时钟
{
cm14=0; //低速内部振荡器振荡
hra01 = 0; //使用内部低速振荡器时钟(FRING-Fast)作为内部时钟(FRING)
}
if(Out_In) //使用外部时钟
{
cm13 = 1; //XIN-XOUT引脚连接内部起振电路
cm15 = 1; //XIN-XOUT引脚使用高驱动能力
cm05 = 0; //开始振荡
asm("NOP\nNOP\nNOP\nNOP");
asm("NOP\nNOP\nNOP\nNOP");
asm("NOP\nNOP\nNOP\nNOP");
ocd2 = 0; //使用主时钟作为系统时钟
}
else //使用内部时钟
{
asm("NOP\nNOP\nNOP\nNOP");
ocd2 = 1; //使用内部时钟作为系统时钟
}
prcr = 0; //打开保护寄存器
}