当前位置:   article > 正文

【蓝桥杯嵌入式】RTC——实时时钟_蓝桥杯rtc

蓝桥杯rtc

一、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
  • 配置日历

如有需要自习配置闹钟功能,在闹钟中断服务回调函数里进行代码编写。

  1. // 启动闹钟中断事件
  2. HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN);

 三、RTC时钟实验

  1. int main(void)
  2. {
  3. /* USER CODE BEGIN 1 */
  4. RTC_TimeTypeDef S_F_M;
  5. RTC_DateTypeDef N_Y_R;
  6. /* USER CODE END 1 */
  7. /* MCU Configuration--------------------------------------------------------*/
  8. /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  9. HAL_Init();
  10. /* USER CODE BEGIN Init */
  11. /* USER CODE END Init */
  12. /* Configure the system clock */
  13. SystemClock_Config();
  14. /* USER CODE BEGIN SysInit */
  15. /* USER CODE END SysInit */
  16. /* Initialize all configured peripherals */
  17. MX_GPIO_Init();
  18. MX_TIM3_Init();
  19. MX_TIM6_Init();
  20. MX_TIM17_Init();
  21. MX_RTC_Init();
  22. /* USER CODE BEGIN 2 */
  23. display_init();
  24. /* USER CODE END 2 */
  25. /* Infinite loop */
  26. /* USER CODE BEGIN WHILE */
  27. HAL_TIM_Base_Start_IT(&htim6);
  28. while (1)
  29. {
  30. HAL_RTC_GetTime(&hrtc,&S_F_M,RTC_FORMAT_BIN);
  31. HAL_RTC_GetDate(&hrtc,&N_Y_R,RTC_FORMAT_BIN);
  32. char text[30] ;
  33. sprintf(text," %d.%d.%d",S_F_M.Hours,S_F_M.Minutes,S_F_M.Seconds);//时间
  34. LCD_DisplayStringLine(Line2,(u8*)text);
  35. sprintf(text," %d.%d.%d",N_Y_R.Year,N_Y_R.Month,N_Y_R.Date);//日期
  36. LCD_DisplayStringLine(Line3,(u8*)text);
  37. sprintf(text," %d",N_Y_R.WeekDay);//星期几
  38. LCD_DisplayStringLine(Line4,(u8*)text);
  39. /* USER CODE END WHILE */
  40. /* USER CODE BEGIN 3 */
  41. }
  42. /* USER CODE END 3 */
  43. }

关键处:①两个结构体

  1. RTC_TimeTypeDef S_F_M;
  2. RTC_DateTypeDef N_Y_R;

 ②获取时间和日期(两个函数必须同时使用)

  1. HAL_RTC_GetTime(&hrtc,&S_F_M,RTC_FORMAT_BIN);
  2. HAL_RTC_GetDate(&hrtc,&N_Y_R,RTC_FORMAT_BIN);

四、实验现象

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/435728
推荐阅读
相关标签
  

闽ICP备14008679号