欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

STM32使用UCOSII支持低功耗模式

程序员文章站 2022-07-02 09:48:49
...

在不在系统的裸奔的软件中,使用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就可以。