i.MXRT117x suspend wakeup from specific interrupts

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

i.MXRT117x suspend wakeup from specific interrupts

366 次查看
alonbl
Contributor III

Hello,

I am trying to put the i.MXRT 117x into sleep and wakeup from specific source. I could not find any good reference of best practices, I collected the implementation from various source.

I came up with the following, however, it wakes up also for these that I setup to ignore.

static
void
_enter_low_powerdown(void) {
GPC_CM_SetNextCpuMode(GPC_CPU_MODE_CTRL_0, kGPC_StopMode);
GPC_CM_EnableIrqWakeup(GPC_CPU_MODE_CTRL_0, GPIO13_GPIO_COMB_0_15_IRQN, true);
GPC_CM_EnableIrqWakeup(GPC_CPU_MODE_CTRL_0, GPIO3_GPIO_COMB_0_15_IRQN, false);
GPC_CM_EnableIrqWakeup(GPC_CPU_MODE_CTRL_0, GPT3_GPT_IRQN, false);

PRINTF("SUSPEND\r\n");
DbgConsole_EnterLowpower();

SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;

__disable_irq();

__WFI();

__enable_irq();

DbgConsole_ExitLowpower();
PRINTF("WAKEUP\r\n");

BOARD_InitPins();
}

 Does anybody know how to setup the sleep so that it will only wakeup from the sources listed? I would like to avoid setting up and re-resetting the devices.

Thanks,

标记 (3)
0 项奖励
回复
2 回复数

338 次查看
Gavin_Jia
NXP TechSupport
NXP TechSupport

Hi @alonbl ,

 

You can try the project power_mode_switch_bm_dcdc in SDK. The Power mode switch demo application demonstrates the usage of power modes. 

Cpu mode switch:
Press A to enter cpu mode RUN
Press B to enter cpu mode WAIT
Press C to enter cpu mode STOP
Press D to enter cpu mode SUSPEND
Press E to enter cpu mode WAIT, system standby
Press F to enter cpu mode STOP, system standby
Press G to enter cpu mode SUSPEND, system standby
Press 'Q' to exit

Waiting for select...

When 'C' is selected, the menu shows wake up source selection for SNVS mode.

Select the wake up source:
Press T for Timer
Press S for switch/button SW7.

This part of the implementation in the demo should help you.

 

Best regards,

Gavin

0 项奖励
回复

320 次查看
alonbl
Contributor III

Hello @Gavin_Jia,

Thank you for the reference. The example is fairly complex. I tried to shrink it and found that the missing bit was probably GPC_CM_RequestStandbyMode(), I hope I did not dropped any important functionality, this seems to work and is minimal,  I will appreciate feedback.

Thanks,

 

AT_QUICKACCESS_SECTION_CODE(static void _enter_low_powerdown(bool halt));
static
void
_enter_low_powerdown() {
GPC_CM_SetNextCpuMode(GPC_CPU_MODE_CTRL_0, kGPC_StopMode);
GPC_CM_EnableCpuSleepHold(GPC_CPU_MODE_CTRL_0, true);
GPC_CPU_MODE_CTRL_0->CM_NON_IRQ_WAKEUP_MASK |=
GPC_CPU_MODE_CTRL_CM_NON_IRQ_WAKEUP_MASK_EVENT_WAKEUP_MASK_MASK |
GPC_CPU_MODE_CTRL_CM_NON_IRQ_WAKEUP_MASK_DEBUG_WAKEUP_MASK_MASK; /* Mask debugger wakeup */
GPC_CM_RequestStandbyMode(GPC_CPU_MODE_CTRL_0, kGPC_StopMode);

PRINTF("SUSPEND\r\n");
DbgConsole_EnterLowpower();

uint32_t saved_mask = DisableGlobalIRQ();
__DSB();
__ISB();

SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;

__WFI();

EnableGlobalIRQ(saved_mask);
__DSB();
__ISB();

DbgConsole_ExitLowpower();
PRINTF("WAKEUP\r\n");

BOARD_InitPins();
}

 

0 项奖励
回复