STM32
直播中

王敏

7年用户 1474经验值
私信 关注
[问答]

怎样去使用基于HAL库函数的RTC实时时钟呢

怎样去使用基于HAL库函数的RTC实时时钟呢?有哪些操作步骤?

回帖(1)

余婧

2021-11-16 15:24:08
  一、MX配置
  1. 设置LSE
  
  2. 配置RTC
  
  - 激活时钟源
  - 激活日历
  - 配置2020年2月3日09:40:0 (HAL库的年份从2000年开始计算,Year变量可以填写0至99的数)
  3. 使能闹钟中断(本人使用的是STM32F103C8T6,貌似没有带唤醒的中断,L1和F4才有)
  
  4. 设置时钟树
  
  注:没有外部的RTC晶振的话,也可以选择内部的LSI时钟,之前的配置一致。
  二、软件生成的关键代码
  
  
  三、 用户代码
  1. 时间的设置及获取
  RTC_TimeTypeDef nTime;
  //设置时间 BCD
  nTime.Hours = 0x20;
  nTime.Minutes = 0x30;
  nTime.Seconds = 0x10;
  HAL_RTC_SetTime(&hrtc,&nTime,RTC_FORMAT_BCD);
  //或者2进制设置
  nTime.Hours = 20;
  nTime.Minutes = 30;
  nTime.Seconds = 10;
  HAL_RTC_SetTime(&hrtc,&nTime,RTC_FORMAT_BIN);
  //获取时间
  HAL_RTC_GetTime(&hrtc,&nTime,RTC_FORMAT_BIN);
  printf(“Time--%d:%d:%drn”,nTime.Hours,nTime.Minutes,nTime.Seconds);
  2. 定时中断
  RTC_AlarmTypeDef aTime;
  //设置闹钟
  aTime.Alarm = 0;
  aTime.AlarmTime.Hours = 0x09;
  aTime.AlarmTime.Minutes = 0x41;
  aTime.AlarmTime.Seconds = 0x0;
  HAL_RTC_SetAlarm_IT(&hrtc,&aTime,RTC_FORMAT_BCD);
  //回调函数
  void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *nhrtc) //句柄需要取新名避免与hrtc冲突
  {
  HAL_RTC_GetTime(nhrtc,&nTime,RTC_FORMAT_BIN);
  printf(“Alarm--%d:%d:%drn”,nTime.Hours,nTime.Minutes,nTime.Seconds);
  //以下的设置是实现每间隔1分钟响应一次中断--------------------
  nTime.Minutes+=1;
  if(nTime.Minutes==60)
  {
  nTime.Hours += 1;
  if(nTime.Hours == 24)
  {
  nTime.Hours = 0;
  }
  nTime.Minutes=0;
  }
  aTime.AlarmTime = nTime;
  HAL_RTC_SetAlarm_IT(&hrtc,&aTime,RTC_FORMAT_BIN);
  //--------------------------------------------------------
  }
  说明:闹钟中断如果没有修改,则会在每天定时响应一次中断。
  附:回调函数的配置方法
  1. 在stm32f1xx_it.c中找到对应的中断响应函数
  
  2. 选中函数后按F3 或者 右键点击 Open Declaration 跳转至该函数定义
  
  找到会被调用到的回调函数 HAL_RTC_AlarmAEventCallback(hrtc)
  可以继续探索下去,这个函数已经有定义,但在之前有 _ _ weak ,意味着用户有定义则覆盖。
  
  用户自定义和的回调函数结构就按照上图代码。需要去除__weak 以及 { } 内的内容。
举报

更多回帖

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