#include "rtc.h" #include "delay.h" #include "led.h" ////////////////////////////////////////////////////////////////////////////////// /************************************************************************************** //RTC驱动代码 //DevEBox 大越电子(嵌入式开发网) //淘宝店铺:mcudev.taobao.com //淘宝店铺:shop389957290.taobao.com **************************************************************************************/ ////////////////////////////////////////////////////////////////////////////////// RTC_HandleTypeDef RTC_Handler; //RTC句柄 /************************************************************************************** //RTC时间设置 //hour,min,sec:小时,分钟,秒钟 //ampm:@RTC_AM_PM_Definitions:RTC_HOURFORMAT12_AM/RTC_HOURFORMAT12_PM //返回值:SUCEE(1),成功 // ERROR(0),进入初始化模式失败 //DevEBox 大越电子(嵌入式开发网) //淘宝店铺:mcudev.taobao.com //淘宝店铺:shop389957290.taobao.com **************************************************************************************/ HAL_StatusTypeDef RTC_Set_Time(u8 hour,u8 min,u8 sec,u8 ampm) { RTC_TimeTypeDef RTC_TimeStructure; RTC_TimeStructure.Hours=hour; RTC_TimeStructure.Minutes=min; RTC_TimeStructure.Seconds=sec; RTC_TimeStructure.TimeFormat=ampm; RTC_TimeStructure.DayLightSaving=RTC_DAYLIGHTSAVING_NONE; RTC_TimeStructure.StoreOperation=RTC_STOREOPERATION_RESET; return HAL_RTC_SetTime(&RTC_Handler,&RTC_TimeStructure,RTC_FORMAT_BIN); } /************************************************************************************** //RTC日期设置 //year,month,date:年(0~99),月(1~12),日(0~31) //week:星期(1~7,0,非法!) //返回值:SUCEE(1),成功 // ERROR(0),进入初始化模式失败 //DevEBox 大越电子(嵌入式开发网) //淘宝店铺:mcudev.taobao.com //淘宝店铺:shop389957290.taobao.com **************************************************************************************/ HAL_StatusTypeDef RTC_Set_Date(u8 year,u8 month,u8 date,u8 week) { RTC_DateTypeDef RTC_DateStructure; RTC_DateStructure.Date=date; RTC_DateStructure.Month=month; RTC_DateStructure.WeekDay=week; RTC_DateStructure.Year=year; return HAL_RTC_SetDate(&RTC_Handler,&RTC_DateStructure,RTC_FORMAT_BIN); } /************************************************************************************** //RTC初始化 //返回值:0,初始化成功; // 2,进入初始化模式失败; //DevEBox 大越电子(嵌入式开发网) //淘宝店铺:mcudev.taobao.com //淘宝店铺:shop389957290.taobao.com **************************************************************************************/ u8 RTC_Init(void) { RTC_Handler.Instance=RTC; RTC_Handler.Init.HourFormat=RTC_HOURFORMAT_24;//RTC设置为24小时格式 RTC_Handler.Init.AsynchPrediv=0X7F; //RTC异步分频系数(1~0X7F) RTC_Handler.Init.SynchPrediv=0XFF; //RTC同步分频系数(0~7FFF) RTC_Handler.Init.OutPut=RTC_OUTPUT_DISABLE; RTC_Handler.Init.OutPutPolarity=RTC_OUTPUT_POLARITY_HIGH; RTC_Handler.Init.OutPutType=RTC_OUTPUT_TYPE_OPENDRAIN; if(HAL_RTC_Init(&RTC_Handler)!=HAL_OK) return 2; if(HAL_RTCEx_BKUPRead(&RTC_Handler,RTC_BKP_DR0)!=0X5050)//是否第一次配置 { RTC_Set_Time(10,50,0,RTC_HOURFORMAT12_AM); //设置时间 ,根据实际时间修改 RTC_Set_Date(17,8,13,7); //设置日期 HAL_RTCEx_BKUPWrite(&RTC_Handler,RTC_BKP_DR0,0X5050);//标记已经初始化过了 } return 0; } /************************************************************************************** //RTC底层驱动,时钟配置 //此函数会被HAL_RTC_Init()调用 //hrtc:RTC句柄 //DevEBox 大越电子(嵌入式开发网) //淘宝店铺:mcudev.taobao.com //淘宝店铺:shop389957290.taobao.com **************************************************************************************/ void HAL_RTC_MspInit(RTC_HandleTypeDef* hrtc) { RCC_OscInitTypeDef RCC_OscInitStruct; RCC_PeriphCLKInitTypeDef PeriphClkInitStruct; __HAL_RCC_RTC_CLK_ENABLE(); //使能RTC时钟 HAL_PWR_EnableBkUpAccess(); //取消备份区域写保护 RCC_OscInitStruct.OscillatorType=RCC_OSCILLATORTYPE_LSE;//LSE配置 RCC_OscInitStruct.PLL.PLLState=RCC_PLL_NONE; RCC_OscInitStruct.LSEState=RCC_LSE_ON; //RTC使用LSE HAL_RCC_OscConfig(&RCC_OscInitStruct); PeriphClkInitStruct.PeriphClockSelection=RCC_PERIPHCLK_RTC;//外设为RTC PeriphClkInitStruct.RTCClockSelection=RCC_RTCCLKSOURCE_LSE;//RTC时钟源为LSE HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct); __HAL_RCC_RTC_ENABLE();//RTC时钟使能 } /************************************************************************************** //设置闹钟时间(按星期闹铃,24小时制) //week:星期几(1~7) @ref RTC_WeekDay_Definitions //hour,min,sec:小时,分钟,秒钟 //DevEBox 大越电子(嵌入式开发网) //淘宝店铺:mcudev.taobao.com //淘宝店铺:shop389957290.taobao.com **************************************************************************************/ void RTC_Set_AlarmA(u8 week,u8 hour,u8 min,u8 sec) { RTC_AlarmTypeDef RTC_AlarmSturuct; RTC_AlarmSturuct.AlarmTime.Hours=hour; //小时 RTC_AlarmSturuct.AlarmTime.Minutes=min; //分钟 RTC_AlarmSturuct.AlarmTime.Seconds=sec; //秒 RTC_AlarmSturuct.AlarmTime.SubSeconds=0; RTC_AlarmSturuct.AlarmTime.TimeFormat=RTC_HOURFORMAT12_AM; RTC_AlarmSturuct.AlarmMask=RTC_ALARMMASK_NONE;//精确匹配星期,时分秒 RTC_AlarmSturuct.AlarmSubSecondMask=RTC_ALARMSUBSECONDMASK_NONE; RTC_AlarmSturuct.AlarmDateWeekDaySel=RTC_ALARMDATEWEEKDAYSEL_WEEKDAY;//按星期 RTC_AlarmSturuct.AlarmDateWeekDay=week; //星期 RTC_AlarmSturuct.Alarm=RTC_ALARM_A; //闹钟A HAL_RTC_SetAlarm_IT(&RTC_Handler,&RTC_AlarmSturuct,RTC_FORMAT_BIN); HAL_NVIC_SetPriority(RTC_Alarm_IRQn,0x01,0x02); //抢占优先级1,子优先级2 HAL_NVIC_EnableIRQ(RTC_Alarm_IRQn); } /**************************************************************************************/ //周期性唤醒定时器设置 /*wksel: @ref RTCEx_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,产生中断. //DevEBox 大越电子(嵌入式开发网) //淘宝店铺:mcudev.taobao.com //淘宝店铺:shop389957290.taobao.com //**************************************************************************************/ void RTC_Set_WakeUp(u32 wksel,u16 cnt) { __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(&RTC_Handler, RTC_FLAG_WUTF);//清除RTC WAKE UP的标志 HAL_RTCEx_SetWakeUpTimer_IT(&RTC_Handler,cnt,wksel); //设置重装载值和时钟 HAL_NVIC_SetPriority(RTC_WKUP_IRQn,0x02,0x02); //抢占优先级1,子优先级2 HAL_NVIC_EnableIRQ(RTC_WKUP_IRQn); } /************************************************************************************** //RTC闹钟中断服务函数 //DevEBox 大越电子(嵌入式开发网) //淘宝店铺:mcudev.taobao.com //淘宝店铺:shop389957290.taobao.com **************************************************************************************/ void RTC_Alarm_IRQHandler(void) { HAL_RTC_AlarmIRQHandler(&RTC_Handler); } /************************************************************************************** //RTC闹钟A中断处理回调函数 //DevEBox 大越电子(嵌入式开发网) //淘宝店铺:mcudev.taobao.com //淘宝店铺:shop389957290.taobao.com **************************************************************************************/ void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc) { printf("ALARM A!\r\n"); } /************************************************************************************** //RTC WAKE UP中断服务函数 //DevEBox 大越电子(嵌入式开发网) //淘宝店铺:mcudev.taobao.com //淘宝店铺:shop389957290.taobao.com **************************************************************************************/ void RTC_WKUP_IRQHandler(void) { HAL_RTCEx_WakeUpTimerIRQHandler(&RTC_Handler); } /************************************************************************************** //RTC WAKE UP中断处理 //DevEBox 大越电子(嵌入式开发网) //淘宝店铺:mcudev.taobao.com //淘宝店铺:shop389957290.taobao.com **************************************************************************************/ void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc) { LED2_Toggle; } /************************************************************************************** //等待RSF同步 //返回值:0,成功;1,失败; //DevEBox 大越电子(嵌入式开发网) //淘宝店铺:mcudev.taobao.com //淘宝店铺:shop389957290.taobao.com **************************************************************************************/ u8 RTC_Wait_Synchro(void) { u32 retry=0XFFFFF; //关闭RTC寄存器写保护 RTC->WPR=0xCA; RTC->WPR=0x53; RTC->ISR&=~(1<<5); //清除RSF位 while(retry&&((RTC->ISR&(1<<5))==0x00))retry--;//等待影子寄存器同步 if(retry==0)return 1; //同步失败 RTC->WPR=0xFF; //使能RTC寄存器写保护 return 0; } /************************************************************************************** //十进制转换为BCD码 //val:要转换的十进制数 //返回值:BCD码 //DevEBox 大越电子(嵌入式开发网) //淘宝店铺:mcudev.taobao.com //淘宝店铺:shop389957290.taobao.com **************************************************************************************/ u8 RTC_DEC2BCD(u8 val) { u8 bcdhigh = 0; while(val>=10) { bcdhigh++; val-=10; } return ((u8)(bcdhigh<<4)|val); } /************************************************************************************** //BCD码转换为十进制数据 //val:要转换的BCD码 //返回值:十进制数据 //DevEBox 大越电子(嵌入式开发网) //淘宝店铺:mcudev.taobao.com //淘宝店铺:shop389957290.taobao.com **************************************************************************************/ u8 RTC_BCD2DEC(u8 val) { u8 temp=0; temp=(val>>4)*10; return (temp+(val&0X0F)); } /************************************************************************************** //获取RTC时间 //hour,min,sec:小时,分钟,秒钟 //ampm:AM/PM,0=AM/24H,1=PM. //DevEBox 大越电子(嵌入式开发网) //淘宝店铺:mcudev.taobao.com //淘宝店铺:shop389957290.taobao.com **************************************************************************************/ void RTC_Get_Time(u8 *hour,u8 *min,u8 *sec,u8 *ampm) { u32 temp=0; while(RTC_Wait_Synchro()); //等待同步 temp=RTC->TR; *hour=RTC_BCD2DEC((temp>>16)&0X3F); *min=RTC_BCD2DEC((temp>>8)&0X7F); *sec=RTC_BCD2DEC(temp&0X7F); *ampm=temp>>22; } /**************************************************************************************/ //获取RTC日期 //year,mon,date:年,月,日 //week:星期 //DevEBox 大越电子(嵌入式开发网) //淘宝店铺:mcudev.taobao.com //淘宝店铺:shop389957290.taobao.com /**************************************************************************************/ void RTC_Get_Date(u8 *year,u8 *month,u8 *date,u8 *week) { u32 temp=0; while(RTC_Wait_Synchro()); //等待同步 temp=RTC->DR; *year=RTC_BCD2DEC((temp>>16)&0XFF); *month=RTC_BCD2DEC((temp>>8)&0X1F); *date=RTC_BCD2DEC(temp&0X3F); *week=(temp>>13)&0X07; } /**************************************************************************************/ //DevEBox 大越电子(嵌入式开发网) //淘宝店铺:mcudev.taobao.com //淘宝店铺:shop389957290.taobao.com /**************************************************************************************/