首页 > 编程知识 正文

stm32rtc闹钟中断,STM32F103RBT6

时间:2023-05-06 00:07:42 阅读:12738 作者:9

另一方面,特征和定义实时时钟(RTC ) :是独立的BCD定时器/计数器。 RTC提供日历时钟、两个可编程闹钟中断和具有中断功能的周期性可编程唤醒标志。 RTC还包括用于管理低功耗模式的自动唤醒单元。

两个32位寄存器包括秒、分钟、小时(12小时或24小时制)、星期、日期、月和年。 也可以指定二进制的子秒值。 系统可以自动将月天数补偿为28,29 )闰年)、30,31天。 也可以进行夏时制补偿。 其他32位寄存器还包括可编程闹钟的子秒、秒、分钟、小时、星期几和日期。 此外,还可以使用数字校准功能来校正石英振动精度的偏差。 通电复位后,所有RTC寄存器都将免受未经授权的写入访问。 RTC模块和时钟配置在备份区域(系统重置或备用模式唤醒)中的设置和时间保持不变。 只要备份区域正常供电,RTC就会一直运行。 但是,系统重置后,备份区域和RTC的访问将自动禁止,为了防止意外操作,必须在设置时间之前取消备份区域的写保护。 二、RTC工作原理框图

三. RTC代码如下。 包括日历、闹钟及周期性唤醒结构

rtc.c:

# include ' RTC.h ' # include ' led.h ' # include ' delay.h ' # include ' usart.h ' nvic _ inittypedefnvic _ inits trts 秒//ampm : @ RTC _ am _ pm _ definitions 3360 RTC _ h12 _ am/RTC _ h12迁移到初始化模式失败errorstatusrtc _ set _ time () RTC _ timetypeinitstructure.RTC _ hours=hour; RTC _ timetypeinitstructure.RTC _ minutes=min; RTC _ timetypeinitstructure.RTC _ seconds=sec; RTC _ timetypeinitstructure.RTC _ h12=ampm; return RTC _ settime (RTC _ format _ bin,RTC_TimeTypeInitStructure ); }//RTC日期设定//year,month,date:年(0(99 ),月(1(12 ),日)0(31 )//week:周(1(7,0 ),违法! //返回值:sucee(1)、成功//ERROR(0) 0、迁移到初始化模式失败errorstatusrtc _ set _ date u8 year、u8 month、u8 date、u8 week ) RTC _ datetypeinitstructure.RTC _ month=month; RTC _ datetypeinitstructure.RTC _ weekday=week; RTC _ datetypeinitstructure.RTC _ year=year; return RTC _ set date (RTC _ format _ bin,RTC_DateTypeInitStructure ); }//RTC初始化//返回值:0,初始化成功; //1,LSE打开失败; //2,进入初始化模式失败; u8my_RTC_init(void ) RTC _ inittypedefrtc _ init structure; u16 retry=0X1FFF; RCC _ AP B1 periphclockcmd (RCC _ AP B1 per iph _ PWR,ENABLE ); //PWR时钟启用PWR_backupaccesscmd(enable )//备份寄存器在访问if(RTC_readbackupregister ) RTC_bkp_dr0时=0x5050(//是否要首次配置? {RCC_LSEconfig(RCC_LSE_on ); //LSE打开while (RCC _ getflagstatus (RCC _ flag _ LSE rdy )==RESET )//检查是否设置了指定的RCC标志位,并准备低速晶体振动({retry; dlay_ms(10; } if (恢复==0)返回1; //LSE打开失败. RCC_rtcclkconfig(RCC_rt

