Board logo

标题: [求助](续)MC9S12XDP512 STOP MODE [打印本页]

作者: ygs090608    时间: 2007-1-16 15:13     标题: [求助](续)MC9S12XDP512 STOP MODE

各位大侠:
Datasheet上说,CCR中的S位控制STOP使能,当S位为0时才能进入STOP MODE.复位后S位为1,如何清零S位呢?
请指教!小弟先谢过了!
作者: strongchen    时间: 2007-1-16 15:21

The system stop modes are entered if the CPU executes the STOP instruction and the XGATE doesn't execute a thread and the XGFACT bit in the XGMCTL register is cleared. Depending on the state of the PSTP bit in the CLKSEL register the MCU goes into pseudo stop mode or full stop mode. Please refer to CRG section.
作者: ygs090608    时间: 2007-1-16 15:51

谢谢版主!
我试过了,执行asm STOP(默认PSTP=0的情况下)是没什么作用的,该语句下面的程序照样执行(没有任何中断唤醒).但如果把 asm STOP; 换成 asm WAI;下面的语句就不会再执行了,进入了WAIT模式.所以我觉得根本就没有进入STOP模式.
作者: strongchen    时间: 2007-1-16 16:08

XGFACT位呢?
作者: ygs090608    时间: 2007-1-17 09:14

XGFACT会被清0吧,不过这个我还没做过实验。
已经找到清S位的答案了:asm{ANDCC #0x7F},再执行asm STOP;否则执行asm STOP就相当于执行了asm NOP;但现在又出现一个问题,如果在执行asm STOP之前打开5ms的周期中断(Period Interrupt Timer,而非RTI),MCU会被唤醒。应该不能唤醒才对啊。
作者: strongchen    时间: 2007-1-17 09:28

RTI可以将MCU从STOP模式唤醒。
作者: ygs090608    时间: 2007-1-17 11:03

打开的是5msPIT,而非RTI。在STOP模式下,PIT是被关断的。所以不应该被唤醒。
作者: TristoneGao    时间: 2007-1-18 09:41

我按照你的说法在freescale的MC9S12XDP512的demo板上试了一下。没有发现异常。即STOP之后PIT就停了。以下是测试程序,供参考:
void SetPIT(void)
{
PITCFLMT&=0x7F; //disable PIT first
PITMUX = 0x00; //use macro timer 0

while (PITTF) PITTF=0x0F; //clear all exist overflow flag

PITMTLD0 = 0;
PITLD0 = 5000;

PITINTE =0x01; //enable the PIT channel 0 interrupt
PITCE = 0x01; //enable the PIT channel 0

PITCFLMT|=0x80; //enable PIT
}


void StopTest(void)
{
__asm {

ANDCC #$7F;
STOP;
};
}


#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt void PIT_Channel0()
{

while (PITTF) PITTF=0x0F; //clear all exist overflow flag
printf("* ");
}

在main()中先调用SetPIT(),再调用StopTest(),则中断程序不会执行。如果不调用StopTest(),则中断程序会执行,不断打印出'*'号。

估计问题不在STOP/PIT,可检查一下其它方面。建议先将XGATE disable再试一下。

祝好运!
作者: ygs090608    时间: 2007-1-18 11:19

谢谢楼上的。
我用你的程序试了一下,还是会执行中断。我建project的时候已经把XGATE disable了,用普通方式来处理中断。真是纳闷儿。
作者: strongchen    时间: 2007-1-18 11:31

把你的project贴出来看看?
作者: ygs090608    时间: 2007-1-18 11:46

int i,a;

void SetupPITimer (void)
{
/* time-out period = (PITMTLD0 + 1) * (PITLD0 + 1) / Fbus */
PITMUX &= ~( 0x01 | 0x02 | 0x04); /* T0,T1 and T2 count with MT0 time base (0.25 us)*/
PITCE |= (0x01 | 0x02 | 0x04); /* enable PIT channel 0,1,2 */
PITCFLMT |= (0x80); /* PITE=1 (enable PIT) */
}

void Enable5msPITimer (void)
{
PITTF |= 0x01; /* clear PIT interrupt */
PITMTLD0 = 0x01; /* MT0 load value (divides bus clock) */
PITLD0 = 9999; /* T0 load value (5 ms) */
PITCFLMT |= 0x01; /* PFLMT0=1 (reload MT0) */
PITFLT |= 0x01; /* force reload of PIT channel 0 */
PITINTE |= 0x01; /* enable PIT channel 0 interrupt */
}

void IoInit (void)
{

DDRM |= 0x40;
PTM_PTM6 = 0;

}

void STOP_Enable (void)
{
asm
{
ANDCC #0x7F;
}
}


void main(void)
{
/* put your own code here */

IoInit();

SetupPITimer();

//Enable5msPITimer();

STOP_Enable();

EnableInterrupts;

for(;;)
{
//for(i=0;i<5000;i++) { }

Enable5msPITimer();

asm STOP;

}

}


/* interrupt handler for PIT 0 */
interrupt void ISR_PIT0 ()
{
//PITINTE &= not_bit0; /* disable this interrupt for channel 0 */

PITTF |= 0x01; /* clear the interrupt flag */

PTM_PTM6 = ! PTM_PTM6;

}

我用M6口做测试。可以看到方波。说明PIT一直在执行。
作者: strongchen    时间: 2007-1-18 15:11

最好将整个project打包贴出来。有时可能不只是源程序的问题。
作者: ygs090608    时间: 2007-1-18 15:57

http://bbs.eccn.com/uploadImages/stop test.rar
作者: strongchen    时间: 2007-1-18 16:30

文件名和路径名中间不能有空格,否则无法链接。再上传一次吧!
作者: ygs090608    时间: 2007-1-19 08:46

http://bbs.eccn.com/uploadImages/sleep.rar
作者: zephanshaka    时间: 2008-7-9 21:44

我觉得程序中的 ANDCC #0x7f 后面应该紧跟着 stop指令。否则如果中间有中断发生,可能会改变s位的状态,从而无法进入stop模式。
作者: sunyiping    时间: 2009-5-15 18:23

大侠们好! MC9S12XDP512MAG 和MC9S12DP512MPVE 飞思卡尔的我们长期有货,价格特价,和有优势!

联系:13713760341 孙一平 QQ:348980241






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