打印
[应用相关]

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

[复制链接]
733|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 | 只看该作者
关键要看功耗下降没

使用特权

评论回复
5
734774645| | 2018-5-17 00:00 | 只看该作者
还以为要通过寄存器呢,原来直接通过系统的函数就行了。

使用特权

评论回复
6
aspoke| | 2018-5-17 23:03 | 只看该作者

使用特权

评论回复
7
232321122| | 2018-5-17 23:04 | 只看该作者
睡眠模式没有使用过。

使用特权

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

中断不能唤醒吗?

使用特权

评论回复
9
soodesyt| | 2018-5-17 23:04 | 只看该作者
dongnanxibei 发表于 2018-5-13 22:28
原来这么简单就实现了。

空闲任务还真没使用过。

使用特权

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

systick中断为什么要关闭呢?

使用特权

评论回复
11
plsbackup| | 2018-5-17 23:05 | 只看该作者
在空闲任务中调用?

使用特权

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

为什么要关闭呢?

使用特权

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

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

使用特权

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

OSTaskSuspend要挂起来

使用特权

评论回复
15
dspmana| | 2018-5-17 23:06 | 只看该作者
liuchangyin 发表于 2018-5-16 09:27
关键要看功耗下降没

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

使用特权

评论回复
16
wengh2016| | 2018-5-17 23:06 | 只看该作者
734774645 发表于 2018-5-17 00:00
还以为要通过寄存器呢,原来直接通过系统的函数就行了。

我也是长见识了。

使用特权

评论回复
17
Bjorn| | 2018-5-19 17:09 | 只看该作者
功耗降下来没有

使用特权

评论回复
18
Rangar| | 2018-5-20 16:57 | 只看该作者
原来是在空闲任务中调用的

使用特权

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

本版积分规则

123

主题

1473

帖子

2

粉丝