Skip to content

Commit afa27ae

Browse files
committed
stm32RTC with subsecond to milliseconds conversion
The binaryMode_t is retrieved directly from the RTC mode, not as a parameter. The Subsecond parameter is expressed in millisecond in RTC_SetTime/GetTime RTC_StartAlarm/GetAlarm Signed-off-by: Francois Ramu <[email protected]>
1 parent 35da749 commit afa27ae

File tree

2 files changed

+28
-24
lines changed

2 files changed

+28
-24
lines changed

src/STM32RTC.cpp

+4-18
Original file line numberDiff line numberDiff line change
@@ -242,13 +242,13 @@ void STM32RTC::enableAlarm(Alarm_Match match, Alarm name)
242242
#ifdef RTC_ALARM_B
243243
if (name == ALARM_B) {
244244
RTC_StartAlarm(::ALARM_B, 0, 0, 0, 0,
245-
(UINT32_MAX - _alarmBSubSeconds), (_alarmBPeriod == AM) ? HOUR_AM : HOUR_PM,
245+
_alarmBSubSeconds, (_alarmBPeriod == AM) ? HOUR_AM : HOUR_PM,
246246
static_cast<uint8_t>(31UL));
247247
} else
248248
#endif
249249
{
250250
RTC_StartAlarm(::ALARM_A, 0, 0, 0, 0,
251-
(UINT32_MAX - _alarmSubSeconds), (_alarmPeriod == AM) ? HOUR_AM : HOUR_PM,
251+
_alarmSubSeconds, (_alarmPeriod == AM) ? HOUR_AM : HOUR_PM,
252252
static_cast<uint8_t>(31UL));
253253
}
254254
break;
@@ -647,7 +647,7 @@ uint8_t STM32RTC::getAlarmYear(void)
647647

