In the past, you need modify rtc_api.c in mbed-dev source code. From this revision, you can just use RTC function all of conditions (Normal, Reset, Stand-by, Power OFF).
Note
From now on, you do NOT need any modification for mbed-dev library because STM team updates rtc_api.c source code and support RTC function under reset & standby condition includes power off condition (You need additional VBAT back-up hardware).
Please refer following NOTE information.
/users/kenjiArai/notebook/nucleo-series-rtc-control-under-power-onoff-and-re/
main.cpp
- Committer:
- kenjiArai
- Date:
- 2015-02-18
- Revision:
- 3:7b3edf54c706
- Parent:
- 2:77ec44bf1fa5
- Child:
- 4:a9cebfe4715f
File content as of revision 3:7b3edf54c706:
/* * mbed Application program * RTC (inside STM32x CPU) test program * * Copyright (c) 2015 Kenji Arai / JH1PJL * http://www.page.sannet.ne.jp/kenjia/index.html * http://mbed.org/users/kenjiArai/ * Created: January 17th, 2015 * Revised: Feburary 18th, 2015 * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ // Include --------------------------------------------------------------------------------------- #include "mbed.h" #include "TextLCD.h" // MUST -> need to modify rtc_api.c, please refer SetRTC.h file [CAUTION] and modify_info_xxx.h #include "SetRTC.h" // Definition ------------------------------------------------------------------------------------ #define SHOW_KEY_PROMPT 30 #define USE_LCD #if defined(TARGET_NUCLEO_F401RE) || defined(TARGET_NUCLEO_F411RE) || defined(TARGET_NUCLEO_L152RE) #else #error "Target is only Nucleo F401RE, F411RE and L152RE" #endif // Object ---------------------------------------------------------------------------------------- DigitalIn userSW(USER_BUTTON); DigitalOut myled(LED1); // Indicate the sampling period Serial pc(USBTX, USBRX); #if defined(USE_LCD) I2C i2c(D14,D15); // SDA, SCL TextLCD_I2C_N lcd(&i2c, 0x7c, TextLCD::LCD8x2); // LCD(Akizuki AQM0802A) #endif // RAM ------------------------------------------------------------------------------------------- // ROM / Constant data --------------------------------------------------------------------------- // Function prototypes --------------------------------------------------------------------------- //------------------------------------------------------------------------------------------------- // Control Program //------------------------------------------------------------------------------------------------- int main() { char buf[42]; // data buffer for text time_t seconds; uint8_t counter = SHOW_KEY_PROMPT; #if defined(USE_LCD) // lcd lcd.locate(0, 0); // 1st line top // 12345678 lcd.printf(" RTC "); lcd.locate(0, 1); // 2nd line top // 12345678 lcd.puts(" JH1PJL "); lcd.setContrast(0x14); #endif pc.printf("\r\n\r\nTest Nucleo RTC Function\r\n"); myled = !myled; if (SetRTC() == OK) { pc.printf("External"); } else { pc.printf("Internal"); } pc.printf(" Xtal for RTC\r\n"); show_RTC_reg(); // only for debug purpose // waiting for Initial screen myled = 1; wait(1.0); myled = !myled; wait(1.0); while(1) { seconds = time(NULL); strftime(buf, 40, " %B %d,'%y, %H:%M:%S\r\n", localtime(&seconds)); pc.printf("[Time] %s", buf); #if defined(USE_LCD) lcd.locate(0, 0); // 1st line top strftime(buf, 40, "%b%d'%y", localtime(&seconds)); lcd.printf(buf); lcd.locate(0, 1); // 2nd line top strftime(buf, 10, "%H:%M:%S", localtime(&seconds)); lcd.printf(buf); #endif --counter; if (counter){ // 012345678901234567890123456789012345678901234567890123456789012 pc.printf("Is time correct? If no, hit any key.\r"); } while (seconds == time(NULL)){ if (pc.readable() == 1){ buf[0] = pc.getc(); // dummy read time_enter_mode(); } if (userSW == 0){ #if defined(USE_LCD) lcd.locate(0, 0); // 1st line top // 12345678 lcd.printf(" Enter "); lcd.locate(0, 1); // 2nd line top // 12345678 lcd.printf(" Sleep " ); #endif // 123456789012345678901234567890123456789012345678 pc.printf("\r\nEnter Standby Mode, please push RESET to wake-up\r\n"); wait(1.0); myled = 0; goto_standby(); } } if (counter){ // 12345678901234567890123456789012345678901234567890 pc.printf(" \r"); } myled = !myled; } }