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@8:bf593344668e, 2016-07-02 (annotated)
- 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?
User | Revision | Line number | New 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 | } |