这是本文档旧的修订版!
银杏科技有限公司旗下技术文档发布平台 | |||
技术支持电话 | 0379-69926675-801 | ||
技术支持邮件 | Gingko@vip.163.com | ||
技术论坛 | http://www.eeschool.org | ||
版本 | 日期 | 作者 | 修改内容 |
---|---|---|---|
V1.0 | 2020-07-04 | gingko | 初次建立 |
int main(void) { RTC_TimeTypeDef sTime; RTC_DateTypeDef sDate; int second_bak = 0; /* MCU 配置 */ /* 重置所有外围设备,初始化Flash接口和Systick. */ HAL_Init(); /* 配置系统时钟 */ SystemClock_Config(); /* 初始化所有已配置的外围设备*/ MX_GPIO_Init(); MX_RTC_Init(); MX_USART6_UART_Init(); usart6.initialize(115200); //串口波特设置 usart6.printf("\x0c"); //清屏 usart6.printf("\033[1;32;40m"); //设置终端字体为绿色 usart6.printf(" Hello, I am iCore4!\r\n"); //串口信息输出 LED_GREEN_ON; //设置RTC日期和时间 my_rtc.set_date(17,8,11,5); my_rtc.set_time(17,43,20); /* 无限循环 */ while (1) { HAL_Delay(100); //读取RTC日期和时间 HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN); HAL_RTC_GetDate(&hrtc, &sDate, RTC_FORMAT_BIN); if(second_bak != sTime.Seconds){ usart6.printf(" %02d:%02d:%02d ",sTime.Hours,sTime.Minutes,sTime.Seconds); usart6.printf("20%02d-%02d-%02d \r",sDate.Year,sDate.Month,sDate.Date); second_bak = sTime.Seconds; } } }
void MX_RTC_Init(void) { RTC_TimeTypeDef sTime; RTC_DateTypeDef sDate; /**仅初始化RTC */ hrtc.Instance = RTC; hrtc.Init.HourFormat = RTC_HOURFORMAT_24;// RTC设置为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(__FILE__, __LINE__); } /**初始化RTC并设置时间和日期 */ if(HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR0) != 0x32F2){ sTime.Hours = 0x16;//小时 sTime.Minutes = 0x19;//分钟 sTime.Seconds = 0x0;//秒 sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; sTime.StoreOperation = RTC_STOREOPERATION_RESET; if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } sDate.WeekDay = RTC_WEEKDAY_MONDAY; sDate.Month = RTC_MONTH_AUGUST; sDate.Date = 0x7; sDate.Year = 0x0; if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } HAL_RTCEx_BKUPWrite(&hrtc,RTC_BKP_DR0,0x32F2); } /**使能唤醒 */ if (HAL_RTCEx_SetWakeUpTimer(&hrtc, 0, RTC_WAKEUPCLOCK_RTCCLK_DIV16) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } }
static int rtc_set_time(unsigned char hour,unsigned char min,unsigned char sec) { RTC_TimeTypeDef sTime; sTime.Hours = hour;//小时 sTime.Minutes = min; //分钟 sTime.Seconds = sec; //秒 sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; sTime.StoreOperation = RTC_STOREOPERATION_RESET; if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK) { while(1); } return 0; } static int rtc_set_date(unsigned char year,unsigned char month,unsigned char date,unsigned char week) { RTC_DateTypeDef sDate; sDate.WeekDay = week; //星期 sDate.Month = month; //月 sDate.Date = date; //日 sDate.Year = year; //年 if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK) { while(1); } return 0; }
/*获取RTC当前时间*/ HAL_StatusTypeDef HAL_RTC_GetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format) { uint32_t tmpreg = 0; /* 检查参数*/ 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)) >> 16); sTime->Minutes = (uint8_t)((tmpreg & (RTC_TR_MNT | RTC_TR_MNU)) >>8); sTime->Seconds = (uint8_t)(tmpreg & (RTC_TR_ST | RTC_TR_SU)); sTime->TimeFormat = (uint8_t)((tmpreg & (RTC_TR_PM)) >> 16); /* 检查输入参数格式 */ 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; } /*获取RTC当前日期*/ HAL_StatusTypeDef HAL_RTC_GetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format) { uint32_t datetmpreg = 0; /* 检查参数 */ assert_param(IS_RTC_FORMAT(Format)); /* 获取DR寄存器 */ datetmpreg = (uint32_t)(hrtc->Instance->DR & RTC_DR_RESERVED_MASK); /* 用读取的参数填充结构字段 */ sDate->Year = (uint8_t)((datetmpreg & (RTC_DR_YT | RTC_DR_YU)) >> 16); sDate->Month = (uint8_t)((datetmpreg & (RTC_DR_MT | RTC_DR_MU)) >> 8); sDate->Date = (uint8_t)(datetmpreg & (RTC_DR_DT | RTC_DR_DU)); sDate->WeekDay = (uint8_t)((datetmpreg & (RTC_DR_WDU)) >> 13); /* 检查输入参数格式 */ if(Format == RTC_FORMAT_BIN) { /* 将日期结构参数转换为二进制格式 */ sDate->Year = (uint8_t)RTC_Bcd2ToByte(sDate->Year); sDate->Month = (uint8_t)RTC_Bcd2ToByte(sDate->Month); sDate->Date = (uint8_t)RTC_Bcd2ToByte(sDate->Date); } return HAL_OK; }