STM32使用UCOSII支持低功耗模式

在不在系统的裸奔的软件中,使用RTC+STOP模式很容易实现低功耗模式,但是在UCOS之类的操作系统,实现这一模式就有点麻烦,最大的问题是任务切换是无法控制的,经常出现唤醒之后程序跑飞的情况。

首先,要把休眠的代码段放在低优先级任务中,不一定是系统自带的空闲任务,也可以是用户自定义的最低优先级的任务。

其次,在休眠代码的前后加上两个指令:

//===================================================================================
OSSchedLock();  //禁止任务调度
while(1)
{
.....//休眠代码RTC+STOP
PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
....//判断是否退出休眠
}
....//重新初始化系统时钟及GPIO
....//OS_CPU_SysTickInit();//systick重新初始化 非常重要的,否则跑飞
OSSchedUnlock();//允许任务调度 
//===================================================================================

其实只需要增加一下两个指令就可以解决任务切换问题。


做低功耗是可以做到从中断中唤醒的,外中断ISR,按照正常的ISR处理。在UCOS的任务里直接停机。在中断ISR里,响应中断唤醒后,向停机的任务发一个消息出来。

我测试了下,能正常工作啊,ucos也可以恢复啊
我用的语句就一句。
PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
恢复后如果时钟没初始化的话,串口不能正常工作,我加了
RCC_Configuration();
后,恢复后串口也能正常工作了,因为恢复前后不初始化时钟
的话,串口波特率会不一样的。
另外我发现秒定时器频率看出来没受什么影响。
我的led是用秒中断显示的,恢复后闪动频和以前没变化。
估计是用的是秒是用的32k的频率的缘故吧

 真要完全睡眠,在自己线程中关其他所有中断,只开一个唤醒中断并设置为最高优先级。唤醒ISR中RCC_Configuration(),再开OS等中断后返回。

ucos-ii从低功耗模式退出的一个普遍问题,唤醒后没能正确运行程序,系统时间SysTick引起的,重新初始化一下的UCOS Tick就可以。


 

 

 

 

 

你可能感兴趣的:(——STM32)