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:
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?

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