STM32CubeIDE HAL库函数操作RTC实时时钟 及 定时闹钟中断
目录
一、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:%d\r\n",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:%d\r\n",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 以及 { } 内的内容。