STM32CubeIDE HAL库函数操作RTC实时时钟 及 定时闹钟中断

目录

一、MX配置

二、软件生成的关键代码

三、 用户代码

附:回调函数的配置方法


一、MX配置

1. 设置LSE

 

2. 配置RTC

- 激活时钟源

- 激活日历

- 配置2020年2月3日09:40:0 (HAL库的年份从2000年开始计算,Year变量可以填写0至99的数)

3. 使能闹钟中断(本人使用的是STM32F103C8T6,貌似没有带唤醒的中断,L1和F4才有)

4. 设置时钟树

注:没有外部的RTC晶振的话,也可以选择内部的LSI时钟,之前的配置一致。

二、软件生成的关键代码

三、 用户代码

1. 时间的设置及获取

  1. RTC_TimeTypeDef nTime;
  2. //设置时间 BCD
  3. nTime.Hours = 0x20;
  4. nTime.Minutes = 0x30;
  5. nTime.Seconds = 0x10;
  6. HAL_RTC_SetTime(&hrtc,&nTime,RTC_FORMAT_BCD);
  7. //或者2进制设置
  8. nTime.Hours = 20;
  9. nTime.Minutes = 30;
  10. nTime.Seconds = 10;
  11. HAL_RTC_SetTime(&hrtc,&nTime,RTC_FORMAT_BIN);
  12. //获取时间
  13. HAL_RTC_GetTime(&hrtc,&nTime,RTC_FORMAT_BIN);
  14. printf("Time--%d:%d:%d\r\n",nTime.Hours,nTime.Minutes,nTime.Seconds);

2. 定时中断

  1. RTC_AlarmTypeDef aTime;
  2. //设置闹钟
  3. aTime.Alarm = 0;
  4. aTime.AlarmTime.Hours = 0x09;
  5. aTime.AlarmTime.Minutes = 0x41;
  6. aTime.AlarmTime.Seconds = 0x0;
  7. HAL_RTC_SetAlarm_IT(&hrtc,&aTime,RTC_FORMAT_BCD);
  8. //回调函数
  9. void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *nhrtc) //句柄需要取新名避免与hrtc冲突
  10. {
  11. HAL_RTC_GetTime(nhrtc,&nTime,RTC_FORMAT_BIN);
  12. printf("Alarm--%d:%d:%d\r\n",nTime.Hours,nTime.Minutes,nTime.Seconds);
  13. //以下的设置是实现每间隔1分钟响应一次中断--------------------
  14. nTime.Minutes+=1;
  15. if(nTime.Minutes==60)
  16. {
  17. nTime.Hours += 1;
  18. if(nTime.Hours == 24)
  19. {
  20. nTime.Hours = 0;
  21. }
  22. nTime.Minutes=0;
  23. }
  24. aTime.AlarmTime = nTime;
  25. HAL_RTC_SetAlarm_IT(&hrtc,&aTime,RTC_FORMAT_BIN);
  26. //--------------------------------------------------------
  27. }

说明:闹钟中断如果没有修改,则会在每天定时响应一次中断。

附:回调函数的配置方法

1. 在stm32f1xx_it.c中找到对应的中断响应函数

2. 选中函数后按F3 或者 右键点击 Open Declaration 跳转至该函数定义

找到会被调用到的回调函数 HAL_RTC_AlarmAEventCallback(hrtc)

可以继续探索下去,这个函数已经有定义,但在之前有 _ _ weak ,意味着用户有定义则覆盖。

用户自定义和的回调函数结构就按照上图代码。需要去除__weak 以及 { } 内的内容。

posted @ 2023-07-21 08:34  SymPny  阅读(1678)  评论(0编辑  收藏  举报