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/

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?

UserRevisionLine numberNew 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