嵌入式(3)——RTC实时时钟
RTC
RTC简介:
RTC(Real Time Clock)实时时钟,本质是一个定时器
RTC是一个独立的定时器,可为系统提供时钟和日历的功能 RTC和时钟配置系统处于后备区域,系统复位时数据不清零,VDD(2.0~3.6V)断电后可借助VBAT(1.8~3.6V)供电继续走时
实时时钟是一个独立的定时器。RTC模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。
RTC模块和时钟配置系统(RCC_BDCR寄存器)处于后备区域,即在系统复位或从待机模式唤醒后,RTC的设置和时间维持不变。
RTC控制的寄存器操作:
系统复位后,对后备寄存器和RTC的访问被禁止,这是为了防止对后备区域(BKP)的意外写操作。执行以下操作将使能对后备寄存器和RTC的访问:
● 设置寄存器RCC_APB1ENR的PWREN和BKPEN位,使能电源和后备接口时钟
● 设置寄存器PWR_CR的DBP位,使能对后备寄存器和RTC的访问。
主要特性
● 可编程的预分频系数:分频系数最高为220。
● 32位的可编程计数器,可用于较长时间段的测量。
● 2个分离的时钟:用于APB1接口的PCLK1和RTC时钟(RTC时钟的频率必须小于PCLK1时钟
频率的四分之一以上)。
● 可以选择以下三种RTC的时钟源:
─ HSE时钟除以128;
─ LSE振荡器时钟;
─ LSI振荡器时钟
● 2个独立的复位类型:(RTC复位具有独立的复位系统)
─ APB1接口由系统复位;
─ RTC核心(预分频器、闹钟、计数器和分频器)只能由后备域复位
● 3个专门的可屏蔽中断:
─ 闹钟中断,用来产生一个软件可编程的闹钟中断。
─ 秒中断,用来产生一个可编程的周期性中断信号(最长可达1秒)。
─ 溢出中断,指示内部可编程计数器溢出并回转为0的状态。
RTC代码实现:
在设置RTC时:系统默认的设置功能中(见下面if语句),在控制电路复位(非后备区复位)过程中RTC的计数器会被重新设置到初始值,所以在实现RTC实时计数功能的情况下,要注释掉HAL库中的if语句
sTime.Hours = 9;sTime.Minutes = 3;sTime.Seconds = 0;// if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK)
// {
// Error_Handler();
// }DateToUpdate.WeekDay = RTC_WEEKDAY_SATURDAY;DateToUpdate.Month = RTC_MONTH_SEPTEMBER;DateToUpdate.Date = 20;DateToUpdate.Year = 25;// if (HAL_RTC_SetDate(&hrtc, &DateToUpdate, RTC_FORMAT_BIN) != HAL_OK)
// {
// Error_Handler();
// }
通过串口实现RTC实时时钟的数据传输
while (1){char buf[40];extern _calendar_obj calendar;rtc_get_time();sprintf(buf,"%02d %02d %02d\r\n",calendar.year,calendar.month,calendar.date);HAL_UART_Transmit(&huart1,(uint8_t *)buf,strlen(buf),1000);sprintf(buf,"%02d:%02d:%02d\r\n",calendar.hour,calendar.min,calendar.sec);HAL_UART_Transmit(&huart1,(uint8_t *)buf,strlen(buf),1000);HAL_Delay(1000);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}
但是!RTC在日历方面无法做到实时的跟进,因此需要软件实现重新校准日期:
(对寄存器的数据进行比较,从而进行日期的重设置)
if(HAL_RTCEx_BKUPRead(&hrtc,RTC_BKP_DR1) != 0x55){rtc_set_time(2025,9,20,10,26,50);HAL_RTCEx_BKUPWrite(&hrtc,RTC_BKP_DR1,0X55);}
RTC软件实现附件如附件