0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32 RTC闹钟的中断和唤醒待机模式

汽车玩家 来源:eeworld 作者:eeworld 2021-07-23 10:04 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

RTC代表的是实时时钟的意思,因为它提供的时钟基准比较准确所以用处还是很多的。

RTC全局中断:

void RTC_IRQHandler()

{

if(RTC_GetITStatus(RTC_IT_ALR)!=RESET) //是否闹钟中断发生

{

printf("THE ALARM READY =%d \r\n",RTC_GetCounter());//输出此时的秒数

RTC_ClearITPendingBit(RTC_IT_ALR);

PWR_BackupAccessCmd(ENABLE);

RTC_EnterConfigMode();

RTC_WaitForLastTask();

RTC_SetAlarm(40+RTC_GetCounter()); //配置下次闹钟为40s后

RTC_WaitForLastTask();

RTC_ExitConfigMode();

PWR_BackupAccessCmd(DISABLE);

}

if(RTC_GetITStatus(RTC_IT_SEC)!=RESET) //是否秒中断发生

{

printf("Time is =%d \r\n",RTC_GetCounter()); //输出此时的秒数

}

RTC_ClearITPendingBit(RTC_IT_SEC|RTC_IT_OW); //清除秒中断标志位和溢出位

RTC_WaitForLastTask();

}


待机唤醒:

待机模式是功耗最低的一种模式。外部复位(NRST 引脚)、 IWDG 复位、 WKUP 引脚上的上升沿或 RTC 闹钟事件发生时,STM32从待机模式退出。其中外部复位和WKUP的方法比较简单。主要讲一下RTC闹钟唤醒。这两个程序一个是让STM32的一个管脚接按键,按键按下的时候STM32进入待机状态,当40秒的闹钟到来时唤醒STM32.另一个是当按键按下时候进入待机状态,闹钟设置为5S秒后,闹钟来临时唤醒STM32。

void RTC_Init()

{

NVIC_InitTypeDef NVIC_InitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP|RCC_APB1Periph_PWR,ENABLE);

PWR_WakeUpPinCmd(ENABLE);

PWR_BackupAccessCmd(ENABLE);

BKP_DeInit();

RCC_LSEConfig(RCC_LSE_ON);

while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)

{

}

RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);

RCC_RTCCLKCmd(ENABLE);

RTC_WaitForLastTask();

RTC_WaitForSynchro();

RTC_ITConfig(RTC_IT_SEC, ENABLE);

RTC_WaitForLastTask();

RTC_EnterConfigMode();

RTC_SetCounter(0); //设置计数初始值

RTC_WaitForLastTask();

RTC_SetPrescaler(32767);

RTC_WaitForLastTask();

RTC_SetAlarm(40); //闹钟定时40S

RTC_WaitForLastTask();

RTC_ExitConfigMode();

NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn; //RTC全局中断 它的优先级要小于按键

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

}

void EXTIX_Init(void)

{

EXTI_InitTypeDef EXTI_InitStructure;

NVIC_InitTypeDef NVIC_InitStructure;

GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC,ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;

GPIO_Init(GPIOC, &GPIO_InitStructure);

GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource5);//配置按键PC5为外部中断

EXTI_InitStructure.EXTI_Line=EXTI_Line5;

EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;

EXTI_InitStructure.EXTI_LineCmd = ENABLE;

EXTI_Init(&EXTI_InitStructure);

NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; //外部中断的优先级高于RTC

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

}

void EXTI9_5_IRQHandler() //按键对应的外部中断

{

EXTI_ClearITPendingBit(EXTI_Line5);

PWR_EnterSTANDBYMode(); //进入待机模式

}

void RTC_IRQHandler() //RTC的中断

{

if(RTC_GetITStatus(RTC_IT_SEC)!=RESET)

{

printf("TIME IS =%d \r\n",RTC_GetCounter());

}

RTC_ClearITPendingBit(RTC_IT_SEC|RTC_IT_OW);

RTC_WaitForLastTask();

}


文章整合自:eeworld

