Checking program for RTC module inside CPU.
Dependents: RTC_w_COM Frequency_Counter_w_GPS_1PPS debug_tools Nucleo_RTC_Clock_setting ... more
Please refer below link.
http://developer.mbed.org/users/kenjiArai/notebook/nucleo-series-clock-structure-and-xtal-oscillation/
CheckRTC.cpp@0:01ddb8e35845, 2014-11-01 (annotated)
- Committer:
- kenjiArai
- Date:
- Sat Nov 01 00:03:16 2014 +0000
- Revision:
- 0:01ddb8e35845
- Child:
- 1:921a188e61c0
Checking program for RTC module inside CPU. Only for Nucleo board. L152RE, F401 and F411
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kenjiArai | 0:01ddb8e35845 | 1 | /* |
kenjiArai | 0:01ddb8e35845 | 2 | * mbed Library program |
kenjiArai | 0:01ddb8e35845 | 3 | * Check RTC function and set proper clock if we can set |
kenjiArai | 0:01ddb8e35845 | 4 | * ONLY FOR "Nucleo Board" |
kenjiArai | 0:01ddb8e35845 | 5 | * |
kenjiArai | 0:01ddb8e35845 | 6 | * Copyright (c) 2010-2014 Kenji Arai / JH1PJL |
kenjiArai | 0:01ddb8e35845 | 7 | * http://www.page.sannet.ne.jp/kenjia/index.html |
kenjiArai | 0:01ddb8e35845 | 8 | * http://mbed.org/users/kenjiArai/ |
kenjiArai | 0:01ddb8e35845 | 9 | * Created: October 24th, 2014 |
kenjiArai | 0:01ddb8e35845 | 10 | * Revised: November 1st, 2014 |
kenjiArai | 0:01ddb8e35845 | 11 | * |
kenjiArai | 0:01ddb8e35845 | 12 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, |
kenjiArai | 0:01ddb8e35845 | 13 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE |
kenjiArai | 0:01ddb8e35845 | 14 | * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, |
kenjiArai | 0:01ddb8e35845 | 15 | * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
kenjiArai | 0:01ddb8e35845 | 16 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
kenjiArai | 0:01ddb8e35845 | 17 | */ |
kenjiArai | 0:01ddb8e35845 | 18 | |
kenjiArai | 0:01ddb8e35845 | 19 | //#define DEBUG // use Communication with PC(UART) |
kenjiArai | 0:01ddb8e35845 | 20 | |
kenjiArai | 0:01ddb8e35845 | 21 | // Include --------------------------------------------------------------------------------------- |
kenjiArai | 0:01ddb8e35845 | 22 | #include "mbed.h" |
kenjiArai | 0:01ddb8e35845 | 23 | #include "CheckRTC.h" |
kenjiArai | 0:01ddb8e35845 | 24 | |
kenjiArai | 0:01ddb8e35845 | 25 | // Definition ------------------------------------------------------------------------------------ |
kenjiArai | 0:01ddb8e35845 | 26 | #ifdef DEBUG |
kenjiArai | 0:01ddb8e35845 | 27 | #define BAUD(x) pcm.baud(x) |
kenjiArai | 0:01ddb8e35845 | 28 | #define GETC(x) pcm.getc(x) |
kenjiArai | 0:01ddb8e35845 | 29 | #define PUTC(x) pcm.putc(x) |
kenjiArai | 0:01ddb8e35845 | 30 | #define PRINTF(...) pcm.printf(__VA_ARGS__) |
kenjiArai | 0:01ddb8e35845 | 31 | #define READABLE(x) pcm.readable(x) |
kenjiArai | 0:01ddb8e35845 | 32 | #else |
kenjiArai | 0:01ddb8e35845 | 33 | #define BAUD(x) {;} |
kenjiArai | 0:01ddb8e35845 | 34 | #define GETC(x) {;} |
kenjiArai | 0:01ddb8e35845 | 35 | #define PUTC(x) {;} |
kenjiArai | 0:01ddb8e35845 | 36 | #define PRINTF(...) {;} |
kenjiArai | 0:01ddb8e35845 | 37 | #define READABLE(x) {;} |
kenjiArai | 0:01ddb8e35845 | 38 | #endif |
kenjiArai | 0:01ddb8e35845 | 39 | |
kenjiArai | 0:01ddb8e35845 | 40 | // Object ---------------------------------------------------------------------------------------- |
kenjiArai | 0:01ddb8e35845 | 41 | #ifdef DEBUG |
kenjiArai | 0:01ddb8e35845 | 42 | Serial pcm(USBTX, USBRX); |
kenjiArai | 0:01ddb8e35845 | 43 | #endif |
kenjiArai | 0:01ddb8e35845 | 44 | //DigitalOut myled(LED1); |
kenjiArai | 0:01ddb8e35845 | 45 | //Timer t; |
kenjiArai | 0:01ddb8e35845 | 46 | |
kenjiArai | 0:01ddb8e35845 | 47 | // RAM ------------------------------------------------------------------------------------------- |
kenjiArai | 0:01ddb8e35845 | 48 | |
kenjiArai | 0:01ddb8e35845 | 49 | // ROM / Constant data --------------------------------------------------------------------------- |
kenjiArai | 0:01ddb8e35845 | 50 | |
kenjiArai | 0:01ddb8e35845 | 51 | // Function prototypes --------------------------------------------------------------------------- |
kenjiArai | 0:01ddb8e35845 | 52 | #if defined(TARGET_NUCLEO_F401RE) || defined(TARGET_NUCLEO_F411RE) || defined(TARGET_NUCLEO_L152RE) |
kenjiArai | 0:01ddb8e35845 | 53 | static int32_t Set_RTC_LSI(void); |
kenjiArai | 0:01ddb8e35845 | 54 | static int32_t rtc_external_osc_init(void); |
kenjiArai | 0:01ddb8e35845 | 55 | static int32_t Set_RTC_LSE(void); |
kenjiArai | 0:01ddb8e35845 | 56 | #endif |
kenjiArai | 0:01ddb8e35845 | 57 | |
kenjiArai | 0:01ddb8e35845 | 58 | //------------------------------------------------------------------------------------------------- |
kenjiArai | 0:01ddb8e35845 | 59 | // Control Program |
kenjiArai | 0:01ddb8e35845 | 60 | //------------------------------------------------------------------------------------------------- |
kenjiArai | 0:01ddb8e35845 | 61 | int32_t CheckRTC() |
kenjiArai | 0:01ddb8e35845 | 62 | { |
kenjiArai | 0:01ddb8e35845 | 63 | #if defined(TARGET_NUCLEO_F401RE) || defined(TARGET_NUCLEO_F411RE) || defined(TARGET_NUCLEO_L152RE) |
kenjiArai | 0:01ddb8e35845 | 64 | if (rtc_external_osc_init() == OK) { |
kenjiArai | 0:01ddb8e35845 | 65 | return OK; |
kenjiArai | 0:01ddb8e35845 | 66 | } else { |
kenjiArai | 0:01ddb8e35845 | 67 | return NG; |
kenjiArai | 0:01ddb8e35845 | 68 | } |
kenjiArai | 0:01ddb8e35845 | 69 | #elif defined(TARGET_LPC1768) || defined(TARGET_K64F) |
kenjiArai | 0:01ddb8e35845 | 70 | return OK; |
kenjiArai | 0:01ddb8e35845 | 71 | #else |
kenjiArai | 0:01ddb8e35845 | 72 | return UNKNOWN; |
kenjiArai | 0:01ddb8e35845 | 73 | #endif |
kenjiArai | 0:01ddb8e35845 | 74 | } |
kenjiArai | 0:01ddb8e35845 | 75 | |
kenjiArai | 0:01ddb8e35845 | 76 | #if defined(TARGET_NUCLEO_F401RE) || defined(TARGET_NUCLEO_F411RE) || defined(TARGET_NUCLEO_L152RE) |
kenjiArai | 0:01ddb8e35845 | 77 | int32_t Set_RTC_LSE(void) |
kenjiArai | 0:01ddb8e35845 | 78 | { |
kenjiArai | 0:01ddb8e35845 | 79 | uint32_t timeout = 0; |
kenjiArai | 0:01ddb8e35845 | 80 | |
kenjiArai | 0:01ddb8e35845 | 81 | //---------------------------- LSE Configuration ------------------------- |
kenjiArai | 0:01ddb8e35845 | 82 | // Enable Power Clock |
kenjiArai | 0:01ddb8e35845 | 83 | __PWR_CLK_ENABLE(); |
kenjiArai | 0:01ddb8e35845 | 84 | // Enable write access to Backup domain |
kenjiArai | 0:01ddb8e35845 | 85 | PWR->CR |= PWR_CR_DBP; |
kenjiArai | 0:01ddb8e35845 | 86 | // Wait for Backup domain Write protection disable |
kenjiArai | 0:01ddb8e35845 | 87 | timeout = HAL_GetTick() + DBP_TIMEOUT_VALUE; |
kenjiArai | 0:01ddb8e35845 | 88 | while((PWR->CR & PWR_CR_DBP) == RESET) { |
kenjiArai | 0:01ddb8e35845 | 89 | if(HAL_GetTick() >= timeout) { |
kenjiArai | 0:01ddb8e35845 | 90 | PRINTF("Time-Out 1\r\n"); |
kenjiArai | 0:01ddb8e35845 | 91 | return NG; |
kenjiArai | 0:01ddb8e35845 | 92 | } |
kenjiArai | 0:01ddb8e35845 | 93 | } |
kenjiArai | 0:01ddb8e35845 | 94 | // Reset LSEON and LSEBYP bits before configuring the LSE ---------------- |
kenjiArai | 0:01ddb8e35845 | 95 | __HAL_RCC_LSE_CONFIG(RCC_LSE_OFF); |
kenjiArai | 0:01ddb8e35845 | 96 | // Get timeout |
kenjiArai | 0:01ddb8e35845 | 97 | timeout = HAL_GetTick() + TIMEOUT; |
kenjiArai | 0:01ddb8e35845 | 98 | // Wait till LSE is ready |
kenjiArai | 0:01ddb8e35845 | 99 | while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) != RESET) { |
kenjiArai | 0:01ddb8e35845 | 100 | if(HAL_GetTick() >= timeout) { |
kenjiArai | 0:01ddb8e35845 | 101 | PRINTF("Time-Out 2\r\n"); |
kenjiArai | 0:01ddb8e35845 | 102 | return NG; |
kenjiArai | 0:01ddb8e35845 | 103 | } |
kenjiArai | 0:01ddb8e35845 | 104 | } |
kenjiArai | 0:01ddb8e35845 | 105 | // Set the new LSE configuration ----------------------------------------- |
kenjiArai | 0:01ddb8e35845 | 106 | __HAL_RCC_LSE_CONFIG(RCC_LSE_ON); |
kenjiArai | 0:01ddb8e35845 | 107 | // Get timeout |
kenjiArai | 0:01ddb8e35845 | 108 | timeout = HAL_GetTick() + TIMEOUT; |
kenjiArai | 0:01ddb8e35845 | 109 | // Wait till LSE is ready |
kenjiArai | 0:01ddb8e35845 | 110 | while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) { |
kenjiArai | 0:01ddb8e35845 | 111 | if(HAL_GetTick() >= timeout) { |
kenjiArai | 0:01ddb8e35845 | 112 | PRINTF("Time-Out 3\r\n"); |
kenjiArai | 0:01ddb8e35845 | 113 | return NG; |
kenjiArai | 0:01ddb8e35845 | 114 | } |
kenjiArai | 0:01ddb8e35845 | 115 | } |
kenjiArai | 0:01ddb8e35845 | 116 | PRINTF("OK"); |
kenjiArai | 0:01ddb8e35845 | 117 | return OK; |
kenjiArai | 0:01ddb8e35845 | 118 | } |
kenjiArai | 0:01ddb8e35845 | 119 | |
kenjiArai | 0:01ddb8e35845 | 120 | int32_t Set_RTC_LSI(void) |
kenjiArai | 0:01ddb8e35845 | 121 | { |
kenjiArai | 0:01ddb8e35845 | 122 | uint32_t timeout = 0; |
kenjiArai | 0:01ddb8e35845 | 123 | |
kenjiArai | 0:01ddb8e35845 | 124 | // Enable Power clock |
kenjiArai | 0:01ddb8e35845 | 125 | __PWR_CLK_ENABLE(); |
kenjiArai | 0:01ddb8e35845 | 126 | // Enable access to Backup domain |
kenjiArai | 0:01ddb8e35845 | 127 | HAL_PWR_EnableBkUpAccess(); |
kenjiArai | 0:01ddb8e35845 | 128 | // Reset Backup domain |
kenjiArai | 0:01ddb8e35845 | 129 | __HAL_RCC_BACKUPRESET_FORCE(); |
kenjiArai | 0:01ddb8e35845 | 130 | __HAL_RCC_BACKUPRESET_RELEASE(); |
kenjiArai | 0:01ddb8e35845 | 131 | // Enable Power Clock |
kenjiArai | 0:01ddb8e35845 | 132 | __PWR_CLK_ENABLE(); |
kenjiArai | 0:01ddb8e35845 | 133 | // Enable write access to Backup domain |
kenjiArai | 0:01ddb8e35845 | 134 | PWR->CR |= PWR_CR_DBP; |
kenjiArai | 0:01ddb8e35845 | 135 | // Wait for Backup domain Write protection disable |
kenjiArai | 0:01ddb8e35845 | 136 | timeout = HAL_GetTick() + DBP_TIMEOUT_VALUE; |
kenjiArai | 0:01ddb8e35845 | 137 | while((PWR->CR & PWR_CR_DBP) == RESET) { |
kenjiArai | 0:01ddb8e35845 | 138 | if(HAL_GetTick() >= timeout) { |
kenjiArai | 0:01ddb8e35845 | 139 | return NG; |
kenjiArai | 0:01ddb8e35845 | 140 | } |
kenjiArai | 0:01ddb8e35845 | 141 | } |
kenjiArai | 0:01ddb8e35845 | 142 | __HAL_RCC_LSE_CONFIG(RCC_LSE_OFF); |
kenjiArai | 0:01ddb8e35845 | 143 | // Enable LSI |
kenjiArai | 0:01ddb8e35845 | 144 | __HAL_RCC_LSI_ENABLE(); |
kenjiArai | 0:01ddb8e35845 | 145 | timeout = HAL_GetTick() + TIMEOUT; |
kenjiArai | 0:01ddb8e35845 | 146 | // Wait till LSI is ready |
kenjiArai | 0:01ddb8e35845 | 147 | while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) == RESET) { |
kenjiArai | 0:01ddb8e35845 | 148 | if(HAL_GetTick() >= timeout) { |
kenjiArai | 0:01ddb8e35845 | 149 | return NG; |
kenjiArai | 0:01ddb8e35845 | 150 | } |
kenjiArai | 0:01ddb8e35845 | 151 | } |
kenjiArai | 0:01ddb8e35845 | 152 | // Connect LSI to RTC |
kenjiArai | 0:01ddb8e35845 | 153 | __HAL_RCC_RTC_CLKPRESCALER(RCC_RTCCLKSOURCE_LSI); |
kenjiArai | 0:01ddb8e35845 | 154 | __HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_LSI); |
kenjiArai | 0:01ddb8e35845 | 155 | return OK; |
kenjiArai | 0:01ddb8e35845 | 156 | } |
kenjiArai | 0:01ddb8e35845 | 157 | |
kenjiArai | 0:01ddb8e35845 | 158 | int32_t rtc_external_osc_init(void) |
kenjiArai | 0:01ddb8e35845 | 159 | { |
kenjiArai | 0:01ddb8e35845 | 160 | // Enable Power clock |
kenjiArai | 0:01ddb8e35845 | 161 | __PWR_CLK_ENABLE(); |
kenjiArai | 0:01ddb8e35845 | 162 | // Enable access to Backup domain |
kenjiArai | 0:01ddb8e35845 | 163 | HAL_PWR_EnableBkUpAccess(); |
kenjiArai | 0:01ddb8e35845 | 164 | // Reset Backup domain |
kenjiArai | 0:01ddb8e35845 | 165 | __HAL_RCC_BACKUPRESET_FORCE(); |
kenjiArai | 0:01ddb8e35845 | 166 | __HAL_RCC_BACKUPRESET_RELEASE(); |
kenjiArai | 0:01ddb8e35845 | 167 | // Enable LSE Oscillator |
kenjiArai | 0:01ddb8e35845 | 168 | if (Set_RTC_LSE() == OK) { |
kenjiArai | 0:01ddb8e35845 | 169 | // Connect LSE to RTC |
kenjiArai | 0:01ddb8e35845 | 170 | __HAL_RCC_RTC_CLKPRESCALER(RCC_RTCCLKSOURCE_LSE); |
kenjiArai | 0:01ddb8e35845 | 171 | __HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_LSE); |
kenjiArai | 0:01ddb8e35845 | 172 | return OK; |
kenjiArai | 0:01ddb8e35845 | 173 | } else { |
kenjiArai | 0:01ddb8e35845 | 174 | Set_RTC_LSI(); |
kenjiArai | 0:01ddb8e35845 | 175 | return NG; |
kenjiArai | 0:01ddb8e35845 | 176 | } |
kenjiArai | 0:01ddb8e35845 | 177 | } |
kenjiArai | 0:01ddb8e35845 | 178 | #endif |