2024-06-17 09:32 AM - edited 2024-06-17 09:33 AM
Hello everyone,
I am using an STM32L152RE board to generate a delay using the RTC as a timer. I would like the onboard LED to blink every 10 seconds. I have tried using a delay via a timer and am now trying to implement the same functionality using the internal RTC.
I have configured all the ports and selected the appropriate clock, i.e., LSE. Below, I have attached the main file. Although the RTC is running, there is no change in the LED. Can you please help me with this issue?
Thank you,
Solved! Go to Solution.
2024-06-20 05:03 AM - edited 2024-06-20 05:03 AM
@AnanyaRavi29 Try this callback function it will work for you, (it correctly handles the overflow of seconds by wrapping around):
void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc) {
RTC_AlarmTypeDef sAlarm;
HAL_RTC_GetAlarm(hrtc, &sAlarm, RTC_ALARM_A, FORMAT_BIN);
/* Increment the alarm by 10 seconds */
sAlarm.AlarmTime.Seconds += 10;
if (sAlarm.AlarmTime.Seconds >= 58) {
sAlarm.AlarmTime.Seconds -= 58;
}
/* Reset the alarm to trigger again after 10 seconds */
while (HAL_RTC_SetAlarm_IT(hrtc, &sAlarm, FORMAT_BIN) != HAL_OK) {}
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
}
___________________________________________________________________________________________
Kudo posts if you have the same problem and kudo replies if the solution works.
Click "Accept as Solution" if a reply solved your problem. If no solution was posted please answer with your own.
2024-06-19 02:27 AM
Hello @AnanyaRavi29 and welcome to the Community
Could you please take a look at Getting started with RTC - stm32mcu and get inspired to configure the RTC.
This article explains how to use the RTC. It provides code examples to use RTC Alarm with interrupt and toggles led every 1 second.
I hope this help you!
Thank you.
Kaouthar
To give better visibility on the answered topics, please click on Accept as Solution on the reply which solved your issue or answered your question.
2024-06-20 03:40 AM
Hello Kaouthar,
I tried this pls.Its still not toggling the LED. WHat could be the issue pls?
2024-06-20 04:04 AM
You are not following the example.
You set date to may 40th **36. Never use hex numbers when decimal numbers make more sense. I would write 2024%100. If you set the masks correctly and set the alarm in the future it will trigger once or it will retrigger again depending on the masks.
The example sets the alarm again in the interrupt. You initialize the entire RTC again.
Enable interrupts in STM32CubeMX and follow the example. It should work. Certainly if you say the RTC is running.
2024-06-20 04:25 AM
Did you tried the exact code for toggling the LED for exactly 1 second, as provided in the "Getting started with RTC " guide on the STM32 MCU website. I think you may have missed some steps.
2024-06-20 04:28 AM
2024-06-20 05:03 AM - edited 2024-06-20 05:03 AM
@AnanyaRavi29 Try this callback function it will work for you, (it correctly handles the overflow of seconds by wrapping around):
void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc) {
RTC_AlarmTypeDef sAlarm;
HAL_RTC_GetAlarm(hrtc, &sAlarm, RTC_ALARM_A, FORMAT_BIN);
/* Increment the alarm by 10 seconds */
sAlarm.AlarmTime.Seconds += 10;
if (sAlarm.AlarmTime.Seconds >= 58) {
sAlarm.AlarmTime.Seconds -= 58;
}
/* Reset the alarm to trigger again after 10 seconds */
while (HAL_RTC_SetAlarm_IT(hrtc, &sAlarm, FORMAT_BIN) != HAL_OK) {}
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
}
___________________________________________________________________________________________
Kudo posts if you have the same problem and kudo replies if the solution works.
Click "Accept as Solution" if a reply solved your problem. If no solution was posted please answer with your own.
2024-06-25 11:01 PM
This soultuion works.Thank you.
2024-06-26 12:54 AM - edited 2024-06-26 12:54 AM
@Shreayas_Acharaya wrote:@AnanyaRavi29 Try this callback function it will work for you, (it correctly handles the overflow of seconds by wrapping around):
void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc) {
RTC_AlarmTypeDef sAlarm;
HAL_RTC_GetAlarm(hrtc, &sAlarm, RTC_ALARM_A, FORMAT_BIN);
/* Increment the alarm by 10 seconds */
sAlarm.AlarmTime.Seconds += 10;
if (sAlarm.AlarmTime.Seconds >= 58) {
sAlarm.AlarmTime.Seconds -= 58;
}
/* Reset the alarm to trigger again after 10 seconds */
while (HAL_RTC_SetAlarm_IT(hrtc, &sAlarm, FORMAT_BIN) != HAL_OK) {}
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
}
Can you explain where the magic number 58 comes from? Minutes have 60 seconds, which means the max value would be 59 (60 in case of leap seconds, but we can ignore that), not 58.
if initial time for alarm is 4, then the sequence will be:
4,14,24,34,44,54,6,16,26,36,46,56,8,18,28,38,48,0,10,20,30,40,50,2,
So the time difference will be:
12,10,10,10,10,10,12,10,10,10,10,10,12,10,10,10,10,12,10,10,10,10,10,12,10,10,10,10,10,12,10,10,10,10,10,12,10,10,10,10,10,12,10,10,10,10,12,10,10,10,10,10,12,10,10,10,10,10,12,10,10,10,10,10,12,10,10,10,10,10,12,10,10,10,
Meaning sometimes there is 10 seconds and sometimes 12 seconds difference. What's worse is that the interval between the 12 second periods is mostly 6, but sometimes 5 cycles because one cycle that starts with 8 skips 5x completely.
Correct me if I'm wrong.