一、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
- 配置日历
如有需要自习配置闹钟功能,在闹钟中断服务回调函数里进行代码编写。
// 启动闹钟中断事件HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN);
三、RTC时钟实验
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 */
}
关键处:①两个结构体
RTC_TimeTypeDef S_F_M;RTC_DateTypeDef N_Y_R;
②获取时间和日期(两个函数必须同时使用)
HAL_RTC_GetTime(&hrtc,&S_F_M,RTC_FORMAT_BIN);HAL_RTC_GetDate(&hrtc,&N_Y_R,RTC_FORMAT_BIN);