STM32CubeMX学习笔记(14)——RTC实时时钟使用

一、RTC简介

实时时钟(RTC) 是一个独立的 BCD 定时器/计数器。 RTC 提供具有可编程闹钟中断功能的日历时钟/日历。RTC 还包含具有中断功能的周期性可编程唤醒标志。两个 32 位寄存器包含二进码十进数格式 (BCD) 的秒、分钟、小时( 12 或 24 小时制)、星期几、日期、月份和年份。此外,还可提供二进制格式的亚秒值。系统可以自动将月份的天数补偿为 28、29(闰年)、30 和 31 天。只要芯片的备用电源一直供电,RTC上的时间会一直走。

STM32 的 RTC 外设(Real Time Clock),实质是一个掉电后还继续运行的定时器。从定时器的角度来说,相对于通用定时器 TIM 外设,它十分简单,只有很纯粹的计时和触发中断的功能;但从掉电还继续运行的角度来说,它却是 STM32 中唯一一个具有如此强大功能的外设。所以 RTC 外设的复杂之处并不在于它的定时功能,而在于它掉电还继续运行的特性。在主电源 VDD有效的情况下(待机),RTC 还可以配置闹钟事件使 STM32 退出待机模式。

二、新建工程

1. 打开 STM32CubeMX 软件,点击“新建工程”
STM32CubeMX学习笔记(14)——RTC实时时钟使用

2. 选择 MCU 和封装
STM32CubeMX学习笔记(14)——RTC实时时钟使用

3. 配置时钟
RCC 设置,选择 HSE(外部高速时钟) 为 Crystal/Ceramic Resonator(晶振/陶瓷谐振器)
开启 LSE(外部低速时钟) 为 Crystal/Ceramic Resonator(晶振/陶瓷谐振器)
STM32CubeMX学习笔记(14)——RTC实时时钟使用
选择 Clock Configuration,配置系统时钟 SYSCLK 为 72MHz
修改 HCLK 的值为 72 后,输入回车,软件会自动修改所有配置
STM32CubeMX学习笔记(14)——RTC实时时钟使用

4. 配置调试模式
非常重要的一步,否则会造成第一次烧录程序后续无法识别调试器
SYS 设置,选择 Debug 为 Serial Wire
STM32CubeMX学习笔记(14)——RTC实时时钟使用

三、RTC

3.1 选择时钟

选择 Clock Configuration,RTC 时钟选择为 外部低速晶振(LSE),频率为 32.768KHz。

RTC 设备因为其独特的运行方式(即掉电依旧运行)使用 HSE 分频时钟或者 LSI 的时候,在主电源 VDD 掉电的情况下,这两个时钟来源都会受到影响,资源消耗太大,小小的纽扣电池根本吃不消。没法保证 RTC 正常工作.所以 RTC 一般都时钟低速外部时钟 LSE。

STM32CubeMX学习笔记(14)——RTC实时时钟使用

3.2 参数配置

Timers 中选择 RTC 设置,并勾选 Activate Clock Source 激活时钟源,勾选 Activate Calendar 激活万年历。
STM32CubeMX学习笔记(14)——RTC实时时钟使用

  • RTC OUT:Disable(是否使能 tamper(PC13)引脚上输出校正的秒脉冲时钟)
  • Tamper:不勾选(是否使能tamper(PC13)引脚作为入侵检测功能)

RTC校验功能,使能侵入检测功能。RTC时钟经64分频输出到侵入检测引脚TAMPER上
当 TAMPER引脚上的信号从 0变成1或者从 1变成 0(取决于备份控制寄存器BKP_CR的 TPAL位),会产生一个侵入检测事件。侵入检测事件将所有数据备份寄存器内容清除。

Parameter Settings 进行具体参数配置。
STM32CubeMX学习笔记(14)——RTC实时时钟使用

  • Calendar Time
  • Data Format(日期格式):BCD data format
    HAL库是否存在BUG待验证
    STM32CubeMX学习笔记(14)——RTC实时时钟使用
  • Hours(小时)
  • Minutes(分钟)
  • Seconds(秒)
  • Calendat Date
  • Week Day(星期)
  • Month(月份)
  • Date(日期)
  • Year(年份)

3.3 生成代码

输入项目名和项目路径
STM32CubeMX学习笔记(14)——RTC实时时钟使用
选择应用的 IDE 开发环境 MDK-ARM V5
STM32CubeMX学习笔记(14)——RTC实时时钟使用
每个外设生成独立的 ’.c/.h’ 文件
不勾:所有初始化代码都生成在 main.c
勾选:初始化代码生成在对应的外设文件。 如 GPIO 初始化代码生成在 gpio.c 中。
STM32CubeMX学习笔记(14)——RTC实时时钟使用
点击 GENERATE CODE 生成代码
STM32CubeMX学习笔记(14)——RTC实时时钟使用

3.4 添加全局变量

main.c 头部添加 RTC 相关结构体 GetDataGetTime

/* Private variables ---------------------------------------------------------*/
RTC_HandleTypeDef hrtc;

UART_HandleTypeDef huart1;

/* USER CODE BEGIN PV */
RTC_DateTypeDef GetData;  //获取日期结构体
RTC_TimeTypeDef GetTime;   //获取时间结构体
/* USER CODE END PV */

3.5 添加读取时间函数

在while循环中添加:

/**
  * @brief  The application entry point.
  * @retval int
  */
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_USART1_UART_Init();
  MX_RTC_Init();
  /* USER CODE BEGIN 2 */
  
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* Get the RTC current Time */
    HAL_RTC_GetTime(&hrtc, &GetTime, RTC_FORMAT_BIN);
    /* Get the RTC current Date */
    HAL_RTC_GetDate(&hrtc, &GetData, RTC_FORMAT_BIN);

    /* Display date Format : yy/mm/dd */
    printf("%02d/%02d/%02d\r\n",2000 + GetData.Year, GetData.Month, GetData.Date);
    /* Display time Format : hh:mm:ss */
    printf("%02d:%02d:%02d\r\n",GetTime.Hours, GetTime.Minutes, GetTime.Seconds);

    printf("\r\n");

    HAL_Delay(1000);

    /* USER CODE END WHILE */

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

3.6 查看打印

串口打印功能查看 STM32CubeMX学习笔记(6)——USART串口使用
STM32CubeMX学习笔记(14)——RTC实时时钟使用

四、注意事项

用户代码要加在 USER CODE BEGIN NUSER CODE END N 之间,否则下次使用 STM32CubeMX 重新生成代码后,会被删除。
STM32CubeMX学习笔记(14)——RTC实时时钟使用


• 由 Leung 写于 2021 年 2 月 4 日

• 参考:STM32CubeMX系列教程13:实时时钟(RTC)
    【STM32】HAL库 STM32CubeMX教程十三—RTC时钟

上一篇:解决Ubuntu(20.04)和Windows10双系统时间不同步问题


下一篇:资源介绍