打印
[MCU]

系统从低功耗下回到正常模式不能继续运行

[复制链接]
1780|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
我使用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的晶振。麻烦帮我分析一下,系统为什么没能继续运行?中断处理中的代码这样写有什么问题吗?

相关帖子

沙发
ayb_ice| | 2015-9-11 08:07 | 只看该作者
这个肯定是代码的原因

唤醒后需要恢复之前的时钟配置等,

直接用默认的时钟,唤醒后肯定可以的,根本不需要进入中断

使用特权

评论回复
板凳
victor3l|  楼主 | 2015-9-11 09:19 | 只看该作者
谢谢。
我是用中断来唤醒的。所以需要用中断。当MCU检测到这个中断后,就把MCU从EM3中唤醒,现在的问题是,它执行完上面的中断程序后,为什么不能继续执行, 在进入EM3前我关闭的时钟,我都在中断中打开了啊,而且我还发送了一个消息来启动OS。
另外,当它把中断程序执行完了之后,系统要到哪里去执行?这个是从EM3恢复,它不是复位,不会从新开始执行的。可不可以在进入EM3之后,再发送一个消息,来驱动系统,我希望他从EM3醒来就执行这个代码?

使用特权

评论回复
地板
ayb_ice| | 2015-9-11 09:36 | 只看该作者
victor3l 发表于 2015-9-11 09:19
谢谢。
我是用中断来唤醒的。所以需要用中断。当MCU检测到这个中断后,就把MCU从EM3中唤醒,现在的问题是, ...

基本是只要恢复主时钟就可以了
EMF32有这样的库函数

不需要进入中断也可以唤醒MCU的

未命名.jpg (93.84 KB )

未命名.jpg

使用特权

评论回复
5
victor3l|  楼主 | 2015-9-11 14:18 | 只看该作者
ayb_ice 发表于 2015-9-11 09:36
基本是只要恢复主时钟就可以了
EMF32有这样的库函数

谢谢 ayb_ice的帮忙,问题解决了。 “基本是只要恢复主时钟就可以了”就是这句话提醒了我,我以为EFM从EM3回到EM0,它会自动恢复时钟的,实际上它没有。我手动在次设置了一下时钟就可以了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

77

主题

308

帖子

5

粉丝