本帖最后由 keer_zu 于 2021-11-16 13:57 编辑
RTC唤醒停止模式外部中断功能已经实现,项目需求中另外还需要定时唤醒,现在选用RTC唤醒 EXTI有20个中断/事件线,每个GPIO都能被设置为输入线,占用EXTI0-EXTI15,有4根用于特定的外设事件触发
所以RTC的闹钟事件就能触发EXTI17中断(这就是为什么进入停止模式设置的是中断唤醒,但还能用RTC闹钟事件唤醒的原因,本质还是被外部中断唤醒)
全功能代码不需要改,在进入停止模式之前配置EXTI17中断,配置闹钟事件
/**************************************1.配置EXTI17中断*********************************/
EXTI_ClearITPendingBit(EXTI_Line17); //注意先清掉标志位,要不然可能会出现停止模式被忽略进 //入不了的问题,上面问题一截图有说明
EXTI_InitStructure.EXTI_Line = EXTI_Line17;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
/**************************************2.配置中断控制器闹钟事件优先级*********************************/
NVIC_InitStructure.NVIC_IRQChannel = RTCAlarm_IRQn; //RTC在最开始初始化的时候是秒中断,这里添加闹钟事件
//中断,此时RTC秒钟秒中断和闹钟事件中断同时开启
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/**************************************3.设置闹钟时间,sec即想要唤醒的时间间隔*********************************/
RTC_SetAlarm(RTC_GetCounter() + sec); //用RTC_SetAlarm()函数配置闹钟时间,当计数器的值与闹钟寄存器的
//值相等时,可产生闹钟事件或中断
RTC_WaitForLastTask(); //等待确保已成功修改RTC寄存器
RTC_ITConfig(RTC_IT_ALR, ENABLE); //使能闹钟事件
RTC_WaitForLastTask();
以上三步在将要进入停止模式之前执行。
/**************************************RTC中断函数*********************************/
void RTC_IRQHandler(void)
{undefined
if (RTC_GetITStatus(RTC_IT_SEC) != RESET) //秒钟中断
{
RTC_GetTime(&SystemTime); //更新时间(项目需要)
RTC_ClearITPendingBit(RTC_IT_SEC);
RTC_WaitForLastTask();
}
if(RTC_GetITStatus(RTC_IT_ALR) != RESET) //闹钟中断
{undefined
RTC_ClearITPendingBit(RTC_IT_ALR); //清中断
RTC_WaitForLastTask();
}
}
void RTCAlarm_IRQHandler(void)
{undefined
EXTI_ClearITPendingBit(EXTI_Line17); //闹钟事件发生,会产生一个EXTI_17外部中断,此标志位要清除,否 //则下次停止模式进入失败,原因见问题一贴图
}
【补充】:1.每次进入停止模式之前,都重新执行最开始的三步配置,否则可能出现前几次闹钟事件会触发,后面触发失败的问 题。
2.停止模式唤醒之后,需要重新初始化系统时钟,这时候可以把闹钟中断关闭(因为进入之前会重新开启,避免没有 进入 停止模式时一直有闹钟事件产生)
STM32进入Standby模式请参考:STM32进入Standby模式
以上为个人实验总结,不对之处还希望指正
原创**,转载请注明出处:https://mp.csdn.net/postedit/85785336
|