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:
2016-05-27
Revision:
7:27a1cf7f8921
Parent:
6:5ada291037aa
Child:
8:bf593344668e

File content as of revision 7:27a1cf7f8921:

/*
 * mbed Application program
 *      RTC (inside STM32x CPU) test program
 *
 * Copyright (c) 2015,'16 Kenji Arai / JH1PJL
 *  http://www.page.sannet.ne.jp/kenjia/index.html
 *  http://mbed.org/users/kenjiArai/
 *      Created: January   17th, 2015
 *      Revised: May       28th, 2016
 *
 * 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_STM32F401RE) || defined(TARGET_STM32F411RE) \
  || defined(TARGET_STM32L152RE) || defined(TARGET_STM32F334R8) \
  || defined(TARGET_STM32L476RG) )
#else
#error "Target is only Nucleo F401RE, F411RE, F334R8, L476RG 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
DigitalOut pwr_onoff(PA_9);

//  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;
    uint8_t wait_counter = 0;
    uint8_t xtal = 0;

    pwr_onoff = 1;
    wait(2.0);
#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(0) == 1) {
        pc.printf("External");
        xtal = 1;
    } else {
        pc.printf("Internal");
        xtal = 0;
    }
    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));
        if (xtal){
            pc.printf("[Time] %s", buf);
        } else {
            pc.printf("[Time by Internal Clock] %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 a time correct? If no, please hit any key for adjustment.\r");
        }
        wait_counter = 0;
        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();
            }
            wait(0.05);
            if (++wait_counter > (2000 / 50)){
                if (xtal){
                    pc.printf("Time was not updated! External Xtal does NOT oscillate.\r\n");
                } else {
                    pc.printf("Time was not updated! LSI does NOT work.\r\n");
                }
                break;
            }
        }
        if (counter){
            //         12345678901234567890123456789012345678901234567890
            pc.printf("                                                  \r"); // Not use '\n'
        }
        myled = !myled;
    }
}