打印
[其他ST产品]

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

[复制链接]
3083|57
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
远芳侵古道|  楼主 | 2023-8-30 15:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32的RTC闹钟中断 总算整明白了
现在用到了STM32的闹钟中断 去唤醒停机模式下的系统
看STM32的demo 里边写的明明白白的 到我的例程上就是不行

后来总结出来了 呵呵 STM32的Demo只是用到了闹钟中断函数RTCAlarm_IRQHandler() 并没有用到RTC全局中断RTC_IRQHandler() 好 那么我的问题就出在这里了

如果两个中断函数同时使用的话,我们必须这样设置才不会有漏洞 RTCAlarm_IRQHandler() 函数的优先级一定要高于RTC_IRQHandler()

使用特权

评论回复
沙发
远芳侵古道|  楼主 | 2023-8-30 15:48 | 只看该作者

为什么?
原因如下:
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() 。


使用特权

评论回复
板凳
远芳侵古道|  楼主 | 2023-8-30 15:51 | 只看该作者

代码如下:

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);
}


使用特权

评论回复
地板
远芳侵古道|  楼主 | 2023-8-30 15:56 | 只看该作者


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);

}


使用特权

评论回复
5
远芳侵古道|  楼主 | 2023-8-30 15:57 | 只看该作者
void RTC_IRQHandler(void)
{
if (RTC_GetITStatus(RTC_IT_SEC) != RESET)
{
}
RTC_ClearITPendingBit(RTC_IT_SEC);
RTC_WaitForLastTask();

}

使用特权

评论回复
6
远芳侵古道|  楼主 | 2023-8-30 15:59 | 只看该作者
void RTCAlarm_IRQHandler(void)
{ if(RTC_GetITStatus(RTC_IT_ALR) != RESET)
{

使用特权

评论回复
7
远芳侵古道|  楼主 | 2023-8-30 16:02 | 只看该作者
  }
EXTI_ClearITPendingBit(EXTI_Line17);


使用特权

评论回复
8
远芳侵古道|  楼主 | 2023-8-30 16:02 | 只看该作者
  }
EXTI_ClearITPendingBit(EXTI_Line17);


使用特权

评论回复
9
远芳侵古道|  楼主 | 2023-8-30 16:05 | 只看该作者
RTC_WaitForLastTask();
RTC_ClearITPendingBit(RTC_IT_ALR);
RTC_WaitForLastTask();
}

使用特权

评论回复
10
远芳侵古道|  楼主 | 2023-8-30 16:12 | 只看该作者
按照我理解的,就应该是这样,我也实际测试了,结果和预期的一样

使用特权

评论回复
11
langgq| | 2023-8-31 19:43 | 只看该作者
结果怎么样?可以show下吗

使用特权

评论回复
12
yangjiaxu| | 2023-8-31 21:18 | 只看该作者
RTC中断?是用做闹钟么?还是啥?

使用特权

评论回复
13
wwppd| | 2023-9-5 10:15 | 只看该作者
如果 RTC_CR控制寄存器中设置了相应允许位,则比较匹配时将产生一个闹钟中断。

使用特权

评论回复
14
jtracy3| | 2023-9-5 11:20 | 只看该作者
STM32的RTC闹钟中断是指通过RTC硬件中断功能,在设定的时间到达时产生中断信号,触发相应的中断处理程序,实现闹钟功能

使用特权

评论回复
15
bestwell| | 2023-9-5 12:27 | 只看该作者
设置RTC闹钟中断的步骤:

配置RTC预分频器和RTC寄存器。
设置RTC中断处理程序。
设置RTC闹钟比较值。
配置RTC中断优先级。
使能RTC中断。

使用特权

评论回复
16
ewfrg| | 2023-9-5 12:55 | 只看该作者
学习

使用特权

评论回复
17
bestwell| | 2023-9-5 13:33 | 只看该作者
RTC闹钟中断的优先级可以通过在HAL_NVIC_Init函数中设置来控制。如果需要将RTC闹钟中断的优先级设置为最高级别,可以将RTC_IRQn的优先级设置为最高级别。

使用特权

评论回复
18
beacherblack| | 2023-9-5 15:16 | 只看该作者
RTC(Real-Time Clock)是一种专门用于时间和日期计数的定时器。通过配置RTC闹钟中断,可以在特定的时间点触发中断,执行相应的任务。

使用特权

评论回复
19
sdlls| | 2023-9-5 15:35 | 只看该作者
在嵌入式系统中常用的实时时钟功能,可以提供精确的实时时间。

使用特权

评论回复
20
pentruman| | 2023-9-5 16:11 | 只看该作者
RTC闹钟中断的处理函数需要在主函数中调用。

使用特权

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

本版积分规则

82

主题

842

帖子

0

粉丝