我使用efm32wg395f256芯片,运行freertos.我想在系统电量(使用电池供电的设备)还剩10%时,使MCU进入EM3,然后,当充电时,充电芯片的充电状态引脚会从高电平变成低电平,这个引脚与MCU的一个GPIO连接,我就是利用这个GPIO中断来唤醒MCU,使其从EM3到EM0,希望系统重新正常运行。现在的问题是,可以确定在进入EM3之后,再充电时,检测到这个GPIO中断了,但是系统没有继续运行。我的设置如下:在进EM3前,我把那个GPIO设置成中断模式,然后关闭了一些时钟,然后就进入EM3,部分代码如下:
{
LETIMER_Enable(LETIMER0, false); //关掉tickmessage
CMU_ClockEnable(cmuClock_LESENSE, false); /* disenable clock for LESENSE.也就是触摸 */
CMU_ClockEnable(cmuClock_LEUART0, false);
// CMU_ClockEnable(cmuClock_CORELE, false);
RTC_Enable(false); //把系统彻底关闭
// WDOG_Init(&wathdoginit);
LEUART_IntDisable(LEUART0, LEUART_IEN_SIGF);
SysCtlDelay(100);
WDOG_Enable(false);
while (WDOG->SYNCBUSY & WDOG_SYNCBUSY_CTRL); //这个很关键,如果刚操作了看门狗定时器,就进入EM3的话,会导致看门狗没有被关闭。
EMU_EnterEM3(false);
}
在那个中断处理中的代码如下:
{
uint32_t status;
status = GPIO->IF;
GPIO->IFC = status;
if (status & (1 << CHARGER_STA_PIN))
{
wakeCount++;
GPIO_PinOutToggle(LED_GPIOPORT, LED_PIN ); //检测充电是否来中断。
wakeupFlag = true;
// CMU_ClockEnable(cmuClock_CORELE, true);
LETIMER_Enable(LETIMER0, true);//
CMU_ClockEnable(cmuClock_GPIO, true);
CMU_ClockEnable(cmuClock_LESENSE, true);
RTC_Enable(true);
GPIO_PinModeSet(CHARGER_STA_GPIOPORT, CHARGER_STA_PIN, gpioModeInputPull, 1);
GPIO_IntConfig(CHARGER_STA_GPIOPORT, CHARGER_STA_PIN, false, false, false);//重新把充电引脚设置成GPIO,不要中断。
extern WDOG_Init_TypeDef wathdoginit;
wathdoginit.enable = true;
WDOG_Init(&wathdoginit);
//醒来之后发送一个消息,来驱动整个系统
int32_t msg = TICK_Message;
xQueueSendFromISR(hEvtQueueDevice, &msg, 0); //在调试时发现,打开RTC和发送消息都是可以的(当一冲电就来了)。
}
}
系统时钟是内部高频振荡器,14Mhz, Freertos采用的tick 时钟是32.768Khz的晶振。麻烦帮我分析一下,系统为什么没能继续运行?中断处理中的代码这样写有什么问题吗? |