前段时间做基于μ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);
}
}
打开μC/OS的OS_APP_HOOKS_EN,在需要睡眠的地方加上下面的代码就可以进入睡眠状态了:
//设置定时器,定时进入中断唤醒CPU
//之前需要关闭除定时器以外的全部中断
//设置标志,需要进入睡眠状态
Flag_Power_Off = 0x01;
//挂起所有任务(保证CPU立即运行到空闲任务中)
OSTaskSuspend(10);
OSTaskSuspend(11);
OSTaskSuspend(12);
OSTaskSuspend(13);
注:在进入睡眠状态之前要用定时器设定唤醒时间并关闭除此定时器外的所有中断,我在进入空闲任务之前关掉了除systick外的中断,否则不能调度任务进入空闲任务,然后在空闲任务中关闭systick,睡眠完成之后再打开systick中断。
关键字:STM32 μC OS系统 睡眠模式
引用地址:
STM32 μC/OS系统进睡眠模式的方法
推荐阅读最新更新时间:2024-03-16 16:26
基于STM32和CAN总线的电动车电池管理系统设计
随着电池能源的广泛应用,石油资源的枯竭和环境污染,电动汽车以其节能环保的优势引起越来越多的重视,在电动汽车的研究和发展上,车载电池及其管理系统的研究与制造占据着重要位置。电动汽车动力电池在应用中的主要问题表现在:生产过程中,电池的工艺,技术以及成组技术还不能保证其初始性能具有良好的一致性;使用过程中,对过充电、过放电、过温度、过电流等非常敏感,这类情况的发生会明显缩短电池寿命,甚至会导致电池报废。电池组是几十个甚至上百个单体电池串联,单体电池之间存在不一致性,随着连续的充放电循环,电池间的不一致性加剧,电池组的可用容量受容量最小的单体电池制约。对于这些情况,电池的初始性能必须要依靠企业生产工艺的优化,生产过程关键参数的控制来改善,
[电源管理]
STM32 | 串口IAP实例分享
什么是IAP? IAP是In Application Programming的首字母缩写,IAP是用户自己的程序在运行过程中对User Flash的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级。 在重新编程过程中可以使用任意类型的通信协议,如UART、I2S、SPI等。这篇笔记分享的是使用UART方式IAP。 串口IAP实验 先理一理流程(本实验是以STM32F103ZET6为例): 1、实验说明 做这个实验需要准备两个keil工程,一个工程用于编写IAP程序,另一个工程用于编写我们的应用程序(要实现某些功能的程序),这里我们以一个点灯程序为例。最终,两份工程编译出来的可
[单片机]
AT89C51单片机简介
AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低电压,高性能CMOS8位微处理器,俗称单片机。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。 1.主要特性: ·与MCS-51 兼容 ·4K字节可编程闪烁存储器 寿命:1000写/擦循环 数据保留时间:10年 ·全静态工作:0H
[单片机]
stm32定时器捕捉高低电平计时长代码分析
定时器是stm32的一大利器,现在的项目中可以说没有一个不会用到定时器的,所以掌握理解运用定时器才会做出好的产品来。 本章内容说一说关于stm32的定时器TIM_GetCounter(TIMx)的运用。之前的项目中曾经用这个来获取高低电平的时长,在超声波测距,红外遥控解码中运用过。Stm32的定时器除了1和8其他都是通用定时器。如何用这句函数来捕捉电平时长呢?首先看一下初始化内容,以TIM4为例 void Timer4_CFG() { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1Per
[单片机]
stm32 TIM2 重映射
stm32的TIM2的端口使用组合有下面四种: 1.当不重映射时,默认TIM2四个的IO口是PA0、PA1、PA2、PA3 2.要使用PA15、PB3、PA2、PA3的端口组合,要调用下面的语句进行部分重映射: RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //重映射必须要开AFIO时钟 GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2, ENABLE); 3.要使用PA0、PA1、PB10、PB11的端口组合,要调用下面的语句进行部分重映射: RCC_APB2PeriphClockCmd(RCC_APB2Perip
[单片机]
STM32独立看门狗IWDG与窗口看门狗WWDG研究
1.看门狗介绍 看门狗这东西虽然简单,但我相信绝大多程序员没有足够重视它。使用看门狗保证系统正常地运行是非常有必要的。我们在设计产品时,代码以及硬件设计缺陷或是外界电磁干扰都有可能使系统死机,如果不能正常对其进行复位,系统的可靠性将大打折扣。看门狗分为软件看门狗和硬件看门狗两类,其原理都是使用一个独立定时器来计时,超出时间就会产生复位信号,主要区别看是否具有独立的硬件结构,如果有,就是硬件看门狗,如果是一个普通定时器实现的那么就是软件看门狗。STM32F407片内有两个看门狗:独立看门狗IWDG以及窗口看门狗WWDG,下面来讨论各自的特点和用法。 2.IWDG的特点以及使用 IWDG是一个独立看门狗,具有独立于系统的时钟,与片
[单片机]
FlyMcu串口ISP下载STM32程序教程
开始写之前也是不能用的,但是为了使用,决定边探索怎么使用边写一篇博客! 最开始用过正点原子的开发板进行ISP下载,感觉挺好用,按照说明就好。 但是正点原子的板子用的是如下的一块电路: 这个电路很简单使用,但是如果你不懂,也很纠结,这里感觉有篇帖子写的很详细,可供大家参考,就不自己解释了,链接如下: http://www.51hei.com/bbs/dpj-35947-1.html 但是,很多人会想用一个USB转串口的小模块下载程序,怎么弄呢? 首先有一个小串口模块,注意转换为的电平是3.3V,不是标准的232电平那种的,东西如下 之后呢,将RXD,TXD,GND,VCC缺一不可的连接到你的STM32板子
[单片机]
I2C总线实现TMS320VC5509A引导装载设计
1 引言 DSP芯片的Bootloader程序用于上电时将用户程序从外部非易失性、慢速存储器或外部控制器中装载到片内高速RAM中,保证用户程序在DSP内部高速运行,TI公司的C55x系列DSP芯片提供多种装载模式,主要包括HPI引导装载、串行E2ROM引导装载、并行引导装载、串行口引导装载、I2C总线E2ROM引导装载等,通常使用的是并行引导装载模式,该方式引导速度快实现简单,但是体积和功耗也较大,随着串行接口存储设备容量的提高,串行引导方式体积小、功耗低的优势便显现出来了,所以使用ARM的串行接口对DSP进行引导装载,不仅能省去存储芯片,而且利用ARM的ISP功能,可以根据需要改变用户程序,有利于系统的维护和升级。
[嵌入式]