[应用相关]

STM32 μC/OS系统进睡眠模式的方法

[复制链接]
538|17
手机看帖
扫描二维码
随时随地手机跟帖
幸福小强|  楼主 | 2018-5-13 20:17 | 显示全部楼层 |阅读模式

前段时间做基于μC/OS系统的开发,遇到一个问题,在运行任务的时候需要使CPU进入睡眠状态几秒钟,但直接调用__WFI();时没有效果,后来查找资料发现需要在空闲任务中调用。

   下面是我让cpu进入睡眠状态的例子:


void  App_TaskIdleHook (void)
{

//检查标志确定是否需要睡眠
if(Flag_Power_Off != 0)
{

  //关闭systick避免systick中断唤醒CPU
  SYSTICK_Cmd(DISABLE);
  Flag_Power_Off = 0;
  printf("sleep\r\n");
  CLKPWR_Sleep();
  printf("wake\r\n");
  //恢复所有挂起的任务
  OSTaskResume(10);
  OSTaskResume(11);
  OSTaskResume(12);
  OSTaskResume(13);

  //使能systick恢复任务调度
  SYSTICK_Cmd(ENABLE);
}
}


幸福小强|  楼主 | 2018-5-13 20:17 | 显示全部楼层
打开μC/OS的OS_APP_HOOKS_EN,在需要睡眠的地方加上下面的代码就可以进入睡眠状态了:



//设置定时器,定时进入中断唤醒CPU

//之前需要关闭除定时器以外的全部中断

//设置标志,需要进入睡眠状态

Flag_Power_Off = 0x01;
//挂起所有任务(保证CPU立即运行到空闲任务中)
OSTaskSuspend(10);
OSTaskSuspend(11);
OSTaskSuspend(12);
OSTaskSuspend(13);



   注:在进入睡眠状态之前要用定时器设定唤醒时间并关闭除此定时器外的所有中断,我在进入空闲任务之前关掉了除systick外的中断,否则不能调度任务进入空闲任务,然后在空闲任务中关闭systick,睡眠完成之后再打开systick中断。

使用特权

评论回复
dongnanxibei| | 2018-5-13 22:28 | 显示全部楼层
原来这么简单就实现了。

使用特权

评论回复
liuchangyin| | 2018-5-16 09:27 | 显示全部楼层
关键要看功耗下降没

使用特权

评论回复
734774645| | 2018-5-17 00:00 | 显示全部楼层
还以为要通过寄存器呢,原来直接通过系统的函数就行了。

使用特权

评论回复
aspoke| | 2018-5-17 23:03 | 显示全部楼层

使用特权

评论回复
232321122| | 2018-5-17 23:04 | 显示全部楼层
睡眠模式没有使用过。

使用特权

评论回复
ghuca| | 2018-5-17 23:04 | 显示全部楼层
幸福小强 发表于 2018-5-13 20:17
打开μC/OS的OS_APP_HOOKS_EN,在需要睡眠的地方加上下面的代码就可以进入睡眠状态了:

中断不能唤醒吗?

使用特权

评论回复
soodesyt| | 2018-5-17 23:04 | 显示全部楼层
dongnanxibei 发表于 2018-5-13 22:28
原来这么简单就实现了。

空闲任务还真没使用过。

使用特权

评论回复
mnynt121| | 2018-5-17 23:04 | 显示全部楼层
幸福小强 发表于 2018-5-13 20:17
打开μC/OS的OS_APP_HOOKS_EN,在需要睡眠的地方加上下面的代码就可以进入睡眠状态了:

systick中断为什么要关闭呢?

使用特权

评论回复
plsbackup| | 2018-5-17 23:05 | 显示全部楼层
在空闲任务中调用?

使用特权

评论回复
kmzuaz| | 2018-5-17 23:05 | 显示全部楼层
幸福小强 发表于 2018-5-13 20:17
打开μC/OS的OS_APP_HOOKS_EN,在需要睡眠的地方加上下面的代码就可以进入睡眠状态了:

为什么要关闭呢?

使用特权

评论回复
qiufengsd| | 2018-5-17 23:05 | 显示全部楼层
幸福小强 发表于 2018-5-13 20:17
打开μC/OS的OS_APP_HOOKS_EN,在需要睡眠的地方加上下面的代码就可以进入睡眠状态了:

进入睡眠状态,后面可以中断唤醒。

使用特权

评论回复
wengh2016| | 2018-5-17 23:06 | 显示全部楼层
幸福小强 发表于 2018-5-13 20:17
打开μC/OS的OS_APP_HOOKS_EN,在需要睡眠的地方加上下面的代码就可以进入睡眠状态了:

OSTaskSuspend要挂起来

使用特权

评论回复
dspmana| | 2018-5-17 23:06 | 显示全部楼层
liuchangyin 发表于 2018-5-16 09:27
关键要看功耗下降没

没有降低运行效率,功耗不会降低到

使用特权

评论回复
wengh2016| | 2018-5-17 23:06 | 显示全部楼层
734774645 发表于 2018-5-17 00:00
还以为要通过寄存器呢,原来直接通过系统的函数就行了。

我也是长见识了。

使用特权

评论回复
Bjorn| | 2018-5-19 17:09 | 显示全部楼层
功耗降下来没有

使用特权

评论回复
Rangar| | 2018-5-20 16:57 | 显示全部楼层
原来是在空闲任务中调用的

使用特权

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

本版积分规则

107

主题

1395

帖子

2

粉丝