1 代码介绍
用户可根据上述的操作流程及注意事项编写自己的代码来学习验证该模块,也可以直接通过小
华半导体的网站下载到设备驱动库(Device Driver Library, DDL)的样例代码并使用其中的
LPM 里有关 stop mode的样例进行验证。
以下部分简要介绍本 AN 基于 DDL 的 LPM 模块样例 lpm_stop_wkup 代码所涉及的各项配置。
1) LED 和 PORT 初始化:
本样例使用外部管脚中断唤醒 stop 模式,需对 port 进行初始化,确保对应 port 中断使能。
2) STOP 模式配置:
- /* Config stop mode. */
- stcPwcStopCfg.enStpDrvAbi = StopHighspeed;
- stcPwcStopCfg.enStopClk = ClkFix;
- stcPwcStopCfg.enStopFlash = Wait;
- PWC_StopModeCfg(&stcPwcStopCfg);
3) 中断配置:
本样例使用外部管脚 0 中断,上升沿有效, 数字滤波无效。
- /* EIRQ0 config. */
- stcExintCfg.enExitCh = ExtiCh00;
- stcExintCfg.enFilterEn = Disable;
- stcExintCfg.enExtiLvl = ExIntRisingEdge;
- EXINT_Init(&stcExintCfg);
- /* Register EIRQ0.*/
- stcPortIrqCfg.enIntSrc = INT_PORT_EIRQ0;
- stcPortIrqCfg.enIRQn = PORT_IRQn;
- stcPortIrqCfg.pfnCallback = Port_Handle;
- enIrqRegistration(&stcPortIrqCfg);
4) 设置 STOP 模式中断唤醒源
- /* Set wake up source EIRQ0. */
- enIntWakeupEnable(Extint0WU);
- /* Enable EIRQ. */
- enIntEnable(Int0);
- NVIC_ClearPendingIRQ(PORT_IRQn);
- NVIC_SetPriority(PORT_IRQn,DDL_IRQ_PRIORITY_DEFAULT);
- NVIC_EnableIRQ(PORT_IRQn);
5) 使能唤醒源中断:
- /* Ensure DMA disable */
- while((0 != M4_DMA1->EN_f.EN) && ((0 != M4_DMA2->EN_f.EN)));
- /* Ensure FLASH is ready */
- while(1 != M4_EFM->FSR_f.RDY);
- PWC_EnterStopMd();
6) 进入 STOP 模式前外设状态:
确保 FLASH 不处于编程或者擦除状态,确保 DMA 处于停止状态,关闭其他外设中断。
- <blockquote>/* Ensure DMA disable */
7) 唤醒后中断处理流程:
- __IRQ_Handler:
- PWC_IrqClkRecover(); // in pairs use
- LED0_TOGGLE(); // user application
- Ddl_Delay1ms(1000);
- PWC_IrqClkBackup(); // in pairs use
非停止模式唤醒后的中断无需进行时钟相关配置处理。
|