GT60单片机怎样用RTI从STOP2模式恢复到主程序中
- UID
- 96377
- 性别
- 男
|
GT60单片机怎样用RTI从STOP2模式恢复到主程序中
我想让单片机进入stop2模式然后用RTI唤醒。我的程序看起来是能够进入RTI中断里的,我也重新复位各个寄存器了,可还是没用,然后程序就跑飞。
请高手指点一下 |
|
|
|
|
|
- UID
- 104380
- 性别
- 男
|
需要注意几点:
1. 若进入STOP2模式,此时RTI的时钟源只能采用1KHz的内部时钟;
2. RTI产生中断,将MCU唤醒后,若要采用外部晶振,必须先开启,等待稳定,再切换;
3. 在进入STOP2前,应该将需要保存的寄存器设置值保存在RAM中。唤醒后,应该先将保存的值回送至寄存器,再将PPDACK位置1。
还有一些要注意的问题,请参见AN2493。 |
|
|
|
|
|
- UID
- 96377
- 性别
- 男
|
“在进入STOP2前,应该将需要保存的寄存器设置值保存在RAM中。唤醒后,应该先将保存的值回送至寄存器”。
这句话什么意思,我唤醒后,重新给寄存器赋值难道不可以么?,比如SPMSC2=0x03; |
|
|
|
|
|
- UID
- 96377
- 性别
- 男
|
我就是这样做的,可还是不成,下面是我的源代码,你帮着给看看,谢谢了。
#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;
} |
|
|
|
|
|
- UID
- 104380
- 性别
- 男
|
当然可以,如果寄存器的设置是固定的,与程序运行状态无关。
[此贴子已经被strongchen于2005-8-3 16:33:09编辑过] |
|
|
|
|
|
- UID
- 96377
- 性别
- 男
|
这个程序肯定可以进入stop2模式,然后也能到达RTI的中断,可以从电流的变化看出来,调试窗口则看不到进入中断中断,大概是因为已经进入了STOP模式的原因。可是就是无法从RTI中断程序里恢复到主程序,而且RTI中断里的程序一行好像都没有执行。 |
|
|
|
|
|
- UID
- 96377
- 性别
- 男
|
|
|
|
|
|
- UID
- 104380
- 性别
- 男
|
还是请先仔细看一看AN2493。其中也有一些参考源程序。
另外查一下编译后,RTI的矢量地址是否正确。
还要注意SPMSC1和SPMSC2寄存器的某些位是一次性写入的。这意味着在复位后第一次写入时这些位的数值必须同时写入。以后再写入这些位是无效的。
[此贴子已经被strongchen于2005-8-3 17:38:06编辑过] |
|
|
|
|
|
- UID
- 96377
- 性别
- 男
|
我看了AN2493可惜全是汇编,正在努力往C上移植。
请问怎样看编译后的RTI矢量地址 |
|
|
|
|
|
- UID
- 104380
- 性别
- 男
|
可以看.MAP文件中的说明和.S19文件中的数据。看看地址$FFCC.$FFCD中的数据是否为RTI函数的入口地址。 |
|
|
|
|
|