Skip to content

Commit

Permalink
[XXX_F10XRB] enhance RTC API
Browse files Browse the repository at this point in the history
Add a define to select between LSE or LSI
  • Loading branch information
dbestm committed Apr 4, 2016
1 parent 76649d8 commit 7f6c0b8
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 22 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@


#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 */


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@
#define DEVICE_SPISLAVE 1

#define DEVICE_RTC 1
#define DEVICE_RTC_LSI 0

#define DEVICE_PWMOUT 1

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@
#define DEVICE_SPISLAVE 1

#define DEVICE_RTC 1
#define DEVICE_RTC_LSI 0

#define DEVICE_PWMOUT 1

Expand Down
50 changes: 29 additions & 21 deletions libraries/mbed/targets/hal/TARGET_STM/TARGET_STM32F1/rtc_api.c
Original file line number Diff line number Diff line change
Expand Up @@ -46,36 +46,42 @@ void rtc_init(void)

RtcHandle.Instance = RTC;

// Enable Power clock
__HAL_RCC_PWR_CLK_ENABLE();

// Enable access to Backup domain
HAL_PWR_EnableBkUpAccess();

// Reset Backup domain
__HAL_RCC_BACKUPRESET_FORCE();
__HAL_RCC_BACKUPRESET_RELEASE();

#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
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) == HAL_OK) {
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 {
// Enable LSI clock
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI | RCC_OSCILLATORTYPE_LSE;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; // Mandatory, otherwise the PLL is reconfigured!
RCC_OscInitStruct.LSEState = RCC_LSE_OFF;
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);
error("Cannot initialize RTC with LSE\n");
}
#else
// Enable Power clock
__HAL_RCC_PWR_CLK_ENABLE();

// Enable access to Backup domain
HAL_PWR_EnableBkUpAccess();

// Reset Backup domain
__HAL_RCC_BACKUPRESET_FORCE();
__HAL_RCC_BACKUPRESET_RELEASE();

// Enable LSI clock
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI | RCC_OSCILLATORTYPE_LSE;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; // Mandatory, otherwise the PLL is reconfigured!
RCC_OscInitStruct.LSEState = RCC_LSE_OFF;
RCC_OscInitStruct.LSIState = RCC_LSI_ON;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
error("Cannot initialize RTC with LSI\n");
}
// Connect LSI to RTC
__HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_LSI);
// This value is LSI typical value. To be measured precisely using a timer input capture for example.
#endif

// Enable RTC
__HAL_RCC_RTC_ENABLE();

Expand All @@ -88,6 +94,7 @@ void rtc_init(void)

void rtc_free(void)
{
#if DEVICE_RTC_LSI
// Enable Power clock
__PWR_CLK_ENABLE();

Expand All @@ -100,6 +107,7 @@ void rtc_free(void)

// Disable access to Backup domain
HAL_PWR_DisableBkUpAccess();
#endif

// Disable LSI and LSE clocks
RCC_OscInitTypeDef RCC_OscInitStruct;
Expand Down

0 comments on commit 7f6c0b8

Please sign in to comment.