@@ -571,6 +571,10 @@ bool RTC_init(hourFormat_t format, binaryMode_t mode, sourceClock_t source, bool
571571#else
572572 RTC_getPrediv (& (RtcHandle .Init .AsynchPrediv ), & (RtcHandle .Init .SynchPrediv ));
573573#endif
574+ /*
575+ * TODO: RTC is already initialized, but RTC BIN mode is changed
576+ * force the update of the BIN register in the RTC_ICSR
577+ */
574578#if defined(RTC_BINARY_NONE )
575579 RTC_BinaryConf (mode );
576580#endif /* RTC_BINARY_NONE */
@@ -615,6 +619,11 @@ bool RTC_init(hourFormat_t format, binaryMode_t mode, sourceClock_t source, bool
615619 HAL_RTCEx_EnableBypassShadow (& RtcHandle );
616620#endif
617621
622+ /*
623+ * NOTE: freezing the RTC during stop mode (lowPower deepSleep)
624+ * could inhibit the alarm interrupt and prevent the system to wakeUp
625+ * from stop mode even if the RTC alarm flag is set.
626+ */
618627 return reinit ;
619628}
620629
@@ -733,19 +742,16 @@ void RTC_GetTime(uint8_t *hours, uint8_t *minutes, uint8_t *seconds, uint32_t *s
733742 if (subSeconds != NULL ) {
734743 /*
735744 * The subsecond is the free-running downcounter, to be converted in milliseconds.
736- * Give one more to compensate the fqce_apre uncertainty
737745 */
738- if (initMode == MODE_BINARY_MIX ) {
746+ if (initMode == MODE_BINARY_ONLY ) {
739747 * subSeconds = (((UINT32_MAX - RTC_TimeStruct .SubSeconds + 1 ) & UINT32_MAX )
740748 * 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 )
749+ } else if (initMode == MODE_BINARY_MIX ) {
750+ * subSeconds = (((UINT32_MAX - RTC_TimeStruct .SubSeconds ) & predivSync )
744751 * 1000 ) / fqce_apre ;
745752 } else {
746753 /* the subsecond register value is converted in millisec on 32bit */
747- * subSeconds = (((predivSync - RTC_TimeStruct .SubSeconds + 1 ) & predivSync )
748- * 1000 ) / fqce_apre ;
754+ * subSeconds = ((predivSync - RTC_TimeStruct .SubSeconds ) * 1000 ) / (predivSync + 1 );
749755 }
750756 }
751757#else
@@ -854,13 +860,13 @@ void RTC_StartAlarm(alarm_t name, uint8_t day, uint8_t hours, uint8_t minutes, u
854860 }
855861 /*
856862 * The subsecond param is a nb of milliseconds to be converted in a subsecond
857- * downcounter value and to be comapred to the SubSecond register
863+ * downcounter value and to be compared to the SubSecond register
858864 */
859- if ((initMode == MODE_BINARY_MIX ) || (initMode == MODE_BINARY_NONE )) {
865+ if ((initMode == MODE_BINARY_ONLY ) || (initMode == MODE_BINARY_MIX )) {
860866 /* 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 ;
867+ RTC_AlarmStructure .AlarmTime .SubSeconds = UINT32_MAX - (subSeconds * (predivSync + 1 )) / 1000 ;
862868 } else {
863- RTC_AlarmStructure .AlarmTime .SubSeconds = predivSync - (subSeconds * (predivSync + 1 )) / 1000 + 1 ;
869+ RTC_AlarmStructure .AlarmTime .SubSeconds = predivSync - (subSeconds * (predivSync + 1 )) / 1000 ;
864870 }
865871 } else {
866872 RTC_AlarmStructure .AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_ALL ;
@@ -922,7 +928,7 @@ void RTC_StartAlarm(alarm_t name, uint8_t day, uint8_t hours, uint8_t minutes, u
922928 RTC_AlarmStructure .AlarmSubSecondMask = mask << RTC_ALRMASSR_MASKSS_Pos ;
923929 }
924930#if defined(RTC_ICSR_BIN )
925- if ((initMode == MODE_BINARY_MIX ) || (initMode == MODE_BINARY_ONLY )) {
931+ if ((initMode == MODE_BINARY_ONLY ) || (initMode == MODE_BINARY_MIX )) {
926932 /* We have an SubSecond alarm to set in RTC_BINARY_MIX or RTC_BINARY_ONLY mode */
927933 /* The subsecond in ms is converted in ticks unit 1 tick is 1000 / fqce_apre */
928934 RTC_AlarmStructure .AlarmTime .SubSeconds = UINT32_MAX - (subSeconds * (predivSync + 1 )) / 1000 ;
@@ -1026,11 +1032,11 @@ void RTC_GetAlarm(alarm_t name, uint8_t *day, uint8_t *hours, uint8_t *minutes,
10261032 * The subsecond is the bit SS[14:0] of the ALARM SSR register (not ALARMxINR)
10271033 * to be converted in milliseconds
10281034 */
1029- if ((initMode == MODE_BINARY_MIX ) || (initMode == MODE_BINARY_ONLY )) {
1035+ if ((initMode == MODE_BINARY_ONLY ) || (initMode == MODE_BINARY_MIX )) {
10301036 /* read the ALARM SSR register on SS[14:0] bits --> 0x7FFF */
10311037 * subSeconds = (((0x7fff - RTC_AlarmStructure .AlarmTime .SubSeconds + 1 ) & 0x7fff ) * 1000 ) / fqce_apre ;
10321038 } else {
1033- * subSeconds = ((( predivSync - RTC_AlarmStructure .AlarmTime .SubSeconds + 1 ) & predivSync ) * 1000 ) / (predivSync + 1 );
1039+ * subSeconds = ((predivSync - RTC_AlarmStructure .AlarmTime .SubSeconds ) * 1000 ) / (predivSync + 1 );
10341040 }
10351041 }
10361042#else
0 commit comments