STM323中低功耗模式

STM32进入低功耗模式 备份SRAM和RTC模块都可以保持正常工作状态。


1 睡眠模式 sleep:
进入睡眠状态前采取以下措施:除保留将要唤醒Cortx内核的时钟之外,关闭所有外设时钟,并开启内部HSI(可设置为1MHz)
后,STM32睡眠消耗电流大概0.5mA左右。


2.停机模式 close down:
停机模式设置完成后,CPU遇到WFI或WFE指令就会停止工作,HSI和HSE进入关闭状态。但Flash和SRAM仍然保持电源供应,
此时STM32所有工作状态仍然保留着.和睡眠模式一样,停机模式也可以通过外设中断唤醒.
在停机模式下除了外部中断控制单元,所有设备的时钟都被禁止了,只能通过在GPIO引脚上产生电平边沿触发外部中断控制方式
将STM32从停机状态下唤醒. 外部中断通道除了与GPIO连接,还和RTC时钟报警事件连接,因此可以使用RTC模块实现定时将STM32
从停机状态中唤醒.
 STM32进入停机模式,其电流消耗降至24uA左右.在停机模式基础上,STM32还可以通过内部电压调整器调整内核工作电压可以达到
更低的功耗,通过设置STM32 PCR中的LPDS位可以使STM32内核也进入低功耗模式.这样整体电流可下降到14uA,如果开启RTC,需要
多消耗1.4uA电流.




STM32在使用HSI振荡器从停机模式恢复所需唤醒时间
恢复时间/us 恢复后的 备注
3.52 返回正常模式 从停机模式恢复到返回正常模式
5.42 返回正常模式+WFI指令 从停机模式恢复到正常模式,并执行WFI模式
5.32 返回低功耗模式+WFE指令 从停机模式恢复后返回低功耗模式,并执行WFE指令
7.21 返回低功耗模式+WFI指令 从停机模式恢复后返回低功耗模式,并执行WFI指令




3.待机模式 standby:
将Cortex_PCR中的SLEEP位置位,再将STM32_PCR的PDDS位置位后,STM32的待机模式就设置好了。待机模式下STM32处于完全


关闭状态:
内核电源、HSE、HSI都处于关闭状态。
和停机模式一样,可以通过RTC报警事件来将STM32从待机模式中唤醒,也可使用外部复位引脚,或通过独立看门狗产生的复位


信号将其唤醒,还可通过在GPIOA.0引脚产生一个上升沿来唤醒STM32,但前题是该引脚必须事先设置为唤醒(Wake Up Pin)引脚功能.
待机模式作为最低功耗模式,退出时间长达50us.进入待机模式,所有的SRAM数据,Cortex_M3处理器的寄存器和STM32的寄存器内容将
全部丢失. 即从待机模式唤醒后,相当于得到一个硬件复位的效果.


STM32待机模式下的电流消耗情况
STM32运行情况 VDD/VBAT3.3V VDD/VBAT-2.4V
HSI LSI 看门狗和RTC关闭 2uA N/A
LSI和RTC开启 1.4uA 1.08uA


按键调试的方法唤醒待机模式的系统
KEY WKUP PRINTF LED LCD
KEY:按键扫描


RTC闹钟中断唤醒待机模式的系统
用到RTCAlarm_IRQHandler() 和RTC_IRQHandler() 使用时 RTCAlarm_IRQHandler()函数的优先级一定要高于RTC_IRQHandler()
原因如下:
1,产生闹钟中断的前一瞬间,一定产生了秒中断,那么会先执行RTC_IRQHandler() 中断函数, 在RTC_IRQHandler() 执行的过程


中,闹钟中断标志又被挂起,


由于RTC_IRQHandler()是全局中断函数,必须清除所有的中断标志,程序才能退出该函数, 假如RTC_IRQHandler()  和


RTCAlarm_IRQHandler() 是同样的优先级,


要想让程序退出RTC_IRQHandler() 函数,那么你必须清除闹钟中断标志(如果不清除闹钟中断标志,程序会死在RTC_IRQHandler() 


), 这样问题又出现了,清除闹钟中断标志后,程序就不会进入RTCAlarm_IRQHandler(),那么RTCAlarm_IRQHandler()函数永远也


不会被执行。


只有这样做
设置闹钟中断函数RTCAlarm_IRQHandler() 的优先级高于全局中断函数RTC_IRQHandler(),
 在执行全局中断函数RTC_IRQHandler() 的时候,如果产生闹钟中断,那么中断嵌套去执行RTCAlarm_IRQHandler(),执行完毕


RTCAlarm_IRQHandler()后,再去执行RTC_IRQHandler() 。