648648
/**
649649
* @brief set RTC subseconds.
650-
* @param subseconds: 0-999
650+
* @param subseconds: 0-999 milliseconds
651651
* @retval none
652652
*/
653653
void STM32RTC::setSubSeconds(uint32_t subSeconds)
@@ -859,8 +859,7 @@ void STM32RTC::setDate(uint8_t weekDay, uint8_t day, uint8_t month, uint8_t year
859859
*/
860860
void STM32RTC::setAlarmSubSeconds(uint32_t subSeconds, Alarm name)
861861
{
862-
863-
if (getBinaryMode() == MODE_MIX) {
862+
if (subSeconds < 1000) {
864863
#ifdef RTC_ALARM_B
865864
if (name == ALARM_B) {
866865
_alarmBSubSeconds = subSeconds;
@@ -871,19 +870,6 @@ void STM32RTC::setAlarmSubSeconds(uint32_t subSeconds, Alarm name)
871870
{
872871
_alarmSubSeconds = subSeconds;
873872
}
874-
} else {
875-
if (subSeconds < 1000) {
876-
#ifdef RTC_ALARM_B
877-
if (name == ALARM_B) {
878-
_alarmBSubSeconds = subSeconds;
879-
}
880-
#else
881-
UNUSED(name);
882-
#endif
883-
{
884-
_alarmSubSeconds = subSeconds;
885-
}
886-
}
887873
}
888874
}
889875

src/rtc.c

+24-6
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ static int16_t predivSync = -1;
7676
static uint32_t prediv = RTC_AUTO_1_SECOND;
7777
#endif /* !STM32F1xx */
7878

79+
static uint32_t fqce_apre;
80+
7981
static hourFormat_t initFormat = HOUR_FORMAT_12;
8082
static binaryMode_t initMode = MODE_BINARY_NONE;
8183

@@ -371,6 +373,8 @@ static void RTC_computePrediv(int8_t *asynch, int16_t *synch)
371373
Error_Handler();
372374
}
373375
*synch = (int16_t)predivS;
376+
377+
fqce_apre = clkVal / (*asynch + 1);
374378
}
375379
#endif /* !STM32F1xx */
376380

@@ -705,8 +709,13 @@ void RTC_GetTime(uint8_t *hours, uint8_t *minutes, uint8_t *seconds, uint32_t *s
705709
#if defined(RTC_SSR_SS)
706710
if (subSeconds != NULL) {
707711
if (initMode == MODE_BINARY_MIX) {
708-
*subSeconds = UINT32_MAX - RTC_TimeStruct.SubSeconds;
712+
/* The subsecond is the free-running downcounter, to be converted in milliseconds */
713+
*subSeconds = (((UINT32_MAX - RTC_TimeStruct.SubSeconds + 1) & UINT32_MAX)
714+
* 1000) / fqce_apre; /* give one more to compensate the 3.9ms uncertainty */
715+
*subSeconds = *subSeconds % 1000; /* nb of milliseconds */
716+
/* predivAsync is 0x7F with LSE clock source */
709717
} else {
718+
/* the subsecond register value is converted in millisec */
710719
*subSeconds = ((predivSync - RTC_TimeStruct.SubSeconds) * 1000) / (predivSync + 1);
711720
}
712721
}
@@ -776,7 +785,7 @@ void RTC_GetDate(uint8_t *year, uint8_t *month, uint8_t *day, uint8_t *wday)
776785
* @param hours: 0-12 or 0-23 depends on the hours mode.
777786
* @param minutes: 0-59
778787
* @param seconds: 0-59
779-
* @param subSeconds: 0-999
788+
* @param subSeconds: 0-999 milliseconds
780789
* @param period: HOUR_AM or HOUR_PM if in 12 hours mode else ignored.
781790
* @param mask: configure alarm behavior using alarmMask_t combination.
782791
* See AN4579 Table 5 for possible values.
@@ -811,7 +820,12 @@ void RTC_StartAlarm(alarm_t name, uint8_t day, uint8_t hours, uint8_t minutes, u
811820
{
812821
RTC_AlarmStructure.AlarmSubSecondMask = predivSync_bits << RTC_ALRMASSR_MASKSS_Pos;
813822
}
814-
RTC_AlarmStructure.AlarmTime.SubSeconds = predivSync - (subSeconds * (predivSync + 1)) / 1000;
823+
if (initMode == MODE_BINARY_MIX) {
824+
/* the subsecond is the millisecond to be converted in a subsecond downcounter value */
825+
RTC_AlarmStructure.AlarmTime.SubSeconds = UINT32_MAX - ((subSeconds * fqce_apre) / 1000 + 1);
826+
} else {
827+
RTC_AlarmStructure.AlarmTime.SubSeconds = predivSync - (subSeconds * (predivSync + 1)) / 1000;
828+
}
815829
} else {
816830
RTC_AlarmStructure.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_ALL;
817831
}
@@ -880,8 +894,8 @@ void RTC_StartAlarm(alarm_t name, uint8_t day, uint8_t hours, uint8_t minutes, u
880894
/* Expecting RTC_ALARMSUBSECONDBINMASK_NONE for the subsecond mask on ALARM A */
881895
RTC_AlarmStructure.AlarmSubSecondMask = mask << RTC_ALRMASSR_MASKSS_Pos;
882896
}
883-
/* Special case for ALARM B configuration when using subsecond reg. in RTC Mix mode */
884-
RTC_AlarmStructure.AlarmTime.SubSeconds = subSeconds;
897+
/* The subsecond in ms is converted in ticks unit 1 tick is 1000 / fqce_apre */
898+
RTC_AlarmStructure.AlarmTime.SubSeconds = UINT32_MAX - (subSeconds * fqce_apre) / 1000;
885899
}
886900

887901
#else
@@ -978,7 +992,11 @@ void RTC_GetAlarm(alarm_t name, uint8_t *day, uint8_t *hours, uint8_t *minutes,
978992
#if defined(RTC_SSR_SS)
979993
if (subSeconds != NULL) {
980994
if (initMode == MODE_BINARY_MIX) {
981-
*subSeconds = UINT32_MAX - RTC_AlarmStructure.AlarmTime.SubSeconds;
995+
/*
996+
* The subsecond is the bit SS[14:0] of the ALARM SSR register (not ALARMxINR)
997+
* to be converted in milliseconds
998+
*/
999+
*subSeconds = (((0x7fff - RTC_AlarmStructure.AlarmTime.SubSeconds + 1) & 0x7fff) * 1000) / fqce_apre;
9821000
} else {
9831001
*subSeconds = ((predivSync - RTC_AlarmStructure.AlarmTime.SubSeconds) * 1000) / (predivSync + 1);
9841002
}

0 commit comments

Comments
 (0)