CCLKSource_LSE);//设置RTC时钟(RTCCLK),选择LSE作为RTC时钟 RCC_RTCCLKCmd(ENABLE);//使能RTC时钟 RTC_InitStructure.RTC_AsynchPrediv = 0x7F;//RTC异步分频系数(1~0X7F) RTC_InitStructure.RTC_SynchPrediv = 0xFF;//RTC同步分频系数(0~7FFF) RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24;//RTC设置为,24小时格式 RTC_Init(&RTC_InitStructure); RTC_Set_Time(23,59,56,RTC_H12_AM);//设置时间RTC_Set_Date(14,5,5,1);//设置日期 RTC_WriteBackupRegister(RTC_BKP_DR0,0x5050);//标记已经初始化过了} return 0;}//设置闹钟时间(按星期闹铃,24小时制)//week:星期几(1~7) @ref RTC_Alarm_Definitions//hour,min,sec:小时,分钟,秒钟void RTC_Set_AlarmA(u8 week,u8 hour,u8 min,u8 sec){ EXTI_InitTypeDef EXTI_InitStructure;RTC_AlarmTypeDef RTC_AlarmTypeInitStructure;RTC_TimeTypeDef RTC_TimeTypeInitStructure;RTC_AlarmCmd(RTC_Alarm_A,DISABLE);//关闭闹钟A RTC_TimeTypeInitStructure.RTC_Hours=hour;//小时RTC_TimeTypeInitStructure.RTC_Minutes=min;//分钟RTC_TimeTypeInitStructure.RTC_Seconds=sec;//秒RTC_TimeTypeInitStructure.RTC_H12=RTC_H12_AM; RTC_AlarmTypeInitStructure.RTC_AlarmDateWeekDay=week;//星期RTC_AlarmTypeInitStructure.RTC_AlarmDateWeekDaySel=RTC_AlarmDateWeekDaySel_WeekDay;//按星期闹RTC_AlarmTypeInitStructure.RTC_AlarmMask=RTC_AlarmMask_None;//精确匹配星期,时分秒RTC_AlarmTypeInitStructure.RTC_AlarmTime=RTC_TimeTypeInitStructure; RTC_SetAlarm(RTC_Format_BIN,RTC_Alarm_A,&RTC_AlarmTypeInitStructure); RTC_ClearITPendingBit(RTC_IT_ALRA);//清除RTC闹钟A的标志 EXTI_ClearITPendingBit(EXTI_Line17);//清除LINE17上的中断标志位 RTC_ITConfig(RTC_IT_ALRA,ENABLE);//开启闹钟A中断RTC_AlarmCmd(RTC_Alarm_A,ENABLE);//开启闹钟A EXTI_InitStructure.EXTI_Line = EXTI_Line17;//LINE17 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断事件 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //上升沿触发 EXTI_InitStructure.EXTI_LineCmd = ENABLE;//使能LINE17 EXTI_Init(&EXTI_InitStructure);//配置NVIC_InitStructure.NVIC_IRQChannel = RTC_Alarm_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;//抢占优先级1 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//子优先级2 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道 NVIC_Init(&NVIC_InitStructure);//配置}//周期性唤醒定时器设置 /*wksel: @ref RTC_Wakeup_Timer_Definitions#define RTC_WakeUpClock_RTCCLK_Div16 ((uint32_t)0x00000000)#define RTC_WakeUpClock_RTCCLK_Div8 ((uint32_t)0x00000001)#define RTC_WakeUpClock_RTCCLK_Div4 ((uint32_t)0x00000002)#define RTC_WakeUpClock_RTCCLK_Div2 ((uint32_t)0x00000003)#define RTC_WakeUpClock_CK_SPRE_16bits ((uint32_t)0x00000004)#define RTC_WakeUpClock_CK_SPRE_17bits ((uint32_t)0x00000006)*///cnt:自动重装载值.减到0,产生中断.void RTC_Set_WakeUp(u32 wksel,u16 cnt){ EXTI_InitTypeDef EXTI_InitStructure;RTC_WakeUpCmd(DISABLE);//关闭WAKE UPRTC_WakeUpClockConfig(wksel);//唤醒时钟选择RTC_SetWakeUpCounter(cnt);//设置WAKE UP自动重装载寄存器RTC_ClearITPendingBit(RTC_IT_WUT); //清除RTC WAKE UP的标志 EXTI_ClearITPendingBit(EXTI_Line22);//清除LINE22上的中断标志位 RTC_ITConfig(RTC_IT_WUT,ENABLE);//开启WAKE UP 定时器中断RTC_WakeUpCmd( ENABLE);//开启WAKE UP 定时器 EXTI_InitStructure.EXTI_Line = EXTI_Line22;//LINE22 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断事件 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //上升沿触发 EXTI_InitStructure.EXTI_LineCmd = ENABLE;//使能LINE22 EXTI_Init(&EXTI_InitStructure);//配置 NVIC_InitStructure.NVIC_IRQChannel = RTC_WKUP_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;//抢占优先级1 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//子优先级2 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道 NVIC_Init(&NVIC_InitStructure);//配置}//RTC闹钟中断服务函数void RTC_Alarm_IRQHandler(void){ if(RTC_GetFlagStatus(RTC_FLAG_ALRAF)==SET)//ALARM A中断?{RTC_ClearFlag(RTC_FLAG_ALRAF);//清除中断标志printf("ALARM A!rn");} EXTI_ClearITPendingBit(EXTI_Line17);//清除中断线17的中断标志 }//RTC WAKE UP中断服务函数void RTC_WKUP_IRQHandler(void){ if(RTC_GetFlagStatus(RTC_FLAG_WUTF)==SET)//WK_UP中断?{ RTC_ClearFlag(RTC_FLAG_WUTF);//清除中断标志LED1=!LED1; } EXTI_ClearITPendingBit(EXTI_Line22);//清除中断线22的中断标志 }

main.c

#include "sys.h"#include "delay.h" #include "usart.h" #include "rtc.h"int main(void){ RTC_TimeTypeDef RTC_TimeStruct;RTC_DateTypeDef RTC_DateStruct;u8 tbuf[40];u8 t=0;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2delay_init(168); //初始化延时函数uart_init(115200);//初始化串口波特率为115200My_RTC_Init(); //初始化RTC RTC_Set_WakeUp(RTC_WakeUpClock_CK_SPRE_16bits,0);//配置WAKE UP中断,1秒钟中断一次 while(1) {t++;if((t%10)==0)//每100ms更新一次显示数据{RTC_GetTime(RTC_Format_BIN,&RTC_TimeStruct);sprintf((char*)tbuf,"Time:%02d:%02d:%02d",RTC_TimeStruct.RTC_Hours,RTC_TimeStruct.RTC_Minutes,RTC_TimeStruct.RTC_Seconds); printf("%srn",tbuf);RTC_GetDate(RTC_Format_BIN, &RTC_DateStruct);sprintf((char*)tbuf,"Date:20%02d-%02d-%02d",RTC_DateStruct.RTC_Year,RTC_DateStruct.RTC_Month,RTC_DateStruct.RTC_Date); printf("%srn",tbuf);sprintf((char*)tbuf,"Week:%d",RTC_DateStruct.RTC_WeekDay); printf("%srn",tbuf);} if((t%20)==0)LED0=!LED0;//每200ms,翻转一次LED0 delay_ms(10);}}

 

 

 

 

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。

  • 相关阅读