Board logo

标题: GT60单片机怎样用RTI从STOP2模式恢复到主程序中 [打印本页]

作者: cloud1    时间: 2005-8-3 14:04     标题: GT60单片机怎样用RTI从STOP2模式恢复到主程序中

我想让单片机进入stop2模式然后用RTI唤醒。我的程序看起来是能够进入RTI中断里的,我也重新复位各个寄存器了,可还是没用,然后程序就跑飞。

请高手指点一下
作者: strongchen    时间: 2005-8-3 14:55

需要注意几点:
1. 若进入STOP2模式,此时RTI的时钟源只能采用1KHz的内部时钟;
2. RTI产生中断,将MCU唤醒后,若要采用外部晶振,必须先开启,等待稳定,再切换;
3. 在进入STOP2前,应该将需要保存的寄存器设置值保存在RAM中。唤醒后,应该先将保存的值回送至寄存器,再将PPDACK位置1。
还有一些要注意的问题,请参见AN2493。
作者: cloud1    时间: 2005-8-3 15:32

“在进入STOP2前,应该将需要保存的寄存器设置值保存在RAM中。唤醒后,应该先将保存的值回送至寄存器”。

这句话什么意思,我唤醒后,重新给寄存器赋值难道不可以么?,比如SPMSC2=0x03;
作者: cloud1    时间: 2005-8-3 16:32

我就是这样做的,可还是不成,下面是我的源代码,你帮着给看看,谢谢了。 #include /* for EnableInterrupts macro */ #include /* include peripheral declarations */ void main(void) { unsigned long i; i=0; SOPT = 0x73; IRQSC = 0x16; //外部中断 Pin Enable, IE, IRQ CLR, negative edge ICGC1_RANGE = 1; /* Range High. */ ICGC1_OSCSTEN = 0; /* Osc enabled in off mode. */ ICGC1_CLKS = 0x00; /* Self clocked. */ SRTISC = 0x17; SPMSC1 = 0; SPMSC2=SPMSC2|0x03; //STOP2 PTDDD_PTDDD0=1; PTDDD_PTDDD3=1; EnableInterrupts; asm stop SOPT = 0x73; IRQSC = 0x16; //外部中断 Pin Enable, IE, IRQ CLR, negative edge ICGC1_RANGE = 1; /* Range High. */ ICGC1_OSCSTEN = 0; /* Osc enabled in off mode. */ ICGC1_CLKS = 0x00; /* Self clocked. */ PTDDD_PTDDD0=1; PTDDD_PTDDD3=1; EnableInterrupts; while(1){ for(i=0;i<1000;i++); PTDD_PTDD0=0; PTDD_PTDD3=1; for(i=0;i<1000;i++); PTDD_PTDD0=1; PTDD_PTDD3=0; } } interrupt 25 void rtii(){ long int ii; static int c; SOPT = 0x73; IRQSC = 0x16; //外部中断 Pin Enable, IE, IRQ CLR, negative edge ICGC1_RANGE = 1; /* Range High. */ ICGC1_OSCSTEN = 0; /* Osc enabled in off mode. */ ICGC1_CLKS = 0x00; /* Self clocked. */ SRTISC_RTIACK=1; while(!SPMSC2_PPDF); SPMSC2_PPDACK=1; c++; EnableInterrupts; SPMSC1 = 0; SPMSC2=SPMSC2|0x03; //STOP2 PTDDD_PTDDD0=1; PTDDD_PTDDD3=1; for(ii=0;ii<1000;ii++); PTDD_PTDD0=0; PTDD_PTDD3=1; for(ii=0;ii<1000;ii++); PTDD_PTDD0=1; PTDD_PTDD3=0; if(c<3) { SRTISC = SRTISC|0x17; asm stop } else{ SRTISC_RTIE=0; SRTISC_RTIS=0; } EnableInterrupts; }
作者: strongchen    时间: 2005-8-3 16:33

当然可以,如果寄存器的设置是固定的,与程序运行状态无关。


[此贴子已经被strongchen于2005-8-3 16:33:09编辑过]


作者: cloud1    时间: 2005-8-3 16:36

这个程序肯定可以进入stop2模式,然后也能到达RTI的中断,可以从电流的变化看出来,调试窗口则看不到进入中断中断,大概是因为已经进入了STOP模式的原因。可是就是无法从RTI中断程序里恢复到主程序,而且RTI中断里的程序一行好像都没有执行。
作者: cloud1    时间: 2005-8-3 16:37

我的STOP3程序就是可以的
作者: strongchen    时间: 2005-8-3 17:38

还是请先仔细看一看AN2493。其中也有一些参考源程序。
另外查一下编译后,RTI的矢量地址是否正确。
还要注意SPMSC1和SPMSC2寄存器的某些位是一次性写入的。这意味着在复位后第一次写入时这些位的数值必须同时写入。以后再写入这些位是无效的。



[此贴子已经被strongchen于2005-8-3 17:38:06编辑过]


作者: cloud1    时间: 2005-8-3 17:58

我看了AN2493可惜全是汇编,正在努力往C上移植。
请问怎样看编译后的RTI矢量地址
作者: strongchen    时间: 2005-8-4 10:29

可以看.MAP文件中的说明和.S19文件中的数据。看看地址$FFCC.$FFCD中的数据是否为RTI函数的入口地址。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0