当前位置: 代码迷 >> 单片机 >> STM32内嵌ucosii低功耗模式有关问题
  详细解决方案

STM32内嵌ucosii低功耗模式有关问题

热度:81   发布时间:2016-04-28 14:54:29.0
STM32内嵌ucosii低功耗模式问题
我在使用stm32,移植ucos-ii,开启中断0,进入stop模式后不能正常运行,我做了以下试验
1、进入stop模式以后,触发中断0,在EXTI0_IRQHandler()中开启串口打印,串口会输出,证明是成功进入了中断的,只是唤醒后没能正确运行程序。
2、我尝试不启动ucos-ii,单纯用延时然后进入进入stop模式,触发中断后,程序能正常运行,因此,程序的进入和退出stop模式的机制也没问题。
3、我尝试将进入stop模式的任务优先级调至最低,
4、在进入中断后,重新初始化所有时钟
5、实在没有办法,在进入中断后,清除EXTI->PR=1<<0;然后强制跳至用户区代码,初始化正常,但是ucos-ii任务依旧没有启动,奇了怪了
6、折腾了个把星期,黔驴技穷,网上找高手求助
我想这个应该是ucos-ii从低功耗模式退出的一个普遍问题,希望知道其中原委的兄弟不吝赐教,也希望有类似经历的朋友一起讨论下,不胜感激

附上我写的几个函数:
void Sys_StopMode()
{
        //g_sleepFlag = 1;
        SCB->SCR|=1<<2;
        RCC->APB1ENR|=1<<28;
        //PWR->CR |= 1<<2;
        //PWR->CR &= 0xFD;
        PWR->CR |= 0x01;                //在停机模式下电压调压器处于低功耗模式
        WFI_SET();
}

void LowPow_Init(void)
{
        //set wakeup pin

        GPIOA->CRL&=0XFFFFFFF0;//PA0设置成输入         
        GPIOA->CRL|=0X00000008;                                      
        GPIOA->ODR|=1<<0;           //PA0上拉

        MY_NVIC_Init(2,1,EXTI0_IRQChannel,1);    //抢占2,子优先级2,组2

        Ex_NVIC_Config(GPIO_A,0,FTIR);

        Sys_StopMode();        
}

void EXTI0_IRQHandler()
{
        EXTI->PR=1<<0;
        iap_load_app(FLASH_APP1_ADDR);
}
------解决方案--------------------
印象中我在用STM32+UCOS的时候,做低功耗是可以做到从中断中唤醒的

外中断ISR,我按照正常的ISR处理。在UCOS的任务里直接停机。在中断ISR里,响应中断唤醒后,向停机的任务发一个消息出来。就没做别的什么了

停机的任务根据消息,恢复一下运行的状态,就正常工作了
------解决方案--------------------
这个问题是由于系统时间SysTick引起的,重新初始化一下你的UCOS Tick就可以啦
------解决方案--------------------
引用:
这个问题是由于系统时间SysTick引起的,重新初始化一下你的UCOS Tick就可以啦

我也觉得是SysTick没有启动成功,关注一下在stop模式下,到底哪些模块关了.