这是本文档旧的修订版!
银杏科技有限公司旗下技术文档发布平台 | |||
技术支持电话 | 0379-69926675-801 | ||
技术支持邮件 | Gingko@vip.163.com | ||
技术论坛 | http://www.eeschool.org | ||
版本 | 日期 | 作者 | 修改内容 |
---|---|---|---|
V1.0 | 2020-07-31 | gingko | 初次建立 |
int main(void) { RTC_TimeTypeDef sTime; RTC_DateTypeDef sDate; int second_bak = 0; HAL_Init(); SystemClock_Config(); //配置系统时钟 MX_GPIO_Init(); //初始化所有已配置的外围设备 MX_RTC_Init(); MX_UART4_Init(); uart4.printf("\x0c"); //清屏 uart4.printf("\033[1;32;40m");//字体终端设置为绿色 uart4.printf("\r\n\r\nhello! I am iCore3!\r\n\r\n\r\n"); //在串口终端打印“Hello! I am iCore3” LED_GREEN_ON; //绿灯亮 while (1) { HAL_Delay (100); HAL_RTC_GetTime (&hrtc,&sTime,RTC_FORMAT_BIN); //读取RTC日期和时间 HAL_RTC_GetDate (&hrtc,&sDate,RTC_FORMAT_BIN); if(second_bak != sTime.Seconds){ //当秒数据与备份不一致时,像终端打印时间/日期 uart4.printf(" %02d:%02d:%02d",sTime.Hours,sTime.Minutes,sTime.Seconds); uart4.printf("20%02d-%02d-%02d\r",sDate.Year,sDate.Month,sDate.Date); second_bak = sTime.Seconds; //秒数据备份 } } }
void MX_RTC_Init(void) { RTC_TimeTypeDef sTime = {0}; RTC_DateTypeDef sDate = {0}; hrtc.Instance = RTC; hrtc.Init.HourFormat = RTC_HOURFORMAT_24; hrtc.Init.AsynchPrediv = 127;//RTC异步分频系数 hrtc.Init.SynchPrediv = 255; //RTC同步分频系数 hrtc.Init.OutPut = RTC_OUTPUT_DISABLE; hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH; //输出信号的极性 hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN; //RTC输出引脚模式 if (HAL_RTC_Init(&hrtc) != HAL_OK) //初始化RTC外设 { Error_Handler(); } //判断读到的备份寄存器的值与写入的值是否一致 if(HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR0) != 0x32F2){ //设置RTC初始日期和时间 sTime.Hours = 0x17; //小时 sTime.Minutes = 0x30;//分钟 sTime.Seconds = 0x30;//秒 sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; sTime.StoreOperation = RTC_STOREOPERATION_RESET; if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK) { Error_Handler(); } sDate.WeekDay = RTC_WEEKDAY_THURSDAY; sDate.Month = RTC_MONTH_JANUARY; sDate.Date = 0x15; sDate.Year = 0x20; if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK) { Error_Handler(); }//向备份寄存器中写入数值 HAL_RTCEx_BKUPWrite(&hrtc,RTC_BKP_DR0,0x32F2); } if (HAL_RTCEx_SetWakeUpTimer(&hrtc,0,RTC_WAKEUPCLOCK_RTCCLK_DIV16)!= HAL_OK) { Error_Handler(); } }
HAL_StatusTypeDef HAL_RTC_GetTime(RTC_HandleTypeDef *hrtc,RTC_TimeTypeDef *sTime, uint32_t Format) { uint32_t tmpreg = 0U; /* 检查参数 */ assert_param(IS_RTC_FORMAT(Format)); /* 从对应的寄存器中获取亚秒值 */ sTime->SubSeconds = (uint32_t)(hrtc->Instance->SSR); /*从相应的寄存器字段中获取SecondFraction 结构字段*/ sTime->SecondFraction = (uint32_t)(hrtc->Instance->PRER & RTC_PRER_PREDIV_S); /* 获取TR寄存器 */ tmpreg = (uint32_t)(hrtc->Instance->TR & RTC_TR_RESERVED_MASK); /* 用读取的参数填充结构字段 */ sTime->Hours = (uint8_t)((tmpreg & (RTC_TR_HT | RTC_TR_HU)) >> 16U); sTime->Minutes = (uint8_t)((tmpreg & (RTC_TR_MNT | RTC_TR_MNU)) >> 8U); sTime->Seconds = (uint8_t)(tmpreg & (RTC_TR_ST | RTC_TR_SU)); sTime->TimeFormat = (uint8_t)((tmpreg & (RTC_TR_PM)) >> 16U); /* 检查输入参数格式 */ if(Format == RTC_FORMAT_BIN) { /* 将时间结构参数转换为二进制格式 */ sTime->Hours = (uint8_t)RTC_Bcd2ToByte(sTime->Hours); sTime->Minutes = (uint8_t)RTC_Bcd2ToByte(sTime->Minutes); sTime->Seconds = (uint8_t)RTC_Bcd2ToByte(sTime->Seconds); } return HAL_OK; }