一、RTC简介
RTC
RTC---real time clock,实时时钟,主要包含日历、闹钟和自动唤醒这三部分的功能,其中的日历功能我们使用的最多。日历包含两个32bit的时间寄存器,可直接输出时分秒,星期、月、日、年。
从Cubemx里的配置选项我们也可以看到功能。
时钟源
- 其中使用最多的是LSE,LSE由一个外部的32.768KHZ(6PF负载)的晶振提供,精度高,稳定,RTC首选。
- LSI是芯片内部的30KHZ晶体,精度较低,会有温漂,一般不建议使用。
- HSE_RTC由HSE分频得到,最高是750khz,使用的也较少。
因为我们的竞赛板子上只有HSE和LSI,并未连接LSE,所以我们这里选用LSI作为时钟源。
预分频器
预分频器PRER由7位的异步预分频器APRE和15位的同步预分频器SPRE组成。异步预分频器时钟CK_APRE用于为二进制 RTC_SSR 亚秒递减计数器提供时钟,同步预分频器时钟CK_SPRE用于更新日历。 异步预分频器时钟fCK_APRE=fRTC_CLK/(PREDIV_A+1), 同步预分频器时钟f:sub:CK_SPRE=fRTC_CLK/(PREDIV_S+1),)。 使用两个预分频器时,推荐将异步预分频器配置为较高的值,以最大程度降低功耗。
二、cubemx配置
模式和时钟源的配置上面已经展示,在此不作展示
- 配置12小时制还是24小时制
- 配置异步预分频器APRE和15位的同步预分频器SPRE
- 配置日历
如有需要自习配置闹钟功能,在闹钟中断服务回调函数里进行代码编写。
cpp
// 启动闹钟中断事件
HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN);
三、RTC时钟实验
cpp
int main(void)
{
/* USER CODE BEGIN 1 */
RTC_TimeTypeDef S_F_M;
RTC_DateTypeDef N_Y_R;
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_TIM3_Init();
MX_TIM6_Init();
MX_TIM17_Init();
MX_RTC_Init();
/* USER CODE BEGIN 2 */
display_init();
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
HAL_TIM_Base_Start_IT(&htim6);
while (1)
{
HAL_RTC_GetTime(&hrtc,&S_F_M,RTC_FORMAT_BIN);
HAL_RTC_GetDate(&hrtc,&N_Y_R,RTC_FORMAT_BIN);
char text[30] ;
sprintf(text," %d.%d.%d",S_F_M.Hours,S_F_M.Minutes,S_F_M.Seconds);//时间
LCD_DisplayStringLine(Line2,(u8*)text);
sprintf(text," %d.%d.%d",N_Y_R.Year,N_Y_R.Month,N_Y_R.Date);//日期
LCD_DisplayStringLine(Line3,(u8*)text);
sprintf(text," %d",N_Y_R.WeekDay);//星期几
LCD_DisplayStringLine(Line4,(u8*)text);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
关键处:①两个结构体
cpp
RTC_TimeTypeDef S_F_M;
RTC_DateTypeDef N_Y_R;
②获取时间和日期(两个函数必须同时使用)
cpp
HAL_RTC_GetTime(&hrtc,&S_F_M,RTC_FORMAT_BIN);
HAL_RTC_GetDate(&hrtc,&N_Y_R,RTC_FORMAT_BIN);