drivers: rtc: stm32 rtc driver disable alarm interrupt if not used
Note that the Init of the alarm has no need for BCD2BIN conversion, the LL_RTC_ALMx_Init will do. Add more log debug The driver must clear the ALARM enable bit before wrting the alarm registers. Signed-off-by: Francois Ramu <francois.ramu@st.com>
This commit is contained in:
parent
2499a4b226
commit
6db2c2c2c1
1 changed files with 29 additions and 10 deletions
|
@ -187,7 +187,10 @@ static inline ErrorStatus rtc_stm32_init_alarm(RTC_TypeDef *rtc, uint32_t format
|
||||||
LL_RTC_AlarmTypeDef *ll_alarm_struct, uint16_t id)
|
LL_RTC_AlarmTypeDef *ll_alarm_struct, uint16_t id)
|
||||||
{
|
{
|
||||||
ll_alarm_struct->AlarmDateWeekDaySel = RTC_STM32_ALRM_DATEWEEKDAYSEL_DATE;
|
ll_alarm_struct->AlarmDateWeekDaySel = RTC_STM32_ALRM_DATEWEEKDAYSEL_DATE;
|
||||||
/* RTC write protection is disabled & enabled again inside LL_RTC_ALMx_Init functions */
|
/*
|
||||||
|
* RTC write protection is disabled & enabled again inside LL_RTC_ALMx_Init functions
|
||||||
|
* The LL_RTC_ALMx_Init does convert bin2bcd by itself
|
||||||
|
*/
|
||||||
if (id == RTC_STM32_ALRM_A) {
|
if (id == RTC_STM32_ALRM_A) {
|
||||||
return LL_RTC_ALMA_Init(rtc, format, ll_alarm_struct);
|
return LL_RTC_ALMA_Init(rtc, format, ll_alarm_struct);
|
||||||
}
|
}
|
||||||
|
@ -776,6 +779,7 @@ static int rtc_stm32_alarm_set_time(const struct device *dev, uint16_t id, uint1
|
||||||
if (rtc_stm32_is_active_alarm(RTC, id)) {
|
if (rtc_stm32_is_active_alarm(RTC, id)) {
|
||||||
LL_RTC_DisableWriteProtection(RTC);
|
LL_RTC_DisableWriteProtection(RTC);
|
||||||
rtc_stm32_disable_alarm(RTC, id);
|
rtc_stm32_disable_alarm(RTC, id);
|
||||||
|
rtc_stm32_disable_interrupt_alarm(RTC, id);
|
||||||
LL_RTC_EnableWriteProtection(RTC);
|
LL_RTC_EnableWriteProtection(RTC);
|
||||||
}
|
}
|
||||||
LOG_DBG("Alarm %d has been disabled", id);
|
LOG_DBG("Alarm %d has been disabled", id);
|
||||||
|
@ -808,9 +812,9 @@ static int rtc_stm32_alarm_set_time(const struct device *dev, uint16_t id, uint1
|
||||||
|
|
||||||
p_rtc_alrm->user_mask = mask;
|
p_rtc_alrm->user_mask = mask;
|
||||||
|
|
||||||
LOG_DBG("set alarm: second = %d, min = %d, hour = %d,"
|
LOG_DBG("set alarm %d : second = %d, min = %d, hour = %d,"
|
||||||
"wday = %d, mday = %d, mask = 0x%04x",
|
" wday = %d, mday = %d, mask = 0x%04x",
|
||||||
timeptr->tm_sec, timeptr->tm_min, timeptr->tm_hour,
|
id, timeptr->tm_sec, timeptr->tm_min, timeptr->tm_hour,
|
||||||
timeptr->tm_wday, timeptr->tm_mday, mask);
|
timeptr->tm_wday, timeptr->tm_mday, mask);
|
||||||
|
|
||||||
#if RTC_STM32_BACKUP_DOMAIN_WRITE_PROTECTION
|
#if RTC_STM32_BACKUP_DOMAIN_WRITE_PROTECTION
|
||||||
|
@ -820,15 +824,14 @@ static int rtc_stm32_alarm_set_time(const struct device *dev, uint16_t id, uint1
|
||||||
/* Disable the write protection for RTC registers */
|
/* Disable the write protection for RTC registers */
|
||||||
LL_RTC_DisableWriteProtection(RTC);
|
LL_RTC_DisableWriteProtection(RTC);
|
||||||
|
|
||||||
if (rtc_stm32_is_active_alarm(RTC, id)) {
|
/* Disable ALARM so that the RTC_ISR_ALRAWF/RTC_ISR_ALRBWF is 0 */
|
||||||
/* Disable Alarm if already active */
|
rtc_stm32_disable_alarm(RTC, id);
|
||||||
rtc_stm32_disable_alarm(RTC, id);
|
rtc_stm32_disable_interrupt_alarm(RTC, id);
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef RTC_ISR_ALRAWF
|
#ifdef RTC_ISR_ALRAWF
|
||||||
if (id == RTC_STM32_ALRM_A) {
|
if (id == RTC_STM32_ALRM_A) {
|
||||||
/* Wait till RTC ALRAWF flag is set before writing to RTC registers */
|
/* Wait till RTC ALRAWF flag is set before writing to RTC registers */
|
||||||
while ((LL_RTC_ReadReg(RTC, ISR) & RTC_ISR_ALRAWF) == 0U) {
|
while (!LL_RTC_IsActiveFlag_ALRAW(RTC)) {
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -837,7 +840,7 @@ static int rtc_stm32_alarm_set_time(const struct device *dev, uint16_t id, uint1
|
||||||
#ifdef RTC_ISR_ALRBWF
|
#ifdef RTC_ISR_ALRBWF
|
||||||
if (id == RTC_STM32_ALRM_B) {
|
if (id == RTC_STM32_ALRM_B) {
|
||||||
/* Wait till RTC ALRBWF flag is set before writing to RTC registers */
|
/* Wait till RTC ALRBWF flag is set before writing to RTC registers */
|
||||||
while ((LL_RTC_ReadReg(RTC, ISR) & RTC_ISR_ALRBWF) == 0U) {
|
while (!LL_RTC_IsActiveFlag_ALRBW(RTC)) {
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -874,6 +877,22 @@ disable_bkup_access:
|
||||||
unlock:
|
unlock:
|
||||||
k_mutex_unlock(&data->lock);
|
k_mutex_unlock(&data->lock);
|
||||||
|
|
||||||
|
if (id == RTC_STM32_ALRM_A) {
|
||||||
|
LOG_DBG("Alarm A : %dh%dm%ds mask = 0x%x",
|
||||||
|
LL_RTC_ALMA_GetHour(RTC),
|
||||||
|
LL_RTC_ALMA_GetMinute(RTC),
|
||||||
|
LL_RTC_ALMA_GetSecond(RTC),
|
||||||
|
LL_RTC_ALMA_GetMask(RTC));
|
||||||
|
}
|
||||||
|
#ifdef RTC_ALARM_B
|
||||||
|
if (id == RTC_STM32_ALRM_B) {
|
||||||
|
LOG_DBG("Alarm B : %dh%dm%ds mask = 0x%x",
|
||||||
|
LL_RTC_ALMB_GetHour(RTC),
|
||||||
|
LL_RTC_ALMB_GetMinute(RTC),
|
||||||
|
LL_RTC_ALMB_GetSecond(RTC),
|
||||||
|
LL_RTC_ALMB_GetMask(RTC));
|
||||||
|
}
|
||||||
|
#endif /* #ifdef RTC_ALARM_B */
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue