Weakup from LLS failed,it resets every time

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

Weakup from LLS failed,it resets every time

跳至解决方案
1,125 次查看
stephenkung
Contributor I

Hi,

I'm working with KL25 on freedom board.I have a question about LLWU module and enter-exit from LLS mode.

I have written 3 projects to weakup my mcu from lls mode.I tried with the TSI ,LPTMR and the external pin ,using them as the source of LLWU.But the outcom is the same.Every time,when the interrupt happened ,the MCU will reset.

Here is the simplest one.Using the extern pin as the source of LLWU:

void LLWU_Init(void);

uint8 llwu_wake_up_flag=0;   //the flag of weekup

int main()

{

  uart_init(UART1_BASE_PTR, 24000, 9600);

  GPIO_Init(PORTC, 16, GPIO_OUTPUT, 0);   //led on

  GPIO_Init(PORTC, 3, GPIO_INPUT, 0);   //the souce of LLWU is a gpio input  button

  uart_putchar( UART1_BASE_PTR,'W');    //send a char

  LLWU_Init();

  while(1)

  {

   enter_lls();

   if(key_weakup==1)    //weak up form LLS

  {

   GPIO_SetBit(PORTC,16);   //led off

   Delay1Us(20000);

   uart_putchar( UART1_BASE_PTR,'Y');

   }

   else

   {

    Delay1Us(20000);

    uart_putchar( UART1_BASE_PTR,'N');

   }

  }

}

void LLWU_Init(void)

{

    enable_irq(LLWU_irq_no);

   llwu_configure(0x0080, 0x02, 0x00);    // External input enabled as falling edge detection

}

void enter_lls(void)

{

  volatile unsigned int dummyread;

  /* Write to PMPROT to allow LLS power modes this write-once

     bit allows the MCU to enter the LLS low power mode*/

  SMC_PMPROT = SMC_PMPROT_ALLS_MASK;

  /* Set the STOPM field to 0b011 for LLS mode  */

  SMC_PMCTRL &= ~SMC_PMCTRL_STOPM_MASK;

  SMC_PMCTRL |=  SMC_PMCTRL_STOPM(0x3);

  /*wait for write to complete to SMC before stopping core */

  dummyread = SMC_PMCTRL;

  dummyread++;

  /* Now execute the stop instruction to go into LLS */

  #ifdef CMSIS

  /* Set the SLEEPDEEP bit to enable deep sleep mode (STOP) */

  SCB_SCR |= SCB_SCR_SLEEPDEEP_MASK;

  __wfi();

#else

  stop();

#endif

}

void llwu_configure(unsigned int pin_en, unsigned char rise_fall, unsigned char module_en ) {

    uint8 temp;

    temp = LLWU_PE2;

    if( pin_en & 0x0080)

    {

        temp |= LLWU_PE2_WUPE7(rise_fall);

        printf("\n LLWU configured pins PTC3/SCI1_RX/FTM0_CH2 is LLWU wakeup source ");

        LLWU_F1 |= LLWU_F1_WUF7_MASK;   // write one to clear the flag

    }

    LLWU_PE2 = temp;

}

void llwu_isr(void){

   printf("go to LLWU INT");

   if (LLWU_F1 & LLWU_F1_WUF7_MASK) {

   //    printf("****WUF7 was set from PTC3 input  *****\r\n");

       LLWU_F1 |= LLWU_F1_WUF7_MASK;   // write one to clear the flag

       key_weakup=1;

   }

   NVIC_ICPR |= 1 << (LLWU_irq_no%32);

}

Here is the outcome:

26.PNG

whenever  I press the button.The mcu will reset,send a 'w' to the uart1 and print the information of llwu init. I don't know why.Could anybody help me?I am really anxious.

标签 (1)
1 解答
734 次查看
Kan_Li
NXP TechSupport
NXP TechSupport

Seems you didn't disable the clock monitor before enter LLS mode, please try the following code instead.

void LLWU_Init(void)

{

    clk_monitor_0(OFF);

    enable_irq(LLWU_irq_no);

    llwu_configure(0x0080, 0x02, 0x00);    // External input enabled as falling edge detection

}

I also attached my test project here.

Press any key to enter lls , and pull PTC3 down would wake up the device:

1.PNG

Hope that helps,

B.R

Kan

在原帖中查看解决方案

2 回复数
735 次查看
Kan_Li
NXP TechSupport
NXP TechSupport

Seems you didn't disable the clock monitor before enter LLS mode, please try the following code instead.

void LLWU_Init(void)

{

    clk_monitor_0(OFF);

    enable_irq(LLWU_irq_no);

    llwu_configure(0x0080, 0x02, 0x00);    // External input enabled as falling edge detection

}

I also attached my test project here.

Press any key to enter lls , and pull PTC3 down would wake up the device:

1.PNG

Hope that helps,

B.R

Kan

734 次查看
stephenkung
Contributor I

Hi,

thank you very much for your answer.I have tried with your code,now it works correctly!

0 项奖励
回复