这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » R8C/1A使用内部时钟程序

共16条 1/2 1 2 跳转至

R8C/1A使用内部时钟程序

菜鸟
2008-07-24 14:28:23     打赏
各位好,我是个新手,恳请多多指教。

这是我写的使用内部时钟程序,可编译时一直死在那里,不能进入,估计是这个程序有问题,恳请高手们帮忙诊断。万分感谢。

void ClockInit(void)
{
  ocd2=1;                  //选择内部振荡器时钟//
  hra00=1;                //高速内部振荡器振荡//
  delay(1000);
  hra1=0;                  //使用系统默认的高速内部振荡器8MHz//
  delay(1000);
  cm14=0;   
  hra01=1;                //使用内部高速振荡器时钟(Fring-fast)作为内部时钟(Fring)//
  ocd2=1;                  //使用内部时钟作为系统时钟//
}



关键词: 使用     内部     时钟     程序    

菜鸟
2008-07-24 14:45:59     打赏
2楼

你的问题在于,没有打开保护寄存器。你仔细看看硬件手册,是不是在和时钟相关的寄存器(CM0, CM1, OCD, HRA0, HRA1)说明都有一个“注1”。必须将PRCR的位0置1。
瑞萨R8C的单片机复位后就是使用内部的时钟。
因此,如果复位后就初始化的话,使用以下代码:
VOID   InitClock( )
{
    prc0 = 1;    //打开和时钟相关的保护寄存器
    cm06 = 0;  //CPU时钟不分频(因为CM16和CM17复位后默认为0)
    hra00 = 1;  //启动高速时钟
    hra01 = 1;  //使用高速时钟
    prc0 = 0;    //关闭保护
}

如果不是复位后使用:
VOID   InitClock( )
{
    prc0 = 1;    //打开和时钟相关的保护寄存器
    cm16 = 0;  //CPU时钟不分频
    cm17 = 0;
    cm06 = 0;  //使用CM16和CM17设定的分频比
    hra00 = 1;  //启动高速时钟
    ocd2 = 1;   //使用片内时钟 
    hra01 = 1;  //使用高速时钟
    prc0 = 0;    //关闭保护
}


菜鸟
2008-07-24 16:01:53     打赏
3楼
谢谢管理员,我是使用内部时钟作为主时钟的(也就是您说的后者),加了句cm05=1(主时钟停止,使用p4.6和p4.7作为输入端口使用)

菜鸟
2008-07-27 11:24:09     打赏
4楼

各位好,我的这个程序内部晶振工作了吗?
有个弱智问题,如果晶振不工作,I/0口是不是也不能用的?


菜鸟
2008-07-27 13:44:28     打赏
5楼
各位大哥,帮帮忙啊。万分感激。
void ClockInit(void)
{
 cm05=1;
 prc0 = 1;    //打开和时钟相关的保护寄存器
 //cm05=1;       //主时钟停止,使用p4.6和p4.7作为输入端口使用
    cm16 = 0;  //CPU时钟不分频
    cm17 = 0;
    cm06 = 0;  //使用CM16和CM17设定的分频比
    hra00 = 1;  //启动高速时钟
    ocd2 = 1;   //使用片内时钟
    hra01 = 1;  //使用高速时钟
    prc0 = 0;    //关闭保护
}

内部晶振貌似开启了,可延时程序一直进不去是怎么回事?

菜鸟
2008-07-27 14:37:50     打赏
6楼
我的延时程序:
void delay(unsigned int time)
{
 for (i=0;i<time;i++)
 {
     asm("nop");
     asm("nop");
  asm("nop");
     asm("nop");
  asm("nop");
     asm("nop");
      asm("nop");
   asm("nop");
 }
}
调试时,能进去,但是我执行这段程序时,用   
for(i=0;i<1000;i++)
   {
    delay(10000);
   }
按理,我使用内部8M时钟,这里应该是10s,可结果是一秒不到就过了。。。问题出在哪?
在线等,谢谢大哥们了。。。

菜鸟
2008-07-28 09:04:53     打赏
7楼

请问什么叫做进不去?
首先,还有就是你的延时程序中使用的"i”是那里定义的?全局变量么?
建议修改:
void delay(unsigned int time)
{

 for (i=0;i<time;i++)
 {
     asm("nop");
     asm("nop");
  asm("nop");
     asm("nop");
  asm("nop");
     asm("nop");
      asm("nop");
   asm("nop");
 }


菜鸟
2008-07-28 09:04:57     打赏
8楼

请问什么叫做进不去?
首先,还有就是你的延时程序中使用的"i”是那里定义的?全局变量么?
建议修改:
void delay(unsigned int time)
{  

     for (i=0;i<time;i++)
 {
     asm("nop");
     asm("nop");
  asm("nop");
     asm("nop");
  asm("nop");
     asm("nop");
      asm("nop");
   asm("nop");
 }


菜鸟
2008-07-28 09:24:11     打赏
9楼
不好意思,没有写完,不小心使用了TAB键,结果一回车就发出去了。

请问什么叫做进不去?
首先,还有就是你的延时程序中使用的"i”是那里定义的?全局变量?
你的问题就出在这里。
你外面使用了一个for循环,里面也有一个for循环,致命的是这两个for循环的计数变量都是"i"。这会互相影响的。
for( i = 0; i < 1000; i ++ )
{
    /* delay 函数展开 */
    for( i = 0; i < 10000; i ++ )
    {
    }
    /* 当着个for循环完成的时候,i已经是10000了,由于>1000这个时候外面的循环就不进行了 */
}

建议修改:
void delay(unsigned int time)

    while(time --)
   {
      asm("nop");
      asm("nop");
      asm("nop");
      asm("nop");
      asm("nop");
      asm("nop");
      asm("nop");
      asm("nop");
   }
 }
其次关于你的时钟切换有隐患:
任何时候切换时钟,一定要先保证启动准备使用的时钟,再切换,最后再关闭原来的时钟。比如你的程序中的cm05 = 1这一句就应该放到切换完成后。


菜鸟
2008-07-28 09:24:45     打赏
10楼
此外,你的这段程序我觉得也要稍稍修改一些
void ClockInit(void)
{
 cm05=1;   // 没有解除保护位,这一位是无效的,况且在没有开启其他时钟的时候,不能停掉主时钟,否则CPU时钟就停止了
 prc0 = 1;    //打开和时钟相关的保护寄存器
 //cm05=1;       //主时钟停止,使用p4.6和p4.7作为输入端口使用
    cm16 = 0;  //CPU时钟不分频
    cm17 = 0;
    cm06 = 0;  //使用CM16和CM17设定的分频比
    hra00 = 1;  //启动高速时钟
    ocd2 = 1;   //使用片内时钟
    hra01 = 1;  //使用高速时钟
    prc0 = 0;    //关闭保护
}
建议这样改一下
void ClockInit(void)
{
    prc0 = 1;    //解除与时钟相关的保护寄存器
    hra00 = 1;  //启动高速时钟
    delay();      //你的延时程序
    hra01 = 1;  //使用高速时钟
    cm16 = 0;  //CPU时钟不分频
    cm17 = 0;
    cm06 = 0;  //使用CM16和CM17设定的分频比
    ocd2 = 1;   //使用片内时钟 
    cm05 = 1; // 主时钟停止
    prc0 = 0;    //开启保护
}

共16条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]