您现在的位置是:首页 >其他 >夜深人静学32系列16——RTC实时时钟网站首页其他

夜深人静学32系列16——RTC实时时钟

不想写代码的我 2024-07-04 11:18:00
简介夜深人静学32系列16——RTC实时时钟

RTC

什么是RTC?

RTC(Real Time Clock):实时时钟

RTC是个独立的定时器。RTC模块拥有一个连续计数的计数器,在相应的软件配置下,可以提供时钟日历的功能。修改计数器的值可以重新设置当前时间和日期。

简单来说,RTC是一个特殊的定时器,通常作为闹钟、日历、以及定时自动唤醒功能。这一期我们来讲以下RTC的闹钟功能

RTC结构框图

在这里插入图片描述
以上是RTC使用时钟功能的部分结构框图,具体流程如下:

  1. 选择时钟源,我们通常使用LSE(32.768KHz)
  2. 对时钟源进行分频得到1Hz的频率,通常设置异步分频器为128分频,同步分频器为256分频。
  3. 每来一个时钟信号,时间加增加,当时间寄存器的值与闹钟寄存器的值相同时,产生中断。

注意:这里我们不需要对时间的进位进行计算,只需要控制计数器的时钟信号为1Hz即可保证RTC准确走时。

关于RTC的基本知识,我们这里不做介绍,大家可以自行学习
下面我们来讲讲CubeMX的配置

CubeMX配置

  1. 首先我们要在RCC选项开启LSE(外部低速晶振)
    在这里插入图片描述

  2. 开启RTC
    在这里插入图片描述

  3. 配置 RTC
    在这里插入图片描述

  4. 时钟配置
    在这里插入图片描述

以上就是RTC的配置过程,接下来是代码的配置过程:

RTC代码配置

  1. RTC基本驱动步骤
    在这里插入图片描述
  2. RTC闹钟配置
    在这里插入图片描述

实战——简易时钟

任务要求

  • 通过实现NANO板上的RTC功能,设计一个简易时钟,
  • 闹钟要求具有闹钟功能,当到达闹钟设置时间是,执行相应动作
  • 通过串口打印相印信息,1s打印一次

代码实现

1. main函数

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* 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_RTC_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
      HAL_RTC_GetDate(&hrtc,&GET_Date,RTC_FORMAT_BIN);      //获取日期
  printf("%02d/%02d/%02d
",2000 + GET_Date.Year,GET_Date.Month,GET_Date.Date);   //打印日期
       HAL_RTC_GetTime(&hrtc,&GET_Time,RTC_FORMAT_BIN);     //获取时间
      printf("%02d:%02d:%02d
",GET_Time.Hours,GET_Time.Minutes,GET_Time.Seconds);    //打印时间
      printf("
");       //换行
  HAL_Delay(1000);          //1s执行一次以上内容
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

2 . 闹钟事件中断服务函数

void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
{
   if(hrtc->Instance == RTC)
   {

    printf("CLOCK_EVENT");
   }       
}

实验结果

在这里插入图片描述

以上就是RTC闹钟的全部内容…………

补充

唤醒功能配置

在这里插入图片描述
这里是设置每10s触发一次唤醒中断。

在这里插入图片描述
在这里插入图片描述

代码如下:

编写如下中断服务函数,即可在唤醒中断执行相应动作。

void   HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc)
{
         printf("WKUP_EVENT");
}
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。