我在使用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没有启动成功,关注一下在stop模式下,到底哪些模块关了.