STM32
直播中

jefljel

8年用户 1103经验值
擅长:20762
私信 关注
[问答]

如何去使用STM32的实时时钟RTC呢

实时时钟RTC是什么?

如何去使用STM32的实时时钟RTC呢?有哪些注意事项?

回帖(1)

李可熠

2021-11-22 10:38:15
  一、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 软件,点击“新建工程”
  
  2. 选择 MCU 和封装
  
  3. 配置时钟
  RCC 设置,选择 HSE(外部高速时钟) 为 Crystal/Ceramic Resonator(晶振/陶瓷谐振器)
  开启 LSE(外部低速时钟) 为 Crystal/Ceramic Resonator(晶振/陶瓷谐振器)
  
  选择 Clock Configuration,配置系统时钟 SYSCLK 为 72MHz
  修改 HCLK 的值为 72 后,输入回车,软件会自动修改所有配置
  
  4. 配置调试模式
  非常重要的一步,否则会造成第一次烧录程序后续无法识别调试器
  SYS 设置,选择 Debug 为 Serial Wire
  
  三、RTC
  3.1 选择时钟
  选择 Clock Configuration,RTC 时钟选择为 外部低速晶振(LSE),频率为 32.768KHz。
  RTC 设备因为其独特的运行方式(即掉电依旧运行)使用 HSE 分频时钟或者 LSI 的时候,在主电源 VDD 掉电的情况下,这两个时钟来源都会受到影响,资源消耗太大,小小的纽扣电池根本吃不消。没法保证 RTC 正常工作。所以 RTC 一般都时钟低速外部时钟 LSE。
  
  3.2 参数配置
  在 Timers 中选择 RTC 设置,并勾选 Activate Clock Source 激活时钟源,勾选 Activate Calendar 激活万年历。
  
  RTC OUT:Disable(是否使能 tamper(PC13)引脚上输出校正的秒脉冲时钟)
  Tamper:不勾选(是否使能tamper(PC13)引脚作为入侵检测功能)
  RTC校验功能,使能侵入检测功能。RTC时钟经64分频输出到侵入检测引脚TAMPER上
  当 TAMPER引脚上的信号从 0变成1或者从 1变成 0(取决于备份控制寄存器BKP_CR的 TPAL位),会产生一个侵入检测事件。侵入检测事件将所有数据备份寄存器内容清除。
  在 Parameter Settings 进行具体参数配置。
  
  Calendar Time
  Data Format(日期格式):BCD data format
  HAL库是否存在BUG待验证
  
  Hours(小时)
  Minutes(分钟)
  Seconds(秒)
  Calendat Date
  Week Day(星期)
  Month(月份)
  Date(日期)
  Year(年份)
  3.3 生成代码
  输入项目名和项目路径
  
  选择应用的 IDE 开发环境 MDK-ARM V5
  
  每个外设生成独立的 ’.c/.h’ 文件
  不勾:所有初始化代码都生成在 main.c
  勾选:初始化代码生成在对应的外设文件。 如 GPIO 初始化代码生成在 gpio.c 中。
  
  点击 GENERATE CODE 生成代码
  
  3.4 添加全局变量
  在 main.c 头部添加 RTC 相关结构体 GetData 和 GetTime
  /* 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/%02drn”,2000 + GetData.Year, GetData.Month, GetData.Date);
  /* Display time Format : hh:mm:ss */
  printf(“%02d:%02d:%02drn”,GetTime.Hours, GetTime.Minutes, GetTime.Seconds);
  printf(“rn”);
  HAL_Delay(1000);
  /* USER CODE END WHILE */
  /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
  }
  3.6 查看打印
  
  四、注意事项
  用户代码要加在 USER CODE BEGIN N 和 USER CODE END N 之间,否则下次使用 STM32CubeMX 重新生成代码后,会被删除。
  
举报

更多回帖

发帖
×
20
完善资料,
赚取积分