工程中用到低功耗的控制,本来想使用待机模式,后来发现待机后所有IO口为高阻态,这样对于一些IO口控制的外设有些不妥,想过外部上拉一个电阻可是功耗不好控制放弃该方案选用停止模式。停止模式后IO口保持停止前的状态,但是不像待机模式那样可以轻松通过闹钟唤醒,只能通过中断线实现唤醒。为了实现RTC闹钟唤醒搜得一段代码,现贴过来分析一下。

void RTC_EXTI_INITIAL(FunctionalState interrupt_en_or_dis)
{
 NVIC_InitTypeDef NVIC_InitStructure;
    EXTI_InitTypeDef EXTI_InitStructure;

//------------EXTI17 配置 -------------------   
    EXTI_InitStructure.EXTI_Line = EXTI_Line17;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
    EXTI_InitStructure.EXTI_LineCmd = interrupt_en_or_dis;
    EXTI_Init(&EXTI_InitStructure); 
//------------设置 中断------------------- 
    NVIC_InitStructure.NVIC_IRQChannel = RTCAlarm_IRQn;//防拆
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = interrupt_en_or_dis;
    NVIC_Init(&NVIC_InitStructure);     
//------------------------------------------- 
}

void RTC_SET_ALARM(u32 sec)
{
  //DEBUG_COM_STREAM("-闹钟-",NULL);
  RTC_SetAlarm(RTC_GetCounter()+sec);
  //DEBUG_COM_STREAM("-闹钟1-",NULL);
  RTC_WaitForLastTask();
  //DEBUG_COM_STREAM("-闹钟2-",NULL);
  RTC_ITConfig(RTC_FLAG_ALR,ENABLE);
}
void RTC_AWU_SET(void)
{
  //启用PWR和BKP的时钟(from APB1)
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
  //后备域解锁
  PWR_BackupAccessCmd(ENABLE);
  RTC_ITConfig(RTC_IT_SEC, DISABLE);
  RTC_SET_ALARM(5);
  //PWR_BackupAccessCmd(DISABLE);
  RTC_EXTI_INITIAL(ENABLE);
}

void RTCAlarm_IRQHandler(void)
{
   EXTI_ClearITPendingBit(EXTI_Line17);
  //SYS.wake_id|=1<<17;
}

void RTC_IRQHandler(void)

{

if (RTC_GetITStatus(RTC_IT_SEC) != RESET)
  { 
    RTC_ClearITPendingBit(RTC_IT_SEC);
    RTC_WaitForLastTask();
    //TIME_COUNT=RTC_GetCounter();
    //RTC_WaitForLastTask();
  }
  if (RTC_GetITStatus(RTC_FLAG_ALR) != RESET) 
  {

RTC_ClearITPendingBit(RTC_FLAG_ALR);
     RTC_WaitForLastTask();
     //SYS.wake_id|=1<<1;
  }
}

对于上述代码说明3点问题:

(1)为什么设置中断线17

STM32F10x有20条中断线,其中16条用于IO口中断使用,还有4条用于内部中断事件。EXTI17就是用于内部RTC闹钟唤醒中断事件时使用,所以初始化中除了打开RTC闹钟中断同时打开了EXTI17中断线。

(2)为什么RTC闹钟中断服务程序清除EXTI17中断标志位?
    因为中断线17接到了RTC闹钟上,RTC闹钟中断后会触发中断线17产生中断事件,所以在RTC中断内清除标志位,这同时是RTC闹钟唤醒停止模式的原因。具体看下图手册描述

(3)唤醒后程序在哪执行?

通过实验得到当系统唤醒后程序是在原停止位置顺序向下执行。

PS:唤醒后时钟源默认切换到内部高速时钟(HSI)所以使用外部晶振的需要重新配置时钟系统

