AnsweredAssumed Answered

[LLWU] the wake up goes in __isr_vector() at 0x00

Question asked by samuel boivineau on Oct 30, 2015
Latest reply on Nov 9, 2015 by samuel boivineau

Hello,

 

I am now facing some issue while trying to implement the wake up after a sleep phase. My need is quite simple, the system needs to sleep and use as low as possible of current, and wake up each X minutes, or upon a switch button pressed.

Si I took inspiration from the power manager rtos demo, but could'nt get the whole thing working.

My behaviour is currently :

- configure the power manager structures, especially :

power_manager_user_config_t const vlls1Config = {     .mode = kPowerManagerVlls1,     .lowPowerWakeUpOnInterruptValue = kSmcLpwuiEnabled,     .sleepOnExitValue = false, };

 

In the init :

void Init_Task(task_param_t init_data) {     _task_id t_id;     power_manager_error_code_t ret;     osa_status_t osa_ret;       osa_ret = OSA_Init();     if(osa_ret != kStatus_OSA_Success)     {         PRINTF("OSA_Init failed\n");     }     Gpio_Init();      // initialize power manager driver     POWER_SYS_Init(powerConfigs, powerConfigsSize, pm_callback_tbl, pm_callback_tbl_size);     ret = POWER_SYS_SetMode(0, kPowerManagerPolicyAgreement); // 0 = index of powerConfigs     osa_ret = OSA_Start(); [..]

And then I call a shell function "stop" :

 

int32_t Shell_stop(int32_t a, char *argv[]) {     power_manager_error_code_t ret;      // Wake up on SW1 - enables falling edge interrupt for switch SWx     PORT_HAL_SetPinIntMode(BOARD_SW_LLWU_BASE, BOARD_SW_LLWU_PIN, kPortIntFallingEdge);     OSA_InstallIntHandler(LLWU_IRQn, MQX_LLWU_IRQHandler);     INT_SYS_EnableIRQ(LLWU_IRQn);     NVIC_SetPriority(LLWU_IRQn, 6U);      LLWU_HAL_ClearExternalPinWakeupFlag(LLWU_BASE_PTR, (llwu_wakeup_pin_t)BOARD_SW_LLWU_EXT_PIN);     LLWU_HAL_SetExternalInputPinMode(LLWU_BASE_PTR,kLlwuExternalPinFallingEdge, (llwu_wakeup_pin_t)BOARD_SW_LLWU_EXT_PIN);      ret = POWER_SYS_SetMode(1, kPowerManagerPolicyAgreement); // 1 = index de powerConfigs     if (ret != kPowerManagerSuccess)     {         PRINTF("POWER_SYS_SetMode(1) returned unexpected status : %u\n\r", ret);         return 1;     }     return 0; }

 

I am supposing the ISR function that should be called is one of those :

/* IRQ handler for switch/button. */ void BOARD_SW_LLWU_IRQ_HANDLER(void) {     PORT_HAL_ClearPortIntFlag(BOARD_SW_LLWU_BASE); } /* LLW_IRQHandler that would cover the same name's APIs in startup code */ void MQX_LLWU_IRQHandler(void) {     // The LLWU wakeup interrup is Switch/Button source     if (LLWU_HAL_GetExternalPinWakeupFlag(LLWU_BASE_PTR,(llwu_wakeup_pin_t)BOARD_SW_LLWU_EXT_PIN))     {          LLWU_HAL_ClearExternalPinWakeupFlag(LLWU_BASE_PTR, (llwu_wakeup_pin_t)BOARD_SW_LLWU_EXT_PIN);     } }  void LLWU_IRQHandler(void) {    LLWU_HAL_ClearExternalPinWakeupFlag(LLWU_BASE_PTR, (llwu_wakeup_pin_t)BOARD_SW_LLWU_EXT_PIN); }

 

What is curious is, when I am executing this software, and calling the stop function, then everything stops (no led blinking etc), so it seems to be effectively in vlls1. But when I push the button, the boards wakes up and I get the debugger (KDS + PE Multilink) saying : __isr_vector() at 0x00,   instead of some line of a standard reset flow. What is also curious is, my board actually reboots and I get the correct reset flow (init + shell) but there is some reboot during this reset flow, so I am actually getting this on the uart :

**************************************************************** Init of system... init i2c ok Flash Information: Exec from Blocks 0/1 Flash is UNSECURE!  task gpio created. task main created. Starting HTTP server No.0 on IP 192.168.1.202, port 80...[OK]  Shell (build: Sep  2 2015) Copyright (c) 2013-2014 Freescale Semiconductor; shell> shell> shell> stop **************************************************************** Init of system... init i2c ok Flash Information: Exec from Blocks 0/1 Flash is UNSECURE!  task gpio created. task main created.  **************************************************************** Init of system... init i2c ok Flash Information: Exec from Blocks 0/1 Flash is UNSECURE!  task gpio created. task main created. Starting HTTP server No.0 on IP 192.168.1.202, port 80...[OK]  Shell (build: Sep  2 2015) Copyright (c) 2013-2014 Freescale Semiconductor; shell> shell>

 

So I think I am missing some tiny little thing about the LLWU interrupts, some misconfiguration, but apparently the wake up seems ok, it's just the jump from wakeup to isr_vector that I cannot explain.

Other point, if I don't use a debugger, then I cannot get a wake up after the sleep. The systems seems to get lost during the wake up, before any init (no output on uart).

 

So how could I debug this ? Do you know how I could check (by debug or printf) if my config is ok, adress of isr, or anything before going in sleep ?

 

Thanks for you help

Samuel

Outcomes