编辑:ymf

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 实时时钟
    +关注

    关注

    4

    文章

    325

    浏览量

    67976
  • 中断
    +关注

    关注

    5

    文章

    912

    浏览量

    43551
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    使用芯源CW32 MCU来实现低功耗模式下的RTC定时唤醒功能

    , sTime.Minutes, sTime.Seconds); } 5. 测试结果 通过上述代码,MCU成功进入睡眠模式,并在1分钟后由RTC闹钟中断
    发表于 12-04 07:55

    RTC工作原理

    到这些影子寄存器中‌ ‌4、周期性自动唤醒‌:RTC有一个16位的自动重载递减计数器,可以产生周期性的唤醒中断,通常定时一秒‌ ‌5、可编程闹钟
    发表于 11-28 07:14

    在CW32F030 MCU上设置外部中断RTC唤醒条件的示例

    ) // ... // 注意:代码执行到这里后,MCU将进入DeepSleep模式,直到被RTC闹钟中断唤醒 } int mai
    发表于 11-25 08:00

    CW32L083低功耗项目休眠后无法唤醒怎么解决?

    配置STOP模式后GPIO中断唤醒失效,RTC闹钟唤醒倒是正常,电路设计遵循了手册建议,求排查思
    发表于 11-21 07:47

    AT32F系列 PWC待机唤醒唤醒Standby

    AT32F系列 PWC待机唤醒唤醒Standby 示例目的 演示AT32F系列 PWC待机唤醒
    发表于 11-05 14:08

    【NCS随笔】如何进入system_off深度睡眠模式以及配置GPIO中断唤醒

    【NCS随笔】如何进入system_off深度睡眠模式以及配置GPIO中断唤醒 本文章主要是讲解NCS下面使用nRF54L15如何进入system_off模式,以及如何配置通过按键
    的头像 发表于 09-29 00:56 467次阅读
    【NCS随笔】如何进入system_off深度睡眠<b class='flag-5'>模式</b>以及配置GPIO<b class='flag-5'>中断</b><b class='flag-5'>唤醒</b>

    求助,关于STM32F030进入Stop模式RTC唤醒问题求解

    STM32F030满足条件后配置RTC唤醒 void RTC_AlarmConfig(void) { RTC_TimeTypeDef sT
    发表于 07-23 06:59

    AT32的ERTC与RTC的区别

    闹钟中断、一个周期性唤醒中断、入侵检测中断和时间戳中断,方便进行多种定时和报警应用开发 。 时
    发表于 07-11 10:48

    【RA4L1-SENSOR】07 低功耗待机模式及功耗实测

    低功耗模式为修改为软件待机模式唤醒源配置3个:IRQ6、IRQ7和RTC Period 3.2 配置按键GPIO的
    发表于 06-20 09:36

    WLE5CBU6在STOP2模式下,概率性不能通过RTC闹钟中断唤醒,为什么?

    已知闹钟中断优先级最高,跑RTC测试时,挂测会出现概率性的无法唤醒MCU
    发表于 06-16 06:34

    STM32U5 IWDG的提前唤醒中断无法在STOP模式下触发怎么解决?

    我使用的是STM32U585系列芯片,开启了IWDG,并在运行模式下测试提前唤醒中断正常触发,但在进入STOP2模式后,提前
    发表于 04-22 08:14

    【瑞萨RA2L1入门学习】03. RTC 时钟日历&amp;闹钟&amp;周期性中断

    、月、日、时、分、秒等时间信息;在计时模式下,RTC则用于产生固定周期的中断,如每秒一次的中断RTC 常见的操作包括设置时间、设置定时闹铃
    发表于 03-07 16:45

    利用CKS32F107xx系列RTC闹钟实验

    本小节讲解的是如何在万年历实验的基础上,利用RTC闹钟功能实现一个闹钟,在每天的[XX小时-XX分钟-XX秒]产生闹钟,然后通过闪烁LED模拟闹钟
    的头像 发表于 02-18 17:21 1122次阅读

    【瑞萨RA2L1入门学习】05、待机模式按键外部中断唤醒 低功耗测试

    的。 任何中断或者复位都会将MCU从睡眠模式唤醒,并开始处理中断,这也包括Systick系统计时器,因此读者如果用到了RTOS, 进入睡眠模式
    发表于 01-29 23:08

    看门狗复位是否可以唤醒待机模式

    为什么我进入待机模式后就无法唤醒,看门狗复位唤醒是需要配置什么还是无法唤醒待机
    发表于 12-21 15:09