Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: Nucleo_F103RB_RTC_battery_bkup_pwr_off_okay
Fork of mbed-dev by
Revision 177:619788de047e, committed 2017-11-07
- Comitter:
- maxxir
- Date:
- Tue Nov 07 16:46:29 2017 +0000
- Parent:
- 176:447f873cad2f
- Commit message:
- To fix broken RTC on Nucleo_F103RB / STM32F103 BluePill etc..; Used direct RTC register manipulation for STM32F1xx; rtc_read() && rtc_write() (native rtc_init() - works good); also added stub for non-working on STM32F1xx rtc_read_subseconds().
Changed in this revision
| targets/TARGET_STM/rtc_api.c | Show annotated file Show diff for this revision Revisions of this file | 
--- a/targets/TARGET_STM/rtc_api.c	Wed Oct 25 14:53:38 2017 +0100
+++ b/targets/TARGET_STM/rtc_api.c	Tue Nov 07 16:46:29 2017 +0000
@@ -218,6 +218,11 @@
 
 time_t rtc_read(void)
 {
+#if (TARGET_STM32F1)
+    time_t seconds;
+    seconds = ((uint32_t)RTC->CNTH << 16) | RTC->CNTL;
+    return seconds;
+#else
     RTC_DateTypeDef dateStruct = {0};
     RTC_TimeTypeDef timeStruct = {0};
     struct tm timeinfo;
@@ -244,10 +249,18 @@
     time_t t = _rtc_mktime(&timeinfo);
 
     return t;
+#endif
 }
 
 void rtc_write(time_t t)
 {
+#if (TARGET_STM32F1)
+    /* Change the current time */
+    RTC->CRL |= RTC_CRL_CNF;// заходим в режим конфигурации
+    RTC->CNTH = t>>16;
+    RTC->CNTL = t;
+    RTC->CRL &= ~RTC_CRL_CNF; // выходим из режима конфигурации}
+#else
     RTC_DateTypeDef dateStruct = {0};
     RTC_TimeTypeDef timeStruct = {0};
 
@@ -281,6 +294,7 @@
     // Change the RTC current date/time
     HAL_RTC_SetDate(&RtcHandle, &dateStruct, RTC_FORMAT_BIN);
     HAL_RTC_SetTime(&RtcHandle, &timeStruct, RTC_FORMAT_BIN);
+#endif
 }
 
 int rtc_isenabled(void)
@@ -311,7 +325,11 @@
 
 uint32_t rtc_read_subseconds(void)
 {
+#if (TARGET_STM32F1)
+    return 0; //Not exists on STM32F1
+#else
     return 1000000.f * ((double)(RTC_SYNCH_PREDIV - RTC->SSR) / (RTC_SYNCH_PREDIV + 1));
+#endif
 }
 
 void rtc_set_wake_up_timer(uint32_t delta)
    