对应程序:
static void RTC_NVIC_Config(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn; //RTC全局中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //先占优先级2位,从优先级2位
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //先占优先级3位,从优先级4位
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能该通道中断
NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器

NVIC_InitStructure.NVIC_IRQChannel = RTCAlarm_IRQn;  //闹钟中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //比RTC全局中断的优先级高
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; 
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
NVIC_Init(&NVIC_InitStructure);

}


//RTC时钟中断
//每秒触发一次  
//extern u16 tcnt; 
void RTC_IRQHandler(void)
{  
if (RTC_GetITStatus(RTC_IT_SEC) != RESET)//秒钟中断
{
RTC_Get();//更新时间   
  }
   
RTC_ClearITPendingBit(RTC_IT_SEC); //清秒中断
//RTC_WaitForLastTask();          
}




static void RTC_Alarm_EXIT(void)

EXTI_InitTypeDef EXTI_InitStructure;
EXTI_ClearITPendingBit(EXTI_Line17);
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Line = EXTI_Line17;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);


}


void RTCAlarm_IRQHandler(void)
{     
if(RTC_GetITStatus(RTC_IT_ALR) != RESET)
      {


      }
EXTI_ClearITPendingBit(EXTI_Line17);
//RTC_WaitForLastTask();
RTC_ClearITPendingBit(RTC_IT_ALR);
//RTC_WaitForLastTask();
 }





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1设计要求 要求系统按如下方式进入和退出睡眠模式: 在系统启动2秒后,将RTC在3秒钟之后配置为产生一个报警事件,接着通过WFI指令使系统进入停机模式。 如果要唤醒系统到正常模式,可通过按Key按钮;否则,在3秒钟后,会产生RTC报警断自动将系统唤醒。 一旦退出停机模式,系统时钟被配置成先前的状态(在停机模式下,外部高速振荡器HSE和PLL是不可用的)。 经过一段延时之后,系统将再次进入停机状态,并可按上述操作无限重复。 2 硬件电路设计 硬件电路采用与7.1小节应用实例一样硬件电路,可见图7-10。其Key按钮用于通过PB9产生一个外部断, LED1、LED2、LED3、LED4则用于显示处理器所处的模式断触发情况。 3 软件程序设计 根据任务要求,程序内容主要包括: (1) 配置GPIOB口,配置RTC,配置外部断; (2) 配置PB口第9个引脚作为外部断,下降延触发;配置RTC报警断,上升沿触发; (3) 两个断服务子程序的内容分别是:切换LED2和LED3灯的状态; 整个工程包含3个源文件:STM32F10x.s、stm32f10x_it.c和main.c,其STM32F10x.s为启动代码,所有断 服务子程序均在stm32f10x_it.c,其它函数则在main.c。下面分别介绍相关的函数,具体程序清单见参考程序。 函数SYSCLKConfig_STOP用于当处理器从停机模式唤醒之后,配置系统时钟、使能HSE和PLL,并以PLL作为系统时钟源。当处理器处理停机模式的时候,HSE、PLL是不可用的。 函数GPIO_Configuration用于配置GPIO的PC6、PC7、PC8、PC9和PB9。 函数EXTI_Configuration用于配置外部断线9(PB9)和17(RTC报警)。 函数NVIC_Configuration配置NVIC及断向量表,这里主要是配置外部断线9和17。 函数EXTI9_5_IRQHandler处理按钮Key(PB9)所触发的断,其主要作用是将LED2灯的状态翻转一次。 函数RTCAlarm_IRQHandler处理RTC报警所触发的断,其主要作用事将LED3 灯的状态翻转一次,如果设置了唤醒标志则清除之。 运行过程: (1) 使用Keil uVision3 通过ULINK 2仿真器连接EduKit-M3实验平台,打开实验例程目录PWR_TEST子目录下的PWR.Uv2 例程,编译链接工程; (2) 选择软件调试模式,点击MDK 的Debug菜单,选择Start/Stop Debug Session项或Ctrl+F5键,在逻 辑分析仪添加GPIOC_ODR.6、GPIOC_ODR.7、GPIOC_ODR.8、GPIOC_ODR.9,点击Run按钮即可在逻辑分析 仪看到如图7-14,还可用Peripherals-General Port-GPIOB来模拟KEY按钮的动作; (3) 选择硬件调试模式,选择Start/Stop Debug Session项或Ctrl+F5键,下载程序并运行,观察LED灯 的变化情况。注意,当目标系统进入停机模式之后,将无法使用仿真器进行调试了; (4) 退出Debug模式,打开Flash菜单>Download,将程序下载到EduKit-M3实验平台的Flash,按RESET键复位,观察 LED灯的情况,正常情况应为:系统处于运行模式时LED1亮、LED4灭;系统处于停机状态时LED1灭、LED4亮; 当按下KEY按钮时LED2灯状态发生反转;当发生RTC报警时LED3状态发生反转。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值