Skip to main content
Graduate
October 30, 2023
Solved

RTC Alarm on STM32F401RCT6

  • October 30, 2023
  • 4 replies
  • 3214 views

Hello, 

I've been using the RTC lately and it works correctly except for one thing, the alarm. 

Below you can see the function HAL generated

static void MX_RTC_Init(void)
{

 /* USER CODE BEGIN RTC_Init 0 */

 /* USER CODE END RTC_Init 0 */

 RTC_TimeTypeDef sTime = {0};
 RTC_DateTypeDef sDate = {0};
 RTC_AlarmTypeDef sAlarm = {0};

 /* USER CODE BEGIN RTC_Init 1 */
 /* USER CODE END RTC_Init 1 */
 /** Initialize RTC Only
 */
 hrtc.Instance = RTC;
 hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
 hrtc.Init.AsynchPrediv = 127;
 hrtc.Init.SynchPrediv = 255;
 hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
 hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
 hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
 if (HAL_RTC_Init(&hrtc) != HAL_OK)
 {
 Error_Handler();
 }

 /* USER CODE BEGIN Check_RTC_BKUP */

 /*if (HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR1) != 0xBEBE)
 {
 // Write Back Up Register 1 Data
 HAL_PWR_EnableBkUpAccess();

 // Writes a data in a RTC Backup data Register 1
 HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR1, 0xBEBE);
 } else {
	 //If there is a value in the backup register we dont need to set the RTC so we immediately exit the function
	 return;
 }*/
 /* USER CODE END Check_RTC_BKUP */

 /** Initialize RTC and set the Time and Date
 */
 sTime.Hours = 0;
 sTime.Minutes = 0;
 sTime.Seconds = 0;
 sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
 sTime.StoreOperation = RTC_STOREOPERATION_RESET;
 if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK)
 {
 Error_Handler();
 }
 sDate.WeekDay = RTC_WEEKDAY_MONDAY;
 sDate.Month = RTC_MONTH_JANUARY;
 sDate.Date = 1;
 sDate.Year = 0;

 if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK)
 {
 Error_Handler();
 }
 /** Enable the Alarm A
 */
 sAlarm.AlarmTime.Hours = 0;
 sAlarm.AlarmTime.Minutes = 0;
 sAlarm.AlarmTime.Seconds = 20;
 sAlarm.AlarmTime.SubSeconds = 0;
 sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
 sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET;
 sAlarm.AlarmMask = RTC_ALARMMASK_NONE;
 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();
 }
 /* USER CODE BEGIN RTC_Init 2 */
 /* USER CODE END RTC_Init 2 */

}

 

And here how i configured it in HAL 

Hesseltjuuh_0-1698702547947.png

Hesseltjuuh_1-1698702558649.png

 

 And here I set a breakpoint in the interrupt file:

Hesseltjuuh_2-1698702596937.png

 

    This topic has been closed for replies.
    Best answer by Sarra.S

    Hello again @Hesseltjuuh

    The RTC's current time and date should indeed match the alarm time and date.

    Please refer to this article which is made for seconds. 

    You should still  mask hours and days for it to work in the long run as @Tinnagit already said. 

     

     

    4 replies

    ST Employee
    October 31, 2023

    Hello @Hesseltjuuh

    Your configuration looks okay, could you specify more, what is the alarm issue exactly that you've observed? 

    Graduate
    October 31, 2023

    The problem is that it doesnt trigger an interrupt, i reset my RTC so the RTC and Alarm should match each other perfectly after i boot it on but it never triggers an interrupt.

    Graduate II
    October 31, 2023

    It's about Alarm Mask.
    Alarm Mask is used for ignore that field to compare with your alarm time.
    As your config, You have no mask in any field so RTC are going to alarm on every 0:0:20.000 on Monday.
    and If you want to alarm at second 20th every minute, you should try to mask in another field except second field.
    RTC is going to compare your alarm time in second field 20th to RTC time in second field and alarm if it matched.

    Graduate
    October 31, 2023

    I know but i also reset my RTC so the date and alarm should match without the masks. (i also tried it before with the masks enabled but didnt work either)

    Sarra.SAnswer
    ST Employee
    October 31, 2023

    Hello again @Hesseltjuuh

    The RTC's current time and date should indeed match the alarm time and date.

    Please refer to this article which is made for seconds. 

    You should still  mask hours and days for it to work in the long run as @Tinnagit already said. 

     

     

    Graduate
    January 27, 2024

    I too am having trouble with getting interrupts on seconds.   I have set two alarms, one for 00:00:00 on alarm A, and that works, toggling the LED, but the seconds alarm never fires.  I am guessing I have not set up the handlers correctly.  The NVIC is checked.  The above mentioned article appears to be a help, but I am not getting there.

     

    Here is my stm32l4xx_it.d

     

    void RTC_Alarm_IRQHandler(void)
    {
     /* USER CODE BEGIN RTC_Alarm_IRQn 0 */
    
     /* USER CODE END RTC_Alarm_IRQn 0 */
     HAL_RTC_AlarmIRQHandler(&hrtc);
     /* USER CODE BEGIN RTC_Alarm_IRQn 1 */
    
     /* USER CODE END RTC_Alarm_IRQn 1 */
    }
    
    /* USER CODE BEGIN 1 */
    
    
    
    
    void HAL_RTC_AlarmAEventCallback (RTC_HandleTypeDef *hrtc)
    {
    RTC_AlarmTypeDef sAlarm;
    
    	 HAL_GPIO_TogglePin(GPIOB, RED_LED_Pin); // turn red on
    	 HAL_RTC_SetAlarm_IT(hrtc, &sAlarm, FORMAT_BCD);
    }
    
    void HAL_RTC_AlarmBEventCallback(RTC_HandleTypeDef *hrtc)
    {
    	 RTC_AlarmTypeDef sAlarm;
    
    	 HAL_RTC_GetAlarm(hrtc,&sAlarm,RTC_ALARM_B,FORMAT_BCD);
    	 HAL_GPIO_TogglePin(GPIOB, BLUE_LED_Pin);
    	 HAL_Delay (100);
    	 HAL_GPIO_TogglePin(GPIOB, BLUE_LED_Pin);
    
    	 if(sAlarm.AlarmTime.Seconds>58)
    	 {
    	 sAlarm.AlarmTime.Seconds=0;
    	 }
    	 else
    	 {
    	 sAlarm.AlarmTime.Seconds=sAlarm.AlarmTime.Seconds+1;
    	 }
    
    	 HAL_RTC_SetAlarm_IT(hrtc, &sAlarm, FORMAT_BCD); // prime it for the next second
    }
    /* USER CODE END 1 */

       

    Attached are my alarm configureations.  I tried the seconds mask both ways, enabled and disabled with no difference.

    pic2.PNGpic1.PNG