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/

Committer:
kenjiArai
Date:
Sat Jul 02 03:08:52 2016 +0000
Revision:
8:bf593344668e
Parent:
7:27a1cf7f8921
Child:
9:6a64b0207f72
Added F746xx

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 0:0751c92c0f71 1 /*
kenjiArai 0:0751c92c0f71 2 * mbed Application program
kenjiArai 0:0751c92c0f71 3 * RTC (inside STM32x CPU) test program
kenjiArai 0:0751c92c0f71 4 *
kenjiArai 7:27a1cf7f8921 5 * Copyright (c) 2015,'16 Kenji Arai / JH1PJL
kenjiArai 0:0751c92c0f71 6 * http://www.page.sannet.ne.jp/kenjia/index.html
kenjiArai 0:0751c92c0f71 7 * http://mbed.org/users/kenjiArai/
kenjiArai 0:0751c92c0f71 8 * Created: January 17th, 2015
kenjiArai 8:bf593344668e 9 * Revised: July 2nd, 2016
kenjiArai 0:0751c92c0f71 10 *
kenjiArai 0:0751c92c0f71 11 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
kenjiArai 0:0751c92c0f71 12 * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
kenjiArai 0:0751c92c0f71 13 * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
kenjiArai 0:0751c92c0f71 14 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
kenjiArai 0:0751c92c0f71 15 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
kenjiArai 0:0751c92c0f71 16 */
kenjiArai 0:0751c92c0f71 17
kenjiArai 0:0751c92c0f71 18 // Include ---------------------------------------------------------------------------------------
kenjiArai 0:0751c92c0f71 19 #include "mbed.h"
kenjiArai 0:0751c92c0f71 20 #include "TextLCD.h"
kenjiArai 2:77ec44bf1fa5 21 // MUST -> need to modify rtc_api.c, please refer SetRTC.h file [CAUTION] and modify_info_xxx.h
kenjiArai 0:0751c92c0f71 22 #include "SetRTC.h"
kenjiArai 0:0751c92c0f71 23
kenjiArai 0:0751c92c0f71 24 // Definition ------------------------------------------------------------------------------------
kenjiArai 6:5ada291037aa 25 //#define USE_LCD
kenjiArai 0:0751c92c0f71 26
kenjiArai 7:27a1cf7f8921 27 #if (defined(TARGET_STM32F401RE) || defined(TARGET_STM32F411RE) \
kenjiArai 7:27a1cf7f8921 28 || defined(TARGET_STM32L152RE) || defined(TARGET_STM32F334R8) \
kenjiArai 8:bf593344668e 29 || defined(TARGET_STM32L476RG) \
kenjiArai 8:bf593344668e 30 || defined(TARGET_STM32F746NG) || defined(TARGET_STM32F746ZG) )
kenjiArai 1:7a48c475bbd2 31 #else
kenjiArai 8:bf593344668e 32 #error "Target is only Nucleo F401RE, F411RE, F334R8, F746xx, L476RG and L152RE"
kenjiArai 8:bf593344668e 33 #endif
kenjiArai 8:bf593344668e 34
kenjiArai 8:bf593344668e 35 #if (defined(TARGET_STM32F746NG) || defined(TARGET_STM32F746ZG))
kenjiArai 8:bf593344668e 36 #define PUSHED_SW 1 // Active high
kenjiArai 8:bf593344668e 37 #else
kenjiArai 8:bf593344668e 38 #define PUSHED_SW 0 // Active low
kenjiArai 1:7a48c475bbd2 39 #endif
kenjiArai 1:7a48c475bbd2 40
kenjiArai 0:0751c92c0f71 41 // Object ----------------------------------------------------------------------------------------
kenjiArai 0:0751c92c0f71 42 DigitalIn userSW(USER_BUTTON);
kenjiArai 0:0751c92c0f71 43 DigitalOut myled(LED1); // Indicate the sampling period
kenjiArai 0:0751c92c0f71 44 Serial pc(USBTX, USBRX);
kenjiArai 7:27a1cf7f8921 45 #if defined(USE_LCD)
kenjiArai 0:0751c92c0f71 46 I2C i2c(D14,D15); // SDA, SCL
kenjiArai 0:0751c92c0f71 47 TextLCD_I2C_N lcd(&i2c, 0x7c, TextLCD::LCD8x2); // LCD(Akizuki AQM0802A)
kenjiArai 7:27a1cf7f8921 48 #endif
kenjiArai 6:5ada291037aa 49 DigitalOut pwr_onoff(PA_9);
kenjiArai 0:0751c92c0f71 50
kenjiArai 0:0751c92c0f71 51 // RAM -------------------------------------------------------------------------------------------
kenjiArai 0:0751c92c0f71 52
kenjiArai 0:0751c92c0f71 53 // ROM / Constant data ---------------------------------------------------------------------------
kenjiArai 8:bf593344668e 54 char *const msg0 = "Is a time correct? If no, please hit any key. ";
kenjiArai 8:bf593344668e 55 char *const msg1 = "<Push USER SW then enter sleep mode> ";
kenjiArai 8:bf593344668e 56 char *const msg2 = "\r\nEnter Standby Mode, please push RESET to wake-up\r\n";
kenjiArai 8:bf593344668e 57 char *const msg3 = "Time was not updated! External Xtal does NOT oscillate.\r\n";
kenjiArai 8:bf593344668e 58 char *const msg4 = "Time was not updated! LSI does NOT work.\r\n";
kenjiArai 8:bf593344668e 59
kenjiArai 0:0751c92c0f71 60 // Function prototypes ---------------------------------------------------------------------------
kenjiArai 0:0751c92c0f71 61
kenjiArai 0:0751c92c0f71 62 //-------------------------------------------------------------------------------------------------
kenjiArai 0:0751c92c0f71 63 // Control Program
kenjiArai 0:0751c92c0f71 64 //-------------------------------------------------------------------------------------------------
kenjiArai 0:0751c92c0f71 65 int main()
kenjiArai 0:0751c92c0f71 66 {
kenjiArai 8:bf593344668e 67 char buf[64]; // data buffer for text
kenjiArai 0:0751c92c0f71 68 time_t seconds;
kenjiArai 4:a9cebfe4715f 69 uint8_t wait_counter = 0;
kenjiArai 4:a9cebfe4715f 70 uint8_t xtal = 0;
kenjiArai 0:0751c92c0f71 71
kenjiArai 6:5ada291037aa 72 pwr_onoff = 1;
kenjiArai 6:5ada291037aa 73 wait(2.0);
kenjiArai 0:0751c92c0f71 74 #if defined(USE_LCD)
kenjiArai 0:0751c92c0f71 75 // lcd
kenjiArai 0:0751c92c0f71 76 lcd.locate(0, 0); // 1st line top
kenjiArai 0:0751c92c0f71 77 // 12345678
kenjiArai 0:0751c92c0f71 78 lcd.printf(" RTC ");
kenjiArai 0:0751c92c0f71 79 lcd.locate(0, 1); // 2nd line top
kenjiArai 0:0751c92c0f71 80 // 12345678
kenjiArai 0:0751c92c0f71 81 lcd.puts(" JH1PJL ");
kenjiArai 0:0751c92c0f71 82 lcd.setContrast(0x14);
kenjiArai 0:0751c92c0f71 83 #endif
kenjiArai 0:0751c92c0f71 84 pc.printf("\r\n\r\nTest Nucleo RTC Function\r\n");
kenjiArai 2:77ec44bf1fa5 85 myled = !myled;
kenjiArai 5:bc464a588c2e 86 if (SetRTC(0) == 1) {
kenjiArai 2:77ec44bf1fa5 87 pc.printf("External");
kenjiArai 4:a9cebfe4715f 88 xtal = 1;
kenjiArai 2:77ec44bf1fa5 89 } else {
kenjiArai 2:77ec44bf1fa5 90 pc.printf("Internal");
kenjiArai 4:a9cebfe4715f 91 xtal = 0;
kenjiArai 2:77ec44bf1fa5 92 }
kenjiArai 2:77ec44bf1fa5 93 pc.printf(" Xtal for RTC\r\n");
kenjiArai 2:77ec44bf1fa5 94 show_RTC_reg(); // only for debug purpose
kenjiArai 0:0751c92c0f71 95 // waiting for Initial screen
kenjiArai 0:0751c92c0f71 96 myled = 1;
kenjiArai 0:0751c92c0f71 97 wait(1.0);
kenjiArai 0:0751c92c0f71 98 myled = !myled;
kenjiArai 0:0751c92c0f71 99 wait(1.0);
kenjiArai 0:0751c92c0f71 100 while(1) {
kenjiArai 0:0751c92c0f71 101 seconds = time(NULL);
kenjiArai 8:bf593344668e 102 strftime(buf, 50, " %B %d,'%y, %H:%M:%S\r\n", localtime(&seconds));
kenjiArai 4:a9cebfe4715f 103 if (xtal){
kenjiArai 4:a9cebfe4715f 104 pc.printf("[Time] %s", buf);
kenjiArai 4:a9cebfe4715f 105 } else {
kenjiArai 4:a9cebfe4715f 106 pc.printf("[Time by Internal Clock] %s", buf);
kenjiArai 4:a9cebfe4715f 107 }
kenjiArai 0:0751c92c0f71 108 #if defined(USE_LCD)
kenjiArai 0:0751c92c0f71 109 lcd.locate(0, 0); // 1st line top
kenjiArai 0:0751c92c0f71 110 strftime(buf, 40, "%b%d'%y", localtime(&seconds));
kenjiArai 0:0751c92c0f71 111 lcd.printf(buf);
kenjiArai 0:0751c92c0f71 112 lcd.locate(0, 1); // 2nd line top
kenjiArai 0:0751c92c0f71 113 strftime(buf, 10, "%H:%M:%S", localtime(&seconds));
kenjiArai 0:0751c92c0f71 114 lcd.printf(buf);
kenjiArai 0:0751c92c0f71 115 #endif
kenjiArai 8:bf593344668e 116 pc.printf(msg0);
kenjiArai 8:bf593344668e 117 pc.printf("%s\r", msg1);
kenjiArai 4:a9cebfe4715f 118 wait_counter = 0;
kenjiArai 2:77ec44bf1fa5 119 while (seconds == time(NULL)){
kenjiArai 0:0751c92c0f71 120 if (pc.readable() == 1){
kenjiArai 0:0751c92c0f71 121 buf[0] = pc.getc(); // dummy read
kenjiArai 0:0751c92c0f71 122 time_enter_mode();
kenjiArai 0:0751c92c0f71 123 }
kenjiArai 8:bf593344668e 124 if (userSW == PUSHED_SW){
kenjiArai 0:0751c92c0f71 125 #if defined(USE_LCD)
kenjiArai 2:77ec44bf1fa5 126 lcd.locate(0, 0); // 1st line top
kenjiArai 2:77ec44bf1fa5 127 // 12345678
kenjiArai 2:77ec44bf1fa5 128 lcd.printf(" Enter ");
kenjiArai 2:77ec44bf1fa5 129 lcd.locate(0, 1); // 2nd line top
kenjiArai 2:77ec44bf1fa5 130 // 12345678
kenjiArai 2:77ec44bf1fa5 131 lcd.printf(" Sleep " );
kenjiArai 0:0751c92c0f71 132 #endif
kenjiArai 8:bf593344668e 133 pc.printf(msg2);
kenjiArai 2:77ec44bf1fa5 134 wait(1.0);
kenjiArai 2:77ec44bf1fa5 135 myled = 0;
kenjiArai 3:7b3edf54c706 136 goto_standby();
kenjiArai 2:77ec44bf1fa5 137 }
kenjiArai 4:a9cebfe4715f 138 wait(0.05);
kenjiArai 4:a9cebfe4715f 139 if (++wait_counter > (2000 / 50)){
kenjiArai 4:a9cebfe4715f 140 if (xtal){
kenjiArai 8:bf593344668e 141 pc.printf(msg3);
kenjiArai 4:a9cebfe4715f 142 } else {
kenjiArai 8:bf593344668e 143 pc.printf(msg4);
kenjiArai 4:a9cebfe4715f 144 }
kenjiArai 4:a9cebfe4715f 145 break;
kenjiArai 4:a9cebfe4715f 146 }
kenjiArai 0:0751c92c0f71 147 }
kenjiArai 8:bf593344668e 148 uint8_t n = strlen(msg0) + strlen(msg1);
kenjiArai 8:bf593344668e 149 for (uint8_t i = 0; i < n; i++){
kenjiArai 8:bf593344668e 150 pc.putc(' ');
kenjiArai 2:77ec44bf1fa5 151 }
kenjiArai 8:bf593344668e 152 pc.printf(" \r"); // Not use '\n'
kenjiArai 2:77ec44bf1fa5 153 myled = !myled;
kenjiArai 0:0751c92c0f71 154 }
kenjiArai 0:0751c92c0f71 155 }