stm32HAL库 RTC配置并设置闹钟间隔响铃(思路+具体方法)

stm32 RTC配置并设置闹钟间隔响铃

为了实现stm32的每隔一定时间RTC闹钟响铃一次,使用了一种笨方法,基本思路是:在RTC闹钟中断获取当前时间,并且修改下一次闹钟中断时间为当前时间+需要定时的时间 如果有更好的思路请一定告知我,呜呜呜~。

RTC基本配置

在stm32 cubeMX中RTC部分做如下配置。时钟配置为外部32.768Khz高精度晶振。
在这里插入图片描述
激活时钟源,激活日历功能。
在这里插入图片描述
同步预分频值异步预分频值是根晶振大小有关系的。这里我的板子使用的是32.768KHz的高精度晶振,定时时间为1秒,根据定时频率=晶振频率 / (异步预分频值 + 1) / (同步预分频值 + 1) : 1Hz = 32.768KHz / (127 + 1) / (255 + 1), 因此填入127与255。数据格式为BCD格式,日历时间啥的更具需要设置。在闹钟设置当中,将Alarm Mask Date Week day设置为enable,这样设置闹钟每天都会响,而不会只是设置的那一天才响,下面的alarm date week day sel 和 alarm date将无效
在这里插入图片描述
使能RTC中断。
在这里插入图片描述

间隔定时

  1. 首先实现一定时函数,传入的参数为具体的时间,比如13点30分30秒。

    void RTC_Set_AlarmA(uint8_t hour,uint8_t min,uint8_t sec)
    {
          
          
    	/** Enable the Alarm A
      */
    	RTC_AlarmTypeDef sAlarm = {
          
          0};
    	
      sAlarm.AlarmTime.Hours = hour;
      sAlarm.AlarmTime.Minutes = min;
      sAlarm.AlarmTime.Seconds = sec;
      sAlarm.AlarmTime.SubSeconds = 0;
      sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
      sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET;
      sAlarm.AlarmMask = RTC_ALARMMASK_DATEWEEKDAY;
      sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_ALL;
      sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;
      sAlarm.AlarmDateWeekDay = 1;
      sAlarm.Alarm = RTC_ALARM_A;
      if (HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) != HAL_OK) //重新设置定时中断
      {
          
          
        Error_Handler();
      }
    }
    
  2. 实现一个间隔定时的函数,只能在RTC中断回调函数中使用,传入参数为含义为 下一次响铃为多久之后及间隔时长首先先获取当前时间,然后加上需要间隔的时间,最后调用RTC_Set_AlarmA设置闹钟。

    /**
    	* @note 只能在RTC 闹钟回调函数中调用
    	*/
    void RTC_SetAlarmFrec(uint8_t hour, uint8_t min, uint8_t sec)
    {
          
          
    	uint8_t h=0,m=0,s=0;
    	RTC_TimeTypeDef gTime = {
          
          0};
    	RTC_DateTypeDef gDate = {
          
          0};
    	HAL_RTC_GetTime(&hrtc, &gTime, RTC_FORMAT_BIN);
    	HAL_RTC_GetDate(&hrtc, &gDate, RTC_FORMAT_BIN);
    	if ( (s = (sec + gTime.Seconds) ) > 59 )
    	{
          
          
    		s = s % 60 ;
    		++ gTime.Minutes;
    	}
    	if ( (m = (min + gTime.Minutes) ) > 59 )
    	{
          
          
    		m = m % 60 ;
    		++ gTime.Hours;
    	}
    	if ( (h = (hour + gTime.Hours) ) > 23 )
    	{
          
          
    		h = h % 24 ;
    	}
    	//printf("set time: %d: %d: %d\r\n", h, m, s);
    	RTC_Set_AlarmA( h, m, s);
    }
    
  3. 最后在中断回调函数中调用,如下设置,闹钟将会每一小时响铃一次。

    #define alarm_hour 1
    #define alarm_min  0
    #define alarm_sec  0
    void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
    {
          
          
    	RTC_SetAlarmFrec(alarm_hour, alarm_min, alarm_sec);
    }
    

猜你喜欢

转载自blog.csdn.net/qq_27350133/article/details/114783756