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. 时间的设置及获取

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 以及 { } 内的内容。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章