转载:http://www.openedv.com/posts/list/22055.htm

STM32的RTC闹钟中断 总算整明白了

现在用到了STM32的闹钟中断 去唤醒停机模式下的系统
看STM32的demo 里边写的明明白白的 到我的例程上就是不行

后来总结出来了 呵呵 STM32的Demo只是用到了闹钟中断函数RTCAlarm_IRQHandler() 并没有用到RTC全局中断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)
{ /*尼玛 闹钟中断的优先级必须必秒中断高
闹钟中断和秒中断几乎同时到来 秒中断的处理函数 是RTC_IRQHandler()
如果进入这个函数 那么要想从RTC_IRQHandler()退出 则必须清除所有中断标志
(包括闹钟中断), 这样 闹钟中断标志被清除 则RTCAlarm_IRQHandler()函数肯定是进不去了
如果不清楚闹钟中断标志 那么程序会死在RTC_IRQHandler()里边
综上所述 那种中断必须能打断秒中断的执行 这样程序才能执行到RTCAlarm_IRQHandler()里边
*/
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn; //RTC全局中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能该通道中断
NVIC_Init(&NVIC_InitStructure);

NVIC_InitStructure.NVIC_IRQChannel = RTCAlarm_IRQn; //闹钟中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //比RTC全局中断的优先级高
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
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 RTC_IRQHandler(void)
{
if (RTC_GetITStatus(RTC_IT_SEC) != RESET)
{
}
RTC_ClearITPendingBit(RTC_IT_SEC);
RTC_WaitForLastTask();

}

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

  }EXTI_ClearITPendingBit(EXTI_Line17);

RTC_WaitForLastTask();
RTC_ClearITPendingBit(RTC_IT_ALR);
RTC_WaitForLastTask();
}

按照我理解的,就应该是这样,我也实际测试了,结果和预期的一样,呵呵 如果有不对的地方,欢迎拍砖。

STM32的RTC闹钟中断 总算整明白了相关推荐

  1. STM32:RTC闹钟唤醒

    想使用闹钟唤醒功能使系统从待机下唤醒,遇到一个问题:使用闹钟唤醒就不能使用wakeup pin唤醒.二者只能取其一. 此问题解决,画了个板子wakeup pin 接下拉电阻解决. 写新代码时候遇到一个 ...

  2. STM32F030的低功耗案例(RTC闹钟中断定时唤醒喂狗+按键外部中断唤醒)

    最近使用到低功耗方案,采用的是STM32F030C8T6芯片,由于任务开启了看门狗,进入休眠后(采用的是STOP模式),需要及时喂狗,故而使用RTC闹钟中断定时唤醒来喂狗. 对比三种休眠模式:就设备的 ...

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

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

  4. stm32独立看门狗和rtc闹钟

    独立看门狗 1.独立看门狗概述 在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会 ...

  5. STM32设置闹钟中断

    最近在试验中想用RTC闹钟做低STM32单片机的低功耗唤醒,在设置闹钟中断时很走了一段弯路.网上搜到到资料基本也没得到太多帮助,遇到问题其实很简单,现在整理一下,发出来,希望对遇到这问题的朋友有帮助. ...

  6. stm32单片机实现多个闹钟_STM32实现对RTC闹钟唤醒的设计

    工程中用到低功耗的控制,本来想使用待机模式,后来发现待机后所有IO口为高阻态,这样对于一些IO口控制的外设有些不妥,想过外部上拉一个电阻可是功耗不好控制放弃该方案选用停止模式.停止模式后IO口保持停止 ...

  7. 【STM32】RTC实时时钟,步骤超细详解,一文看懂RTC

    什么是RTC RTC (Real Time Clock):实时时钟 RTC是个独立的定时器.RTC模块拥有一个连续计数的计数器,在相应的软件配置下,可以提供时钟日历的功能.修改计数器的值可以重新设置当 ...

  8. 【STM32】RTC的初始化与基本使用(CT117E电路)

    目录 RTC的初始化与基本使用 RTC的初始化 RTC的基本使用 参考文献 RTC的初始化与基本使用 STM32 的实时时钟(RTC)是一个独立的定时器.STM32 的 RTC 模块拥有一组连续计数 ...

  9. CM3计算板RTC闹钟唤醒系统

    1.前言 一个周期性控制系统的核心为CM3计算板,在电池供电情况下要求尽可能提高使用时长.由于系统空闲时长较多,因此在考虑低功耗的情况下将系统关机以进一步降低功耗.需要注意的是,系统关机后需要在指定时 ...

最新文章

  1. when is view bound to its corresponding controller instance
  2. php上操作redis,PHP操作redis
  3. rpm包安装mysql配置文件目录_CentOS6.5系统下RPM包安装MySQL5.6
  4. C# 之 日常问题积累(一)
  5. 一个用于分布式DNN训练加速的通用通信调度器
  6. 如何在VScode中配置python第三方库
  7. 网络上各种指数 总结 收集
  8. 关于Windows Server 2008 Service Pack 1
  9. 中柏平板u盘启动_中柏笔记本一键U盘重装系统教程图解
  10. uefi下的开机顺序_解答bios设置硬盘启动顺序的操作教程
  11. 第三门课 结构化机器学习项目(Structuring Machine Learning Projects)
  12. eclipse常用的搜索快捷键
  13. 用vue2写一个新闻列表页,和新闻详情页,该怎么做?
  14. 2021物联网国赛zigbee点对点通讯——G卷
  15. 年轻不学习,老了回村掰苞米!快来学学这份 微服务开发实战派吧
  16. Win10 打印时提示 “发现您尚未安装打印机”
  17. PyQt(Python+Qt)入门:Designer组件属性编辑界面中QWidget类相关属性详解
  18. 计算机视觉——全景图像拼接
  19. (MACN小米AI 轻量化SISR)A Matrix-in-matrix Neural Network for Image Super Resolution
  20. 威尔逊置信区间 php,应用:推荐系统-威尔逊区间法

热门文章

  1. 文墨绘学:只有不会教的父母,没有教不好的孩子
  2. CSDN的MarkDown调整列宽技巧
  3. 知乎上的看图神器,你懂的
  4. 记一次聚拢Android线程实操
  5. python 理论基础知识试题_Python理论基础知识复习
  6. 某期间用到的溯源技巧
  7. Windows 12” 概念版下载,由B站UP主把 Win11 修改成 Win12
  8. 人工智能其实就是『八卦』
  9. STM32F407修改程序将外部25M晶振修改为8M(标准库、HAL库)
  10. redis set NX EX 命令