[XXX_F10XRB] enhance RTC API

Add a define to select between LSE or LSI
dbestm 2016-04-04 16:11:02 +02:00 committed by Marcus Shawcroft
parent 10c9469b6d
commit a3ff2c53fe
4 changed files with 32 additions and 22 deletions

View File

@ -121,7 +121,7 @@
#if !defined (LSE_STARTUP_TIMEOUT) #if !defined (LSE_STARTUP_TIMEOUT)
#define LSE_STARTUP_TIMEOUT ((uint32_t)100) /*!< Time out for LSE start up, in ms */ #define LSE_STARTUP_TIMEOUT ((uint32_t)5000) /*!< Time out for LSE start up, in ms */
#endif /* HSE_STARTUP_TIMEOUT */ #endif /* HSE_STARTUP_TIMEOUT */

View File

@ -48,6 +48,7 @@
#define DEVICE_SPISLAVE 1 #define DEVICE_SPISLAVE 1
#define DEVICE_RTC 1 #define DEVICE_RTC 1
#define DEVICE_RTC_LSI 0
#define DEVICE_PWMOUT 1 #define DEVICE_PWMOUT 1

View File

@ -48,6 +48,7 @@
#define DEVICE_SPISLAVE 1 #define DEVICE_SPISLAVE 1
#define DEVICE_RTC 1 #define DEVICE_RTC 1
#define DEVICE_RTC_LSI 0
#define DEVICE_PWMOUT 1 #define DEVICE_PWMOUT 1

View File

@ -46,6 +46,19 @@ void rtc_init(void)
RtcHandle.Instance = RTC; RtcHandle.Instance = RTC;
#if !DEVICE_RTC_LSI
// Enable LSE Oscillator
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; // Mandatory, otherwise the PLL is reconfigured!
RCC_OscInitStruct.LSEState = RCC_LSE_ON; // External 32.768 kHz clock on OSC_IN/OSC_OUT
RCC_OscInitStruct.LSIState = RCC_LSI_OFF;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) == HAL_OK) { // Check if LSE has started correctly
// Connect LSE to RTC
__HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_LSE);
} else {
error("Cannot initialize RTC with LSE\n");
}
#else
// Enable Power clock // Enable Power clock
__HAL_RCC_PWR_CLK_ENABLE(); __HAL_RCC_PWR_CLK_ENABLE();
@ -55,27 +68,20 @@ void rtc_init(void)
// Reset Backup domain // Reset Backup domain
__HAL_RCC_BACKUPRESET_FORCE(); __HAL_RCC_BACKUPRESET_FORCE();
__HAL_RCC_BACKUPRESET_RELEASE(); __HAL_RCC_BACKUPRESET_RELEASE();
// Enable LSE Oscillator // Enable LSI clock
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE; RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI | RCC_OSCILLATORTYPE_LSE;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; // Mandatory, otherwise the PLL is reconfigured! RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; // Mandatory, otherwise the PLL is reconfigured!
RCC_OscInitStruct.LSEState = RCC_LSE_ON; // External 32.768 kHz clock on OSC_IN/OSC_OUT RCC_OscInitStruct.LSEState = RCC_LSE_OFF;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) == HAL_OK) { RCC_OscInitStruct.LSIState = RCC_LSI_ON;
// Connect LSE to RTC if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
__HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_LSE); error("Cannot initialize RTC with LSI\n");
} else { }
// Enable LSI clock // Connect LSI to RTC
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI | RCC_OSCILLATORTYPE_LSE; __HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_LSI);
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; // Mandatory, otherwise the PLL is reconfigured! // This value is LSI typical value. To be measured precisely using a timer input capture for example.
RCC_OscInitStruct.LSEState = RCC_LSE_OFF; #endif
RCC_OscInitStruct.LSIState = RCC_LSI_ON;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
error("RTC error: LSI clock initialization failed.");
}
// Connect LSI to RTC
__HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_LSI);
}
// Enable RTC // Enable RTC
__HAL_RCC_RTC_ENABLE(); __HAL_RCC_RTC_ENABLE();
@ -88,6 +94,7 @@ void rtc_init(void)
void rtc_free(void) void rtc_free(void)
{ {
#if DEVICE_RTC_LSI
// Enable Power clock // Enable Power clock
__PWR_CLK_ENABLE(); __PWR_CLK_ENABLE();
@ -100,6 +107,7 @@ void rtc_free(void)
// Disable access to Backup domain // Disable access to Backup domain
HAL_PWR_DisableBkUpAccess(); HAL_PWR_DisableBkUpAccess();
#endif
// Disable LSI and LSE clocks // Disable LSI and LSE clocks
RCC_OscInitTypeDef RCC_OscInitStruct; RCC_OscInitTypeDef RCC_OscInitStruct;