Check RTC LSE(External Xtal, 32.768kHz) mode

Dependencies:   mbed CheckRTC

Please refer follow links.
My notebook
http://developer.mbed.org/users/kenjiArai/notebook/nucleo-series-clock-structure-and-xtal-oscillation/
Q&A for RTC Xtal
http://developer.mbed.org/questions/4531/RTC-External-Crystal-Nucleo/

Committer:
kenjiArai
Date:
Sat Oct 25 05:42:45 2014 +0000
Revision:
1:eaa3c3f36c03
Parent:
0:bad75bd13618
Child:
2:8b6a8cfa173a
RTC Clock test program only for Nucleo F401RE & F411RE.  Standard Lib. cannot support a LSE(External 32.768kHz Xtal) mode due to short time-out setting (Other words, capacitor's value for Xtal are not optimize due to poor design consideration)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 1:eaa3c3f36c03 1 /*
kenjiArai 1:eaa3c3f36c03 2 * mbed Application program
kenjiArai 1:eaa3c3f36c03 3 * RTC Clock test
kenjiArai 1:eaa3c3f36c03 4 *
kenjiArai 1:eaa3c3f36c03 5 * Copyright (c) 2010-2014 Kenji Arai / JH1PJL
kenjiArai 1:eaa3c3f36c03 6 * http://www.page.sannet.ne.jp/kenjia/index.html
kenjiArai 1:eaa3c3f36c03 7 * http://mbed.org/users/kenjiArai/
kenjiArai 1:eaa3c3f36c03 8 * Created: October 24th, 2014
kenjiArai 1:eaa3c3f36c03 9 * Revised: October 25th, 2014
kenjiArai 1:eaa3c3f36c03 10 *
kenjiArai 1:eaa3c3f36c03 11 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
kenjiArai 1:eaa3c3f36c03 12 * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
kenjiArai 1:eaa3c3f36c03 13 * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
kenjiArai 1:eaa3c3f36c03 14 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
kenjiArai 1:eaa3c3f36c03 15 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
kenjiArai 1:eaa3c3f36c03 16 */
bcostm 0:bad75bd13618 17
kenjiArai 1:eaa3c3f36c03 18 // Include ---------------------------------------------------------------------------------------
kenjiArai 1:eaa3c3f36c03 19 #include "mbed.h"
kenjiArai 1:eaa3c3f36c03 20 #include "rtc_api.h"
bcostm 0:bad75bd13618 21
kenjiArai 1:eaa3c3f36c03 22 // Definition ------------------------------------------------------------------------------------
kenjiArai 1:eaa3c3f36c03 23 #define STANDARD_FUNCTION // Use standard library prepared by STMicroelectronics
kenjiArai 1:eaa3c3f36c03 24 //#define SPECIAL_FUNCTION // Use special function. Time out is much longer than standard function
kenjiArai 1:eaa3c3f36c03 25
kenjiArai 1:eaa3c3f36c03 26 #define BAUD(x) pc.baud(x)
kenjiArai 1:eaa3c3f36c03 27 #define GETC(x) pc.getc(x)
kenjiArai 1:eaa3c3f36c03 28 #define PUTC(x) pc.putc(x)
kenjiArai 1:eaa3c3f36c03 29 #define PRINTF(...) pc.printf(__VA_ARGS__)
kenjiArai 1:eaa3c3f36c03 30 #define READABLE(x) pc.readable(x)
kenjiArai 1:eaa3c3f36c03 31
kenjiArai 1:eaa3c3f36c03 32 #define TIMEOUT ((uint32_t)5000)
bcostm 0:bad75bd13618 33
kenjiArai 1:eaa3c3f36c03 34 // Object ----------------------------------------------------------------------------------------
kenjiArai 1:eaa3c3f36c03 35 Serial pc(USBTX, USBRX);
kenjiArai 1:eaa3c3f36c03 36 DigitalOut myled(LED1);
kenjiArai 1:eaa3c3f36c03 37 Timer t;
kenjiArai 1:eaa3c3f36c03 38
kenjiArai 1:eaa3c3f36c03 39 // RAM -------------------------------------------------------------------------------------------
kenjiArai 1:eaa3c3f36c03 40
kenjiArai 1:eaa3c3f36c03 41 // ROM / Constant data ---------------------------------------------------------------------------
kenjiArai 1:eaa3c3f36c03 42
kenjiArai 1:eaa3c3f36c03 43 // Function prototypes ---------------------------------------------------------------------------
kenjiArai 1:eaa3c3f36c03 44 uint32_t Set_RTC_LSI(void);
kenjiArai 1:eaa3c3f36c03 45 void rtc_external_osc_init(void);
kenjiArai 1:eaa3c3f36c03 46 uint32_t Set_RTC_LSE(void);
bcostm 0:bad75bd13618 47
kenjiArai 1:eaa3c3f36c03 48 //-------------------------------------------------------------------------------------------------
kenjiArai 1:eaa3c3f36c03 49 // Control Program
kenjiArai 1:eaa3c3f36c03 50 //-------------------------------------------------------------------------------------------------
kenjiArai 1:eaa3c3f36c03 51 int main()
kenjiArai 1:eaa3c3f36c03 52 {
kenjiArai 1:eaa3c3f36c03 53 while(true)
kenjiArai 1:eaa3c3f36c03 54 {
kenjiArai 1:eaa3c3f36c03 55 PRINTF("Select RTC clock source\r\n");
kenjiArai 1:eaa3c3f36c03 56 t.reset();
kenjiArai 1:eaa3c3f36c03 57 t.start();
kenjiArai 1:eaa3c3f36c03 58 #if defined(STANDARD_FUNCTION)
kenjiArai 1:eaa3c3f36c03 59 rtc_init();
kenjiArai 1:eaa3c3f36c03 60 t.stop();
kenjiArai 1:eaa3c3f36c03 61 PRINTF("Use standard function by STM\r\n");
kenjiArai 1:eaa3c3f36c03 62 PRINTF("The time taken was %f sec. (Time-out setting:%f sec.)\r\n",
kenjiArai 1:eaa3c3f36c03 63 t.read(), (float)LSE_TIMEOUT_VALUE/1000);
kenjiArai 1:eaa3c3f36c03 64 #elif defined(SPECIAL_FUNCTION)
kenjiArai 1:eaa3c3f36c03 65 rtc_external_osc_init();
kenjiArai 1:eaa3c3f36c03 66 t.stop();
kenjiArai 1:eaa3c3f36c03 67 PRINTF("Use special function (extend time-out)\r\n");
kenjiArai 1:eaa3c3f36c03 68 PRINTF("The time taken was %f sec. (Time-out setting:%f sec.)\r\n",
kenjiArai 1:eaa3c3f36c03 69 t.read(), (float)(float)TIMEOUT/1000);
kenjiArai 1:eaa3c3f36c03 70 #endif
kenjiArai 1:eaa3c3f36c03 71 switch ((RCC->BDCR >> 8) & 0x03) {
kenjiArai 1:eaa3c3f36c03 72 case 0: // no clock
kenjiArai 1:eaa3c3f36c03 73 PRINTF("No clock");
kenjiArai 1:eaa3c3f36c03 74 break;
kenjiArai 1:eaa3c3f36c03 75 case 1: // LSE
kenjiArai 1:eaa3c3f36c03 76 PRINTF("Use LSE");
kenjiArai 1:eaa3c3f36c03 77 break;
kenjiArai 1:eaa3c3f36c03 78 case 2: // LSI
kenjiArai 1:eaa3c3f36c03 79 PRINTF("Use LSI");
kenjiArai 1:eaa3c3f36c03 80 break;
kenjiArai 1:eaa3c3f36c03 81 case 3: // HSE
kenjiArai 1:eaa3c3f36c03 82 PRINTF("Use HSE");
kenjiArai 1:eaa3c3f36c03 83 break;
kenjiArai 1:eaa3c3f36c03 84 default: // Not come here
kenjiArai 1:eaa3c3f36c03 85 PRINTF("?");
kenjiArai 1:eaa3c3f36c03 86 break;
kenjiArai 1:eaa3c3f36c03 87 }
kenjiArai 1:eaa3c3f36c03 88 PRINTF("\r\n");
kenjiArai 1:eaa3c3f36c03 89 Set_RTC_LSI();
kenjiArai 1:eaa3c3f36c03 90 if (((RCC->BDCR >> 8) & 0x03) != 2) {
kenjiArai 1:eaa3c3f36c03 91 PRINTF("Please remove USB then re-plug again");
kenjiArai 1:eaa3c3f36c03 92 } else {
kenjiArai 1:eaa3c3f36c03 93 PRINTF("Use LSI again", (float)TIMEOUT/1000);
kenjiArai 1:eaa3c3f36c03 94 }
kenjiArai 1:eaa3c3f36c03 95 PRINTF("\r\nRepeat again? [y/n]\r\n");
kenjiArai 1:eaa3c3f36c03 96 PRINTF(" If yes, please pusch [RESET] buttom.\r\n If no, please hit any key.\r\n");
kenjiArai 1:eaa3c3f36c03 97 if (GETC()){
kenjiArai 1:eaa3c3f36c03 98 break;
kenjiArai 1:eaa3c3f36c03 99 }
kenjiArai 1:eaa3c3f36c03 100 }
kenjiArai 1:eaa3c3f36c03 101 PRINTF("next\r\n");
kenjiArai 1:eaa3c3f36c03 102 #if defined(STANDARD_FUNCTION)
kenjiArai 1:eaa3c3f36c03 103 rtc_init();
kenjiArai 1:eaa3c3f36c03 104 #elif defined(SPECIAL_FUNCTION)
kenjiArai 1:eaa3c3f36c03 105 rtc_external_osc_init();
kenjiArai 1:eaa3c3f36c03 106 #endif
kenjiArai 1:eaa3c3f36c03 107 }
bcostm 0:bad75bd13618 108
kenjiArai 1:eaa3c3f36c03 109 uint32_t Set_RTC_LSE(void)
kenjiArai 1:eaa3c3f36c03 110 {
kenjiArai 1:eaa3c3f36c03 111 uint32_t timeout = 0;
kenjiArai 1:eaa3c3f36c03 112
kenjiArai 1:eaa3c3f36c03 113 //---------------------------- LSE Configuration -------------------------
kenjiArai 1:eaa3c3f36c03 114 // Enable Power Clock
kenjiArai 1:eaa3c3f36c03 115 __PWR_CLK_ENABLE();
kenjiArai 1:eaa3c3f36c03 116 // Enable write access to Backup domain
kenjiArai 1:eaa3c3f36c03 117 PWR->CR |= PWR_CR_DBP;
kenjiArai 1:eaa3c3f36c03 118 // Wait for Backup domain Write protection disable
kenjiArai 1:eaa3c3f36c03 119 timeout = HAL_GetTick() + DBP_TIMEOUT_VALUE;
kenjiArai 1:eaa3c3f36c03 120 while((PWR->CR & PWR_CR_DBP) == RESET){
kenjiArai 1:eaa3c3f36c03 121 if(HAL_GetTick() >= timeout){
kenjiArai 1:eaa3c3f36c03 122 return 0;
kenjiArai 1:eaa3c3f36c03 123 }
kenjiArai 1:eaa3c3f36c03 124 }
kenjiArai 1:eaa3c3f36c03 125 // Reset LSEON and LSEBYP bits before configuring the LSE ----------------
kenjiArai 1:eaa3c3f36c03 126 __HAL_RCC_LSE_CONFIG(RCC_LSE_OFF);
kenjiArai 1:eaa3c3f36c03 127 // Get timeout
kenjiArai 1:eaa3c3f36c03 128 timeout = HAL_GetTick() + ((uint32_t)5000);
kenjiArai 1:eaa3c3f36c03 129 // Wait till LSE is ready
kenjiArai 1:eaa3c3f36c03 130 while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) != RESET){
kenjiArai 1:eaa3c3f36c03 131 if(HAL_GetTick() >= timeout) {
kenjiArai 1:eaa3c3f36c03 132 return 0;
kenjiArai 1:eaa3c3f36c03 133 }
kenjiArai 1:eaa3c3f36c03 134 }
kenjiArai 1:eaa3c3f36c03 135 // Set the new LSE configuration -----------------------------------------
kenjiArai 1:eaa3c3f36c03 136 __HAL_RCC_LSE_CONFIG(RCC_LSE_ON);
kenjiArai 1:eaa3c3f36c03 137 // Get timeout
kenjiArai 1:eaa3c3f36c03 138 timeout = HAL_GetTick() + ((uint32_t)5000);
kenjiArai 1:eaa3c3f36c03 139 // Wait till LSE is ready
kenjiArai 1:eaa3c3f36c03 140 while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET){
kenjiArai 1:eaa3c3f36c03 141 if(HAL_GetTick() >= timeout){
kenjiArai 1:eaa3c3f36c03 142 return 0;
kenjiArai 1:eaa3c3f36c03 143 }
kenjiArai 1:eaa3c3f36c03 144 }
kenjiArai 1:eaa3c3f36c03 145 return 1;
kenjiArai 1:eaa3c3f36c03 146 }
bcostm 0:bad75bd13618 147
kenjiArai 1:eaa3c3f36c03 148 void rtc_external_osc_init(void)
kenjiArai 1:eaa3c3f36c03 149 {
kenjiArai 1:eaa3c3f36c03 150 // Enable Power clock
kenjiArai 1:eaa3c3f36c03 151 __PWR_CLK_ENABLE();
kenjiArai 1:eaa3c3f36c03 152 // Enable access to Backup domain
kenjiArai 1:eaa3c3f36c03 153 HAL_PWR_EnableBkUpAccess();
kenjiArai 1:eaa3c3f36c03 154 // Reset Backup domain
kenjiArai 1:eaa3c3f36c03 155 __HAL_RCC_BACKUPRESET_FORCE();
kenjiArai 1:eaa3c3f36c03 156 __HAL_RCC_BACKUPRESET_RELEASE();
kenjiArai 1:eaa3c3f36c03 157 // Enable LSE Oscillator
kenjiArai 1:eaa3c3f36c03 158 if (Set_RTC_LSE()) {
kenjiArai 1:eaa3c3f36c03 159 // Connect LSE to RTC
kenjiArai 1:eaa3c3f36c03 160 __HAL_RCC_RTC_CLKPRESCALER(RCC_RTCCLKSOURCE_LSE);
kenjiArai 1:eaa3c3f36c03 161 __HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_LSE);
bcostm 0:bad75bd13618 162 }
bcostm 0:bad75bd13618 163 }
kenjiArai 1:eaa3c3f36c03 164
kenjiArai 1:eaa3c3f36c03 165 uint32_t Set_RTC_LSI(void)
kenjiArai 1:eaa3c3f36c03 166 {
kenjiArai 1:eaa3c3f36c03 167 uint32_t timeout = 0;
kenjiArai 1:eaa3c3f36c03 168
kenjiArai 1:eaa3c3f36c03 169 // Enable Power clock
kenjiArai 1:eaa3c3f36c03 170 __PWR_CLK_ENABLE();
kenjiArai 1:eaa3c3f36c03 171 // Enable access to Backup domain
kenjiArai 1:eaa3c3f36c03 172 HAL_PWR_EnableBkUpAccess();
kenjiArai 1:eaa3c3f36c03 173 // Reset Backup domain
kenjiArai 1:eaa3c3f36c03 174 __HAL_RCC_BACKUPRESET_FORCE();
kenjiArai 1:eaa3c3f36c03 175 __HAL_RCC_BACKUPRESET_RELEASE();
kenjiArai 1:eaa3c3f36c03 176 // Enable Power Clock
kenjiArai 1:eaa3c3f36c03 177 __PWR_CLK_ENABLE();
kenjiArai 1:eaa3c3f36c03 178 // Enable write access to Backup domain
kenjiArai 1:eaa3c3f36c03 179 PWR->CR |= PWR_CR_DBP;
kenjiArai 1:eaa3c3f36c03 180 // Wait for Backup domain Write protection disable
kenjiArai 1:eaa3c3f36c03 181 timeout = HAL_GetTick() + DBP_TIMEOUT_VALUE;
kenjiArai 1:eaa3c3f36c03 182 while((PWR->CR & PWR_CR_DBP) == RESET) {
kenjiArai 1:eaa3c3f36c03 183 if(HAL_GetTick() >= timeout) {
kenjiArai 1:eaa3c3f36c03 184 return 0;
kenjiArai 1:eaa3c3f36c03 185 }
kenjiArai 1:eaa3c3f36c03 186 }
kenjiArai 1:eaa3c3f36c03 187 __HAL_RCC_LSE_CONFIG(RCC_LSE_OFF);
kenjiArai 1:eaa3c3f36c03 188 // Enable LSI
kenjiArai 1:eaa3c3f36c03 189 __HAL_RCC_LSI_ENABLE();
kenjiArai 1:eaa3c3f36c03 190 timeout = HAL_GetTick() + TIMEOUT;
kenjiArai 1:eaa3c3f36c03 191 // Wait till LSI is ready
kenjiArai 1:eaa3c3f36c03 192 while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) == RESET) {
kenjiArai 1:eaa3c3f36c03 193 if(HAL_GetTick() >= timeout) {
kenjiArai 1:eaa3c3f36c03 194 return 0;
kenjiArai 1:eaa3c3f36c03 195 }
kenjiArai 1:eaa3c3f36c03 196 }
kenjiArai 1:eaa3c3f36c03 197 // Connect LSI to RTC
kenjiArai 1:eaa3c3f36c03 198 __HAL_RCC_RTC_CLKPRESCALER(RCC_RTCCLKSOURCE_LSI);
kenjiArai 1:eaa3c3f36c03 199 __HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_LSI);
kenjiArai 1:eaa3c3f36c03 200 return 1;
kenjiArai 1:eaa3c3f36c03 201 }