完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
RTC可用于周期性从低功耗模式下唤醒MCU,RTC可选三个时钟源:低功耗 32.768kHz 外部低速晶振 (LSE):该时钟源提供了一个低功耗且精确的时间基准。低功耗内部低速振荡器 (LSI):使用该时钟源,节省了一个 32.768kHz 晶振的成本,但是精度没有外部晶振的精度高。外部高速晶振(HSE)128分频:在某些低功耗模式中HSE被关闭会导致RTC无时钟源。 为了用 RTC 闹钟事件将系统从停机模式下唤醒,必须进行如下操作: 配置外部中断线 17 为上升沿触发。 配置 RTC 使其可产生 RTC 闹钟事件。 如果要从待机模式中唤醒, 不必配置外部中断线 17。 MM32F013x有三种低功耗模式:睡眠模式(Sleep Mode)、停机模式(Stop Mode)和待机模式(Standby Mode),三种低功耗模式的对比如下表所示:
从上表中可以看出,当MCU工作在停机模式时,可以通过任一外部中断事件来唤醒。MM32F013x低功耗模式下的功耗列表如下图所示:
MM32F013x有22个外部中断源,其中EXti 17对应的是RTC闹钟事件,所以结合RTC闹钟的功能,本文将重点介绍如何在MM32F013x上通过内部RTC模块的闹钟事件来唤醒处于停机模式下的MCU。 01 实现功能 通过内部RTC模块的闹钟事件(对应的是外部中断EXTI 17)来唤醒处于停机模式下的MCU。系统在进入停机模式时拉高GPIO端口,在恢复到正常运行状态时拉低GPIO端口。 02 配置顺序 1)使能PWR和BKP时钟: RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); 2)使能后备寄存器访问: PWR_BackupAccessCmd(ENABLE); 3)配置RTC时钟源,使能RTC时钟,如果使用LSE,要打开LSE: RCC_LSEConfig(RCC_LSE_ON); while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET); RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); RCC_RTCCLKCmd(ENABLE); 4)设置RTC预分频系数: RTC_SetPrescaler(); 5)开启相关中断: RTC_ITConfig(RTC_IT_ALR, ENABLE); 6)配置外部中断线: EXTI_StructInit(&EXTI_InitStructure); EXTI_InitStructure.EXTI_Line = EXTI_Line17; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); 7)配置中断服务函数: NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn; NVIC_InitStructure.NVIC_IRQChannelPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); 8)部分操作要等待写操作完成和同步。 03 参考代码 3.1 RTC初始化配置:使用外部32.768kHz的晶振源 void RTC_Configure(void) { uint16_t BKP_Value = 0x5A5A; EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; /* Enable PWR Clock */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); /* Enable Access To The RTC & Backup Registers */ PWR_BackupAccessCmd(ENABLE); if(BKP_ReadBackupRegister(BKP_DR1) != BKP_Value) { BKP_DeInit(); /* Enable LSE Clock Source */ RCC_LSEConfig(RCC_LSE_ON); /* Wait LSI Clock Source Ready */ while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET); /* Config RTC Clock Source : LSE */ RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); /* Enable RTC Clock */ RCC_RTCCLKCmd(ENABLE); /* Wait For Synchronization */ RTC_WaitForSynchro(); /* Wait Until Last Write Operation On RTC REG Has Finished */ RTC_WaitForLastTask(); /* Set The RTC Prescaler Value */ RTC_SetPrescaler(32767); /* Wait Until Last Write Operation On RTC REG Has Finished */ RTC_WaitForLastTask(); /* Enable RTC AlARM Interrupt */ RTC_ITConfig(RTC_IT_ALR, ENABLE); /* Wait Until Last Write Operation On RTC REG Has Finished */ RTC_WaitForLastTask(); /* Exit From The RTC Configuration Mode */ RTC_ExitConfigMode(); BKP_WriteBackupRegister(BKP_DR1, BKP_Value); /* Wait Until Last Write Operation On RTC REG Has Finished */ RTC_WaitForLastTask(); } else { /* Wait For Synchronization */ RTC_WaitForSynchro(); /* Enable RTC Alarm Interrupt */ RTC_ITConfig(RTC_IT_ALR, ENABLE); /* Wait Until Last Write Operation On RTC REG Has Finished */ RTC_WaitForLastTask(); } /* Clear EXTI Line17 Flag */ EXTI_ClearITPendingBit(EXTI_Line17); /* Configure EXTI Line17(RTC Alarm) To Generate An Interrupt On Rising Edge */ EXTI_StructInit(&EXTI_InitStructure); EXTI_InitStructure.EXTI_Line = EXTI_Line17; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); /* Config RTC NVIC */ NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn; NVIC_InitStructure.NVIC_IRQChannelPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } 3.2 RTC闹钟中断函数 void RTC_BKP_IRQHandler(void) { if(RTC_GetITStatus(RTC_IT_ALR) != RESET) { GPIO_WriteBit(LED_GPIO, LED_PIN, Bit_RESET); /* Clear EXTI Line17 Flag */ EXTI_ClearITPendingBit(EXTI_Line17); /* Check If The Wake-Up Flag Is Set */ if(PWR_GetFlagStatus(PWR_FLAG_WU) != RESET) { /* Clear Wake Up Flag */ PWR_ClearFlag(PWR_FLAG_WU); } /* Clear Alarm Flag */ RTC_ClearITPendingBit(RTC_IT_ALR); /* Wait Until Last Write Operation On RTC REG Has Finished */ RTC_WaitForLastTask(); } } 3.3 设置RTC闹钟时间,系统进入STOP模式 void RTC_EntryStopMode(void) { /* Wait till RTC Second event occurs */ RTC_ClearFlag(RTC_FLAG_SEC); while(RTC_GetFlagStatus(RTC_FLAG_SEC) == RESET); /* Set The RTC Alarm Value */ RTC_SetAlarm(RTC_GetCounter() + 3); /* Wait Until Last Write Operation On RTC REG Has Finished */ RTC_WaitForLastTask(); GPIO_WriteBit(LED_GPIO, LED_PIN, Bit_SET); /* Enter Stop Mode */ PWR_EnterSTOPMode(PWR_Regulator_ON, PWR_STOPEntry_WFI); } 04 运行结果 编译软件工程无误后下载代码,调用RTC_EntryStopMode()函数使系统进入到停机模式,等待RTC闹钟事件3S后唤醒停机模式下的MCU,唤醒后继续执行程序,通过观察GPIO的电平状态来查看运行结果: |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
2248个成员聚集在这个小组
加入小组灵动微电子MM32全系列MCU产品应用手册,库函数和例程和选型表
11657 浏览 3 评论
【MM32 eMiniBoard试用连载】+基于OLED12864的GUI---U8G2
5920 浏览 1 评论
【MM32 eMiniBoard试用连载】移植RT-Thread至MM32L373PS
10943 浏览 0 评论
【MM32 eMiniBoard测评报告】+ 开箱 + 初探
4568 浏览 1 评论
灵动微课堂(第106讲) | MM32 USB功能学习笔记 —— WinUSB设备
4296 浏览 1 评论
[MM32软件] MM32F002使用内部flash存储数据怎么操作?
962浏览 1评论
791浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 05:22 , Processed in 0.536461 second(s), Total 63, Slave 47 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号