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@2:2ee7a7260cbf, 2015-01-01 (annotated)
- Committer:
- kenjiArai
- Date:
- Thu Jan 01 05:16:38 2015 +0000
- Revision:
- 2:2ee7a7260cbf
- Parent:
- 1:921a188e61c0
- Child:
- 3:babcde30190d
Modified comments
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 | 2:2ee7a7260cbf | 10 | * Revised: January 1st, 2015 |
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 PRINTF(...) pcm.printf(__VA_ARGS__) |
kenjiArai | 0:01ddb8e35845 | 28 | #else |
kenjiArai | 0:01ddb8e35845 | 29 | #define PRINTF(...) {;} |
kenjiArai | 0:01ddb8e35845 | 30 | #endif |
kenjiArai | 0:01ddb8e35845 | 31 | |
kenjiArai | 0:01ddb8e35845 | 32 | // Object ---------------------------------------------------------------------------------------- |
kenjiArai | 0:01ddb8e35845 | 33 | #ifdef DEBUG |
kenjiArai | 0:01ddb8e35845 | 34 | Serial pcm(USBTX, USBRX); |
kenjiArai | 0:01ddb8e35845 | 35 | #endif |
kenjiArai | 0:01ddb8e35845 | 36 | |
kenjiArai | 0:01ddb8e35845 | 37 | // RAM ------------------------------------------------------------------------------------------- |
kenjiArai | 0:01ddb8e35845 | 38 | |
kenjiArai | 0:01ddb8e35845 | 39 | // ROM / Constant data --------------------------------------------------------------------------- |
kenjiArai | 0:01ddb8e35845 | 40 | |
kenjiArai | 0:01ddb8e35845 | 41 | // Function prototypes --------------------------------------------------------------------------- |
kenjiArai | 0:01ddb8e35845 | 42 | #if defined(TARGET_NUCLEO_F401RE) || defined(TARGET_NUCLEO_F411RE) || defined(TARGET_NUCLEO_L152RE) |
kenjiArai | 0:01ddb8e35845 | 43 | static int32_t Set_RTC_LSI(void); |
kenjiArai | 0:01ddb8e35845 | 44 | static int32_t rtc_external_osc_init(void); |
kenjiArai | 0:01ddb8e35845 | 45 | static int32_t Set_RTC_LSE(void); |
kenjiArai | 0:01ddb8e35845 | 46 | #endif |
kenjiArai | 0:01ddb8e35845 | 47 | |
kenjiArai | 0:01ddb8e35845 | 48 | //------------------------------------------------------------------------------------------------- |
kenjiArai | 0:01ddb8e35845 | 49 | // Control Program |
kenjiArai | 0:01ddb8e35845 | 50 | //------------------------------------------------------------------------------------------------- |
kenjiArai | 0:01ddb8e35845 | 51 | int32_t CheckRTC() |
kenjiArai | 0:01ddb8e35845 | 52 | { |
kenjiArai | 0:01ddb8e35845 | 53 | #if defined(TARGET_NUCLEO_F401RE) || defined(TARGET_NUCLEO_F411RE) || defined(TARGET_NUCLEO_L152RE) |
kenjiArai | 0:01ddb8e35845 | 54 | if (rtc_external_osc_init() == OK) { |
kenjiArai | 0:01ddb8e35845 | 55 | return OK; |
kenjiArai | 0:01ddb8e35845 | 56 | } else { |
kenjiArai | 0:01ddb8e35845 | 57 | return NG; |
kenjiArai | 0:01ddb8e35845 | 58 | } |
kenjiArai | 0:01ddb8e35845 | 59 | #elif defined(TARGET_LPC1768) || defined(TARGET_K64F) |
kenjiArai | 0:01ddb8e35845 | 60 | return OK; |
kenjiArai | 0:01ddb8e35845 | 61 | #else |
kenjiArai | 0:01ddb8e35845 | 62 | return UNKNOWN; |
kenjiArai | 0:01ddb8e35845 | 63 | #endif |
kenjiArai | 0:01ddb8e35845 | 64 | } |
kenjiArai | 0:01ddb8e35845 | 65 | |
kenjiArai | 2:2ee7a7260cbf | 66 | uint32_t get_RTCSEL(void) |
kenjiArai | 2:2ee7a7260cbf | 67 | { |
kenjiArai | 1:921a188e61c0 | 68 | #if defined(TARGET_NUCLEO_F401RE) || defined(TARGET_NUCLEO_F411RE) |
kenjiArai | 1:921a188e61c0 | 69 | return ((RCC->BDCR >> 8) & 0x03); |
kenjiArai | 1:921a188e61c0 | 70 | #elif defined(TARGET_NUCLEO_L152RE) |
kenjiArai | 1:921a188e61c0 | 71 | return ((RCC->CSR >> 16) & 0x03); |
kenjiArai | 1:921a188e61c0 | 72 | #else |
kenjiArai | 1:921a188e61c0 | 73 | return 0; |
kenjiArai | 1:921a188e61c0 | 74 | #endif |
kenjiArai | 1:921a188e61c0 | 75 | } |
kenjiArai | 1:921a188e61c0 | 76 | |
kenjiArai | 1:921a188e61c0 | 77 | |
kenjiArai | 0:01ddb8e35845 | 78 | #if defined(TARGET_NUCLEO_F401RE) || defined(TARGET_NUCLEO_F411RE) || defined(TARGET_NUCLEO_L152RE) |
kenjiArai | 0:01ddb8e35845 | 79 | int32_t Set_RTC_LSE(void) |
kenjiArai | 0:01ddb8e35845 | 80 | { |
kenjiArai | 0:01ddb8e35845 | 81 | uint32_t timeout = 0; |
kenjiArai | 0:01ddb8e35845 | 82 | |
kenjiArai | 0:01ddb8e35845 | 83 | //---------------------------- LSE Configuration ------------------------- |
kenjiArai | 0:01ddb8e35845 | 84 | // Enable Power Clock |
kenjiArai | 0:01ddb8e35845 | 85 | __PWR_CLK_ENABLE(); |
kenjiArai | 0:01ddb8e35845 | 86 | // Enable write access to Backup domain |
kenjiArai | 0:01ddb8e35845 | 87 | PWR->CR |= PWR_CR_DBP; |
kenjiArai | 0:01ddb8e35845 | 88 | // Wait for Backup domain Write protection disable |
kenjiArai | 0:01ddb8e35845 | 89 | timeout = HAL_GetTick() + DBP_TIMEOUT_VALUE; |
kenjiArai | 0:01ddb8e35845 | 90 | while((PWR->CR & PWR_CR_DBP) == RESET) { |
kenjiArai | 0:01ddb8e35845 | 91 | if(HAL_GetTick() >= timeout) { |
kenjiArai | 0:01ddb8e35845 | 92 | PRINTF("Time-Out 1\r\n"); |
kenjiArai | 0:01ddb8e35845 | 93 | return NG; |
kenjiArai | 0:01ddb8e35845 | 94 | } |
kenjiArai | 0:01ddb8e35845 | 95 | } |
kenjiArai | 0:01ddb8e35845 | 96 | // Reset LSEON and LSEBYP bits before configuring the LSE ---------------- |
kenjiArai | 0:01ddb8e35845 | 97 | __HAL_RCC_LSE_CONFIG(RCC_LSE_OFF); |
kenjiArai | 0:01ddb8e35845 | 98 | // Get timeout |
kenjiArai | 0:01ddb8e35845 | 99 | timeout = HAL_GetTick() + TIMEOUT; |
kenjiArai | 0:01ddb8e35845 | 100 | // Wait till LSE is ready |
kenjiArai | 0:01ddb8e35845 | 101 | while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) != RESET) { |
kenjiArai | 0:01ddb8e35845 | 102 | if(HAL_GetTick() >= timeout) { |
kenjiArai | 0:01ddb8e35845 | 103 | PRINTF("Time-Out 2\r\n"); |
kenjiArai | 0:01ddb8e35845 | 104 | return NG; |
kenjiArai | 0:01ddb8e35845 | 105 | } |
kenjiArai | 0:01ddb8e35845 | 106 | } |
kenjiArai | 0:01ddb8e35845 | 107 | // Set the new LSE configuration ----------------------------------------- |
kenjiArai | 0:01ddb8e35845 | 108 | __HAL_RCC_LSE_CONFIG(RCC_LSE_ON); |
kenjiArai | 0:01ddb8e35845 | 109 | // Get timeout |
kenjiArai | 0:01ddb8e35845 | 110 | timeout = HAL_GetTick() + TIMEOUT; |
kenjiArai | 0:01ddb8e35845 | 111 | // Wait till LSE is ready |
kenjiArai | 0:01ddb8e35845 | 112 | while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) { |
kenjiArai | 0:01ddb8e35845 | 113 | if(HAL_GetTick() >= timeout) { |
kenjiArai | 0:01ddb8e35845 | 114 | PRINTF("Time-Out 3\r\n"); |
kenjiArai | 0:01ddb8e35845 | 115 | return NG; |
kenjiArai | 0:01ddb8e35845 | 116 | } |
kenjiArai | 0:01ddb8e35845 | 117 | } |
kenjiArai | 0:01ddb8e35845 | 118 | PRINTF("OK"); |
kenjiArai | 0:01ddb8e35845 | 119 | return OK; |
kenjiArai | 0:01ddb8e35845 | 120 | } |
kenjiArai | 0:01ddb8e35845 | 121 | |
kenjiArai | 0:01ddb8e35845 | 122 | int32_t Set_RTC_LSI(void) |
kenjiArai | 0:01ddb8e35845 | 123 | { |
kenjiArai | 0:01ddb8e35845 | 124 | uint32_t timeout = 0; |
kenjiArai | 0:01ddb8e35845 | 125 | |
kenjiArai | 0:01ddb8e35845 | 126 | // Enable Power clock |
kenjiArai | 0:01ddb8e35845 | 127 | __PWR_CLK_ENABLE(); |
kenjiArai | 0:01ddb8e35845 | 128 | // Enable access to Backup domain |
kenjiArai | 0:01ddb8e35845 | 129 | HAL_PWR_EnableBkUpAccess(); |
kenjiArai | 0:01ddb8e35845 | 130 | // Reset Backup domain |
kenjiArai | 0:01ddb8e35845 | 131 | __HAL_RCC_BACKUPRESET_FORCE(); |
kenjiArai | 0:01ddb8e35845 | 132 | __HAL_RCC_BACKUPRESET_RELEASE(); |
kenjiArai | 0:01ddb8e35845 | 133 | // Enable Power Clock |
kenjiArai | 0:01ddb8e35845 | 134 | __PWR_CLK_ENABLE(); |
kenjiArai | 0:01ddb8e35845 | 135 | // Enable write access to Backup domain |
kenjiArai | 0:01ddb8e35845 | 136 | PWR->CR |= PWR_CR_DBP; |
kenjiArai | 0:01ddb8e35845 | 137 | // Wait for Backup domain Write protection disable |
kenjiArai | 0:01ddb8e35845 | 138 | timeout = HAL_GetTick() + DBP_TIMEOUT_VALUE; |
kenjiArai | 0:01ddb8e35845 | 139 | while((PWR->CR & PWR_CR_DBP) == RESET) { |
kenjiArai | 0:01ddb8e35845 | 140 | if(HAL_GetTick() >= timeout) { |
kenjiArai | 0:01ddb8e35845 | 141 | return NG; |
kenjiArai | 0:01ddb8e35845 | 142 | } |
kenjiArai | 0:01ddb8e35845 | 143 | } |
kenjiArai | 0:01ddb8e35845 | 144 | __HAL_RCC_LSE_CONFIG(RCC_LSE_OFF); |
kenjiArai | 0:01ddb8e35845 | 145 | // Enable LSI |
kenjiArai | 0:01ddb8e35845 | 146 | __HAL_RCC_LSI_ENABLE(); |
kenjiArai | 0:01ddb8e35845 | 147 | timeout = HAL_GetTick() + TIMEOUT; |
kenjiArai | 0:01ddb8e35845 | 148 | // Wait till LSI is ready |
kenjiArai | 0:01ddb8e35845 | 149 | while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) == RESET) { |
kenjiArai | 0:01ddb8e35845 | 150 | if(HAL_GetTick() >= timeout) { |
kenjiArai | 0:01ddb8e35845 | 151 | return NG; |
kenjiArai | 0:01ddb8e35845 | 152 | } |
kenjiArai | 0:01ddb8e35845 | 153 | } |
kenjiArai | 0:01ddb8e35845 | 154 | // Connect LSI to RTC |
kenjiArai | 0:01ddb8e35845 | 155 | __HAL_RCC_RTC_CLKPRESCALER(RCC_RTCCLKSOURCE_LSI); |
kenjiArai | 0:01ddb8e35845 | 156 | __HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_LSI); |
kenjiArai | 0:01ddb8e35845 | 157 | return OK; |
kenjiArai | 0:01ddb8e35845 | 158 | } |
kenjiArai | 0:01ddb8e35845 | 159 | |
kenjiArai | 0:01ddb8e35845 | 160 | int32_t rtc_external_osc_init(void) |
kenjiArai | 0:01ddb8e35845 | 161 | { |
kenjiArai | 0:01ddb8e35845 | 162 | // Enable Power clock |
kenjiArai | 0:01ddb8e35845 | 163 | __PWR_CLK_ENABLE(); |
kenjiArai | 0:01ddb8e35845 | 164 | // Enable access to Backup domain |
kenjiArai | 0:01ddb8e35845 | 165 | HAL_PWR_EnableBkUpAccess(); |
kenjiArai | 0:01ddb8e35845 | 166 | // Reset Backup domain |
kenjiArai | 0:01ddb8e35845 | 167 | __HAL_RCC_BACKUPRESET_FORCE(); |
kenjiArai | 0:01ddb8e35845 | 168 | __HAL_RCC_BACKUPRESET_RELEASE(); |
kenjiArai | 0:01ddb8e35845 | 169 | // Enable LSE Oscillator |
kenjiArai | 0:01ddb8e35845 | 170 | if (Set_RTC_LSE() == OK) { |
kenjiArai | 0:01ddb8e35845 | 171 | // Connect LSE to RTC |
kenjiArai | 0:01ddb8e35845 | 172 | __HAL_RCC_RTC_CLKPRESCALER(RCC_RTCCLKSOURCE_LSE); |
kenjiArai | 0:01ddb8e35845 | 173 | __HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_LSE); |
kenjiArai | 0:01ddb8e35845 | 174 | return OK; |
kenjiArai | 0:01ddb8e35845 | 175 | } else { |
kenjiArai | 0:01ddb8e35845 | 176 | Set_RTC_LSI(); |
kenjiArai | 0:01ddb8e35845 | 177 | return NG; |
kenjiArai | 0:01ddb8e35845 | 178 | } |
kenjiArai | 0:01ddb8e35845 | 179 | } |
kenjiArai | 0:01ddb8e35845 | 180 | #endif |