搜索

[活动专区] 【AT-START-F407测评】04 RTC驱动

[复制链接]
58|0
 楼主 | 2021-2-13 12:27 | 显示全部楼层 |阅读模式
本帖最后由 caizhiwei 于 2021-2-13 12:32 编辑

     用于片内集成RTC外设,可以用起来做时钟或者日历,今天它来了!

RTC简介
实时时钟是一个独立的定时器。 RTC 模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟
日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。
RTC 模块和时钟配置系统( RCC_BDC 寄存器)处于后备区域,即在系统复位或从待机模式唤醒后, RTC
的设置和时间维持不变。
系统复位后,对后备寄存器和
RTC 的访问被禁止,这是为了防止对后备区域(BRKP)的意外写操作。
执行以下操作将使能对后备寄存器和
RTC 的访问:
● 设置 寄存器
RCC_APB1ENPWRENBKPEN位, 使能电源和后 备接口时 钟
● 设置 寄存器
PWR_CTRLDBP位, 使能对后备寄 存器和RTC的 访问。


主要特性
可编程的预分频系数:分频系数最高为2^20。
32位的可编程计数器,可用于较长时间段的测量。
2个分离的时钟:用于APB1接口的PCLK1和RTC时钟( RTC时钟的频率必须小于PCLK1时
钟频率的四分之一以上)。
可以选择以下三种RTC的时钟源:
 HSE时钟除以128
 LSE振荡器时钟
 LSI振荡器时钟( 详见3.2.8RTC时钟
2个独立的复位类型:
 APB1接口由系统复位;
 RTC核心(预分频器、闹钟、计数器和分频器)只能由后备域复位(详见 3.1.3节)。
3个专门的可屏蔽中断:
 闹钟中断,用来产生一个软件可编程的闹钟中断。
 秒中断,用来产生一个可编程的周期性中断信号(最长可达 1秒)。
 溢出中断,指示内部可编程计数器溢出并回转为0的状态。


1. 初始化RTC,这里需要注意的是:通过读备份域寄存器来判断是否需要写入时间初始值,如果RTC电池没有断电,则跳过此。

初始化函数如下:

  1. /**
  2.   * [url=home.php?mod=space&uid=247401]@brief[/url]  RTC Init.
  3.   * @param  None
  4.   * @retval None
  5.   */
  6. void BSP_RTC_Init(void)
  7. {
  8.         /* Enable PWR and BKP clocks */
  9.         RCC_APB1PeriphClockCmd(RCC_APB1PERIPH_PWR | RCC_APB1PERIPH_BKP, ENABLE);

  10.         /* Allow access to BKP Domain */
  11.         PWR_BackupAccessCtrl(ENABLE);

  12.         /* Check Backup data registers is correct*/
  13.         if (BKP_ReadBackupReg(BKP_DT1) != 0x5051)
  14.         {
  15.                 /* Reset Backup Domain */
  16.                 BKP_Reset();        
  17.                 /* Enable the LSI OSC */
  18.                 RCC_LSEConfig(RCC_LSE_ENABLE);
  19.                 /* Wait till LSI is ready */
  20.                 while(RCC_GetFlagStatus(RCC_FLAG_LSESTBL) == RESET);
  21.                 /* Select the RTC Clock Source */
  22.                 RCC_RTCCLKConfig(RCC_RTCCLKSelection_LSE);
  23.                
  24.                 /* Enable RTC Clock */
  25.                 RCC_RTCCLKCmd(ENABLE);
  26.                 /* Wait for RTC registers synchronization */
  27.                 RTC_WaitForSynchro();
  28.                 /* Wait until last write operation on RTC registers has finished */
  29.                 RTC_WaitForLastTask();
  30.                
  31.                 /* Set RTC prescaler: set RTC period to 1sec */
  32.                 RTC_SetDIV(32767);
  33.                 /* Wait until last write operation on RTC registers has finished */
  34.                 RTC_WaitForLastTask();
  35.                
  36.                 /* Set the RTC time */
  37.                 BSP_RTC_Set(2020, 8, 8, 8, 8, 0);
  38.                 /* Wait until last write operation on RTC registers has finished */
  39.                 RTC_WaitForLastTask();
  40.                
  41.                 /* Writes data to Backup Register */
  42.                 BKP_WriteBackupReg(BKP_DT1, 0x5051);
  43.         }
  44.         else
  45.         {
  46.                 /* Wait for RTC registers synchronization */
  47.                 RTC_WaitForSynchro();
  48.                 /* Wait until last write operation on RTC registers has finished */
  49.                 RTC_WaitForLastTask();
  50.                 /* Clear RTC pending flag */
  51.                 RTC_ClearFlag(RTC_FLAG_PACE);
  52.                 /* Wait until last write operation on RTC registers has finished */
  53.                 RTC_WaitForLastTask();
  54.         }
  55. }                                                     
复制代码
2. 通过不断查询的方式,就可以获取时间了!

  1. void BSP_RTC_Time_Printf(void)
  2. {
  3.         if(RTC_GetFlagStatus(RTC_FLAG_PACE) != RESET)        
  4.         {
  5.                 /* Update current time */
  6.                 BSP_RTC_Get();
  7.                
  8.                 /* print the current time */
  9.                 printf("\r\n");
  10.                 printf("%d/%d/%d ", calendar.w_year, calendar.w_month, calendar.w_date);
  11.                 printf("%02d:%02d:%02d %s", calendar.hour, calendar.min, calendar.sec, weekday_table[calendar.week]);
  12.         
  13.                 /* Clear the RTC Second flag */
  14.                 RTC_ClearFlag(RTC_FLAG_PACE);
  15.                
  16.                 /* Wait until last write operation on RTC registers has finished */
  17.                 RTC_WaitForLastTask();
  18.         }
  19. }
复制代码


最后效果图如下:

QQ浏览器截图20210213122736.png
代码附件:
BSP.zip (2.75 KB, 下载次数: 1)

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 我要提问 投诉建议 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

在线客服 快速回复 返回顶部 返回列表