R8C/1A使用内部时钟程序
这是我写的使用内部时钟程序,可编译时一直死在那里,不能进入,估计是这个程序有问题,恳请高手们帮忙诊断。万分感谢。
void ClockInit(void)
{
ocd2=1; //选择内部振荡器时钟//
hra00=1; //高速内部振荡器振荡//
delay(1000);
hra1=0; //使用系统默认的高速内部振荡器8MHz//
delay(1000);
cm14=0;
hra01=1; //使用内部高速振荡器时钟(Fring-fast)作为内部时钟(Fring)//
ocd2=1; //使用内部时钟作为系统时钟//
}
关键词: 使用 内部 时钟 程序
你的问题在于,没有打开保护寄存器。你仔细看看硬件手册,是不是在和时钟相关的寄存器(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; //关闭保护
}
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; //关闭保护
}
内部晶振貌似开启了,可延时程序一直进不去是怎么回事?
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,可结果是一秒不到就过了。。。问题出在哪?
在线等,谢谢大哥们了。。。
请问什么叫做进不去?
首先,还有就是你的延时程序中使用的"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");
}
请问什么叫做进不去?
首先,还有就是你的延时程序中使用的"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");
}
请问什么叫做进不去?
首先,还有就是你的延时程序中使用的"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这一句就应该放到切换完成后。
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; //开启保护
}
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
vscode+cmake搭建雅特力AT32L021开发环境被打赏30分 | |
【换取逻辑分析仪】自制底板并驱动ArduinoNanoRP2040ConnectLCD扩展板被打赏47分 | |
【分享评测,赢取加热台】RISC-V GCC 内嵌汇编使用被打赏38分 | |
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 |