arch/arm/stm32: fix stm32f1xx alarm support

Summary:
stm32: support querying a previously set RTC alarm In the STM32F1xx series

Impact:
When using the stm32f1xx series MCU, the alarm function can be used, but when we enabled the CONFIG_RTC_ALARM configuration, an error was reported due to the inability to find the specific implementation of rdalarm.

Testing:
In our own projects, we have done alarm verification using the STM32F103RE..
This commit is contained in:
lpxiao
2025-03-18 10:08:44 +08:00
committed by Xiang Xiao
parent 1c6b603eec
commit 9e07b4a924
3 changed files with 80 additions and 0 deletions
+24
View File
@@ -43,6 +43,14 @@
typedef void (*alarmcb_t)(void);
/* Structure used to pass parameters to query an alarm */
struct alm_rdalarm_s
{
int ar_id; /* enum alm_id_e */
FAR struct rtc_time *ar_time; /* Argument for storing ALARM RTC time */
};
/****************************************************************************
* Public Function Prototypes
****************************************************************************/
@@ -90,6 +98,22 @@ int stm32_rtc_setalarm(const struct timespec *tp, alarmcb_t callback);
int stm32_rtc_cancelalarm(void);
/****************************************************************************
* Name: stm32_rtc_rdalarm
*
* Description:
* Query an alarm configured in hardware.
*
* Input Parameters:
* alminfo - Information about the alarm configuration.
*
* Returned Value:
* Zero (OK) on success; a negated errno on failure
*
****************************************************************************/
int stm32_rtc_rdalarm(FAR struct alm_rdalarm_s *alminfo);
#undef EXTERN
#if defined(__cplusplus)
}
+7
View File
@@ -745,9 +745,16 @@ static int stm32_rdalarm(struct rtc_lowerhalf_s *lower,
irqstate_t flags;
DEBUGASSERT(lower != NULL && alarminfo != NULL && alarminfo->time != NULL);
#if defined(CONFIG_STM32_STM32F4XXX) || defined(CONFIG_STM32_STM32L15XX)
DEBUGASSERT(alarminfo->id == RTC_ALARMA || alarminfo->id == RTC_ALARMB);
if (alarminfo->id == RTC_ALARMA || alarminfo->id == RTC_ALARMB)
#else
DEBUGASSERT(alarminfo->id >= 0 && alarminfo->id < CONFIG_RTC_NALARMS);
if (alarminfo != NULL && alarminfo->id >= 0 &&
alarminfo->id < CONFIG_RTC_NALARMS)
#endif
{
/* Disable pre-emption while we do this so that we don't have to worry
* about being suspended and working on an old time.
+49
View File
@@ -53,7 +53,10 @@
#include <stdint.h>
#include <stdbool.h>
#include <stdio.h>
#include <assert.h>
#include <errno.h>
#include <debug.h>
#include <time.h>
#include "arm_internal.h"
#include "stm32_pwr.h"
@@ -797,3 +800,49 @@ int stm32_rtc_cancelalarm(void)
return ret;
}
#endif
/****************************************************************************
* Name: stm32_rtc_rdalarm
*
* Description:
* Query an alarm configured in hardware.
*
* Input Parameters:
* alminfo - Information about the alarm configuration.
*
* Returned Value:
* Zero (OK) on success; a negated errno on failure
*
****************************************************************************/
#ifdef CONFIG_RTC_ALARM
int stm32_rtc_rdalarm(FAR struct alm_rdalarm_s *alminfo)
{
struct rtc_regvals_s regvals;
FAR struct timespec tp;
int ret = -EINVAL;
DEBUGASSERT(alminfo != NULL);
DEBUGASSERT(alminfo->ar_id == 0);
switch (alminfo->ar_id)
{
case 0:
{
regvals.cnth = getreg16(STM32_RTC_ALRH);
regvals.cntl = getreg16(STM32_RTC_ALRL);
tp.tv_sec = regvals.cnth << 16 | regvals.cntl;
memcpy(alminfo->ar_time, (FAR struct tm *)gmtime(&tp.tv_sec),
sizeof(FAR struct tm));
ret = OK;
}
break;
default:
rtcerr("ERROR: Invalid ALARM%d\n", alminfo->ar_id);
break;
}
return ret;
}
#endif