MC9S12G128 wake up from Pseudo Stop Mode

取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 
已解决

MC9S12G128 wake up from Pseudo Stop Mode

跳至解决方案
2,213 次查看
1090097669
Contributor III

MC9S12G128 wake up from Pseudo Stop Mode,After Wake up Where is the program running position? if MCU wakes up from Isr,How to make the chip rerun to the main function without resetting?

I am using this chip for Pseudo Stop Mode,and wake it up from can wake up Interrupt ,however ,i can not confirm the program runing position after MCU waked,and MCU encounter reset ,Please check my fault of my code;

void interrupt Vcanwkup_ISR(void)
{
CANRFLG_WUPIF = 1;
CANRFLG = 0x80;
CANCTL0 = 0x00;
CANRIER = 0x01;
PLL_init();
if(TRUE == systemGotoSleepModeFlag)
{
//_MCU_Reset();
_MCU_Reset_Flag = 1;
}
}

the other function

{

    if(_MCU_Reset_Flag == 1)
{
_MCU_Reset_Flag = 0;
_MCU_Restart(); 
}
 

}

 

thanks very much

Regards!

标签 (1)
1 解答
1,977 次查看
RadekS
NXP Employee
NXP Employee

Hi Katrinal,
when MCU wake-up from stop mode, the CPU executes ISR and after that, it returns on next instruction just below STOP instruction.
Note: the STOP instruction must not be executed from ISR (where I-bit is set and MCU cannot wake-up by I-bit maskable interrupts).

See attached example code for CAN wake-up from stop mode (for S12XE).

commands for enable CAN wake-up (inside CAN init function):

CANCTL0_WUPE = 1; //wake up enable
 CANRIER_WUPIE = 1; //wake up interrupt enable


commands for go to sleep (somewhere in main() function):

CANCTL0_SLPRQ = 1; //sleep mode request
 while(CANCTL1_SLPAK == 0); //wait for acknowledge of sleep mode
 
 asm ANDCC #0x7F; //clear S bit
 asm nop;
 asm STOP; //STOP mode‍‍‍‍‍‍‍‍‍

example of CAN wake-up test ISR:

#pragma CODE_SEG NON_BANKED
interrupt VectorNumber_Vcanwkup void CAN_WAKE(void)
{
 while(1){
//add code for LED toggling here - according your board
 for(i=0; i<50000; i++){
 asm nop;
 }
 }
}
#pragma CODE_SEG DEFAULT‍‍‍‍‍‍‍‍‍‍‍‍‍

We have to enter CAN sleep mode (it waits until all Tx buffers are empty and current Rx transfer finish) before MCU STOP instruction execution for avoiding generating invalid messages on CAN bus.

I hope it helps you.

Radek

在原帖中查看解决方案

3 回复数
1,978 次查看
RadekS
NXP Employee
NXP Employee

Hi Katrinal,
when MCU wake-up from stop mode, the CPU executes ISR and after that, it returns on next instruction just below STOP instruction.
Note: the STOP instruction must not be executed from ISR (where I-bit is set and MCU cannot wake-up by I-bit maskable interrupts).

See attached example code for CAN wake-up from stop mode (for S12XE).

commands for enable CAN wake-up (inside CAN init function):

CANCTL0_WUPE = 1; //wake up enable
 CANRIER_WUPIE = 1; //wake up interrupt enable


commands for go to sleep (somewhere in main() function):

CANCTL0_SLPRQ = 1; //sleep mode request
 while(CANCTL1_SLPAK == 0); //wait for acknowledge of sleep mode
 
 asm ANDCC #0x7F; //clear S bit
 asm nop;
 asm STOP; //STOP mode‍‍‍‍‍‍‍‍‍

example of CAN wake-up test ISR:

#pragma CODE_SEG NON_BANKED
interrupt VectorNumber_Vcanwkup void CAN_WAKE(void)
{
 while(1){
//add code for LED toggling here - according your board
 for(i=0; i<50000; i++){
 asm nop;
 }
 }
}
#pragma CODE_SEG DEFAULT‍‍‍‍‍‍‍‍‍‍‍‍‍

We have to enter CAN sleep mode (it waits until all Tx buffers are empty and current Rx transfer finish) before MCU STOP instruction execution for avoiding generating invalid messages on CAN bus.

I hope it helps you.

Radek

1,977 次查看
1090097669
Contributor III

Hi Radek,

   there is a question that  after the chip sleeps, power on again after a period of time (About 20s), it may automatically trigger a CAN wakeup interrupt, resulting in an incorrect process,How to avoid this phenomenon?

0 项奖励
回复
1,977 次查看
1090097669
Contributor III

Hi Radek,

      Unfortunately,it did not work , The function I want to complete is prohibiting MCU resetting Since I set up the bootloader,however, MCU enter Reset Status  after waking  up by Can Interrupt ,because I am able to read BootLoader status firstly ,then MCU enter Appliction program,Blow is my code ,please point my fault ,Thanks!

void SleepPro(void)

{

    if(1 == WAKE_OBC_DAT)
   {
      systemGotoSleepModeFlag = 1 ;
      MCU_Stop();/*open Can Wake up and go to sleep*/
      if(_MCU_Reset_Flag == 1)
      {
      _MCU_Reset_Flag = 0;
      _Startup();
      }
   }
   else
   {
      systemGotoSleepModeFlag = 0;
   }

}   

void interrupt Vcanwkup_ISR(void)
{
   CANRFLG_WUPIF = 1;
   CANRFLG = 0x80;
   CANCTL0 = 0x00;
   CANRIER = 0x01;
   PLL_init();
   if(TRUE == systemGotoSleepModeFlag)
   {
   _MCU_Reset_Flag = 1;
   }
}

0 项奖励
回复