关于STM32使用RTC唤醒停止模式的设置相关推荐

  1. STM32通过串口进入和唤醒停止模式

    STM32 具有运行.睡眠.停止和待机四种工作模式.上电复位后 STM32 处于运行状态,当内核不需要继续运行,就可以选择进入后面的三种低功耗模式降低功耗,这三种模式中,电源消耗不同.唤醒时间不同.唤 ...

  2. TM32L0系列之02 RTC唤醒待机模式

    STM32L0系列之02 RTC唤醒待机模式 前言 使用芯片:STM32L051R8T6 软件平台:KEIL V5.STM32CubeL0 库函数:HAL 一.硬件介绍 1.单片机的系统时钟为:32M ...

  3. STM32超低功耗入门之停止模式

    一. 认识停止模式 STM32L4 系列提供了 3 种停止模式:stop0 , stop1 , stop2. 功耗逐次更低. 通过上图可以得出结论: stop0 模式有 2 种电压调节器方案.stop ...

  4. stm32f103停止模式低功耗设置(最低5.7ua)

    刚开始进入STOPMode后,整机功耗有300uA的,此时外围其他硬件电路电流已经可以肯定漏电流在nA级,因此调试方向在主芯片,经过实际测试,都是GPIO配置的问题,比如某个GPIO为中断输入,闲置为 ...

  5. STM32CubeMX学习笔记(16)——电源管理(PWR)低功耗停止模式

    一.低功耗模式简介 系统提供了多个低功耗模式,可在 CPU 不需要运行时(例如等待外部事件时)节省功耗.由用户根据应用选择具体的低功耗模式,以在低功耗.短启动时间和可用唤醒源之间寻求最佳平衡. 睡眠模 ...

  6. 【STM32笔记】HAL库低功耗STOP停止模式的串口唤醒(解决进入以后立马唤醒、串口唤醒和回调无法一起使用、接收数据不全的问题)

    [STM32笔记]HAL库低功耗STOP停止模式的串口唤醒(解决进入以后立马唤醒.串口唤醒和回调无法一起使用.接收数据不全的问题) [STM32笔记]低功耗模式配置及避坑汇总 前文: blog.csd ...

  7. 【STM32笔记】低功耗模式下的RTC唤醒(非闹钟唤醒,而是采用RTC_WAKEUPTIMER)

    [STM32笔记]低功耗模式下的RTC唤醒(非闹钟唤醒,而是采用RTC_WAKEUPTIMER) [STM32笔记]低功耗模式配置及避坑汇总 前文: blog.csdn.net/weixin_5340 ...

  8. STM32的RTC闹钟唤醒待机模式

    通过RTC闹钟不能唤醒待机模式下的STM32,但是当注释掉下面这一句程序的时候,就能通过RTC闹钟唤醒. PWR_WakeUpPinCmd(ENABLE);//使能唤醒管脚功能 这就给我们一种错误的判 ...

  9. STM32停止模式唤醒不恢复时钟的后果

    关于STM32的低功耗详细解析请在 STM32低功耗模式解读中查看,在里面讲到当STM32在停止模式时,芯片1.8V区域时钟别关闭,HSI,HSE时钟也被关闭,当某个使能的中断或事件发生后,STM32 ...

  10. STM32 待机模式 和 停止模式 RTC闹钟调试笔记

    待机模式 不进入待机模式 闹钟中断服务函数可以进去 进入待机模式WakeUp唤醒后能否进入闹钟中断服务函数 1.待机模式唤醒后,不会进入闹钟中断服务函数,所以会导致wakeup唤醒后,此时闹钟唤醒时间 ...

最新文章

  1. Database Appliance并非Mini版的Exadata-还原真实的Oracle Unbreakable Database Appliance
  2. 万能make file
  3. 二次拟合r方_R方和线性回归拟合优度
  4. 单位矩阵的逆矩阵是它本身吗_矩阵运算、单位矩阵与逆矩阵(二)
  5. 苹果推送iOS 15.0.1版本 修复涉及iPhone 13的Bug
  6. 人人都是程序员?一边吐槽,一边却偷偷用,低代码工具真香
  7. 关于TFS的文档和报告打叉的解决
  8. 使用SniperPhish进行电子邮件钓鱼
  9. 西电计算机网络ppt,《西安电子科技大学》PPT课件
  10. 服务器系统安装蓝牙驱动,Atheros Bluetooth蓝牙设备驱动
  11. 谈业务流程全生命周期管理支撑业务流程再造(2)
  12. python调用函数库_python调用操作系统的库函数
  13. Gitter:高颜值GitHub小程序客户端诞生记
  14. MYSQL数据库学习总结
  15. 嫁人就要嫁程序员,钱多话少死得早!
  16. 模型量化(1):模型量化简介
  17. Unity---Shader
  18. 95文件及文件夹操作实践
  19. 第一次冲刺--查看活动详情用户场景分析
  20. android 来电解锁,带你解锁手机隐藏黑科技,极少人知道!

热门文章

  1. python之数据处理篇
  2. Java毕设项目电商后台管理系统计算机(附源码+系统+数据库+LW)
  3. SIMD and Avx2
  4. 安装kafka+golang操作kafka
  5. Oralce数据库计算工作日(处理假期及加班)
  6. 行业认证标准:ISO 26262-汽车软件功能安全标准
  7. 基于PHP的SQL注入防御
  8. Oracle数据库的基本语句(最新)
  9. iozone测试IO方法
  10. JavaScript封装自己的库