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);
    }
    
STM32HAL库中的RTC是指实时时钟(Real-Time Clock),用于提供精确的时间和日期信息。在STM32HAL库中,可以使用一些函数来设置和获取RTC的参数。 引用\[1\]中提到了一些设置和获取RTC参数的函数。例如,使用HAL_RTC_GetDate函数可以获取RTC的日期参数,使用HAL_RTC_GetTime函数可以获取RTC的时间参数。而使用HAL_RTC_SetTime函数可以设置RTC的时间参数,使用HAL_RTC_SetDate函数可以设置RTC的日期参数。 引用\[2\]中提到了RTC寄存器的一些信息。RTC寄存器包含了秒、分钟、小时、星期几、日期、月份和年份等信息。此外,RTC还可以提供亚秒值,并且可以自动补偿月份的天数。 引用\[3\]中提到了RTC的复位过程。除了一些特定的寄存器外,其他系统寄存器都会在系统复位或电源复位时进行异步复位。而RTC的特定寄存器(RTC_PRL、RTC_ALR、RTC_CNT和RTC_DIV)只能通过备份域复位信号进行复位。 综上所述,STM32HAL库中的RTC提供了设置和获取时间日期参数的函数,并且有相应的寄存器来存储这些参数。在复位过程中,RTC的特定寄存器可以通过备份域复位信号进行复位。 #### 引用[.reference_title] - *1* [【STM32HAL库开发教程(五)—RTC使用](https://blog.csdn.net/weixin_44064233/article/details/108326975)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [STM32日历读取,设置和输出](https://blog.csdn.net/qq_45874317/article/details/121697122)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Liangtao`

请作者喝杯咖啡吧~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值