Skip to content

Commit 89abd45

Browse files
committed
fix MIX
1 parent d3f6526 commit 89abd45

File tree

1 file changed

+20
-13
lines changed

1 file changed

+20
-13
lines changed

src/rtc.c

+20-13
Original file line numberDiff line numberDiff line change
@@ -733,19 +733,16 @@ void RTC_GetTime(uint8_t *hours, uint8_t *minutes, uint8_t *seconds, uint32_t *s
733733
if (subSeconds != NULL) {
734734
/*
735735
* The subsecond is the free-running downcounter, to be converted in milliseconds.
736-
* Give one more to compensate the fqce_apre uncertainty
737736
*/
738-
if (initMode == MODE_BINARY_MIX) {
737+
if (initMode == MODE_BINARY_ONLY) {
739738
*subSeconds = (((UINT32_MAX - RTC_TimeStruct.SubSeconds + 1) & UINT32_MAX)
740739
* 1000) / fqce_apre;
741-
*subSeconds = *subSeconds % 1000; /* nb of milliseconds [0..999] */
742-
} else if (initMode == MODE_BINARY_ONLY) {
743-
*subSeconds = (((UINT32_MAX - RTC_TimeStruct.SubSeconds + 1) & UINT32_MAX)
740+
} else if (initMode == MODE_BINARY_MIX) {
741+
*subSeconds = (((UINT32_MAX - RTC_TimeStruct.SubSeconds) & predivSync)
744742
* 1000) / fqce_apre;
745743
} else {
746744
/* the subsecond register value is converted in millisec on 32bit */
747-
*subSeconds = (((predivSync - RTC_TimeStruct.SubSeconds + 1) & predivSync)
748-
* 1000) / fqce_apre;
745+
*subSeconds = ((predivSync - RTC_TimeStruct.SubSeconds) * 1000) / (predivSync + 1);
749746
}
750747
}
751748
#else
@@ -856,11 +853,14 @@ void RTC_StartAlarm(alarm_t name, uint8_t day, uint8_t hours, uint8_t minutes, u
856853
* The subsecond param is a nb of milliseconds to be converted in a subsecond
857854
* downcounter value and to be comapred to the SubSecond register
858855
*/
859-
if ((initMode == MODE_BINARY_MIX) || (initMode == MODE_BINARY_NONE)) {
856+
if (initMode == MODE_BINARY_ONLY) {
860857
/* the subsecond is the millisecond to be converted in a subsecond downcounter value */
861-
RTC_AlarmStructure.AlarmTime.SubSeconds = UINT32_MAX - (subSeconds * (predivSync + 1)) / 1000 + 1;
858+
RTC_AlarmStructure.AlarmTime.SubSeconds = UINT32_MAX - (subSeconds * (predivSync + 1)) / 1000;
859+
} else if (initMode == MODE_BINARY_MIX) {
860+
/* the subsecond is the millisecond to be converted in a subsecond downcounter value */
861+
RTC_AlarmStructure.AlarmTime.SubSeconds = UINT32_MAX - (subSeconds * (predivSync + 1)) / 1000;
862862
} else {
863-
RTC_AlarmStructure.AlarmTime.SubSeconds = predivSync - (subSeconds * (predivSync + 1)) / 1000 + 1;
863+
RTC_AlarmStructure.AlarmTime.SubSeconds = predivSync - (subSeconds * (predivSync + 1)) / 1000;
864864
}
865865
} else {
866866
RTC_AlarmStructure.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_ALL;
@@ -922,7 +922,11 @@ void RTC_StartAlarm(alarm_t name, uint8_t day, uint8_t hours, uint8_t minutes, u
922922
RTC_AlarmStructure.AlarmSubSecondMask = mask << RTC_ALRMASSR_MASKSS_Pos;
923923
}
924924
#if defined(RTC_ICSR_BIN)
925-
if ((initMode == MODE_BINARY_MIX) || (initMode == MODE_BINARY_ONLY)) {
925+
if (initMode == MODE_BINARY_ONLY) {
926+
/* We have an SubSecond alarm to set in RTC_BINARY_MIX or RTC_BINARY_ONLY mode */
927+
/* The subsecond in ms is converted in ticks unit 1 tick is 1000 / fqce_apre */
928+
RTC_AlarmStructure.AlarmTime.SubSeconds = UINT32_MAX - (subSeconds * (predivSync + 1)) / 1000;
929+
} else if (initMode == MODE_BINARY_MIX) {
926930
/* We have an SubSecond alarm to set in RTC_BINARY_MIX or RTC_BINARY_ONLY mode */
927931
/* The subsecond in ms is converted in ticks unit 1 tick is 1000 / fqce_apre */
928932
RTC_AlarmStructure.AlarmTime.SubSeconds = UINT32_MAX - (subSeconds * (predivSync + 1)) / 1000;
@@ -1026,11 +1030,14 @@ void RTC_GetAlarm(alarm_t name, uint8_t *day, uint8_t *hours, uint8_t *minutes,
10261030
* The subsecond is the bit SS[14:0] of the ALARM SSR register (not ALARMxINR)
10271031
* to be converted in milliseconds
10281032
*/
1029-
if ((initMode == MODE_BINARY_MIX) || (initMode == MODE_BINARY_ONLY)) {
1033+
if (initMode == MODE_BINARY_ONLY) {
1034+
/* read the ALARM SSR register on SS[14:0] bits --> 0x7FFF */
1035+
*subSeconds = (((0x7fff - RTC_AlarmStructure.AlarmTime.SubSeconds + 1) & 0x7fff) * 1000) / fqce_apre;
1036+
} else if (initMode == MODE_BINARY_MIX) {
10301037
/* read the ALARM SSR register on SS[14:0] bits --> 0x7FFF */
10311038
*subSeconds = (((0x7fff - RTC_AlarmStructure.AlarmTime.SubSeconds + 1) & 0x7fff) * 1000) / fqce_apre;
10321039
} else {
1033-
*subSeconds = (((predivSync - RTC_AlarmStructure.AlarmTime.SubSeconds + 1) & predivSync) * 1000) / (predivSync + 1);
1040+
*subSeconds = ((predivSync - RTC_AlarmStructure.AlarmTime.SubSeconds) * 1000) / (predivSync + 1);
10341041
}
10351042
}
10361043
#else

0 commit comments

Comments
 (0)