RTC. Some bugs fixed.
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@3590 35acf78f-673a-0410-8e92-d51de3d6d3f4
This commit is contained in:
parent
28cb4b4849
commit
ea9053eb9e
|
@ -132,6 +132,7 @@ void rtc_lld_init(void){
|
||||||
}
|
}
|
||||||
|
|
||||||
#if STM32_RTC == STM32_RTC_LSE
|
#if STM32_RTC == STM32_RTC_LSE
|
||||||
|
#define RTC_CLK STM32_LSECLK
|
||||||
if (!(RCC->BDCR & RCC_BDCR_LSEON)) {
|
if (!(RCC->BDCR & RCC_BDCR_LSEON)) {
|
||||||
RCC->BDCR |= RCC_BDCR_LSEON;
|
RCC->BDCR |= RCC_BDCR_LSEON;
|
||||||
while (!(RCC->BDCR & RCC_BDCR_LSERDY))
|
while (!(RCC->BDCR & RCC_BDCR_LSERDY))
|
||||||
|
@ -139,6 +140,7 @@ void rtc_lld_init(void){
|
||||||
}
|
}
|
||||||
preload = STM32_LSECLK - 1;
|
preload = STM32_LSECLK - 1;
|
||||||
#elif STM32_RTC == STM32_RTC_LSI
|
#elif STM32_RTC == STM32_RTC_LSI
|
||||||
|
#define RTC_CLK STM32_LSICLK
|
||||||
/* TODO: Move the LSI clock initialization in the HAL low level driver.*/
|
/* TODO: Move the LSI clock initialization in the HAL low level driver.*/
|
||||||
RCC->CSR |= RCC_CSR_LSION;
|
RCC->CSR |= RCC_CSR_LSION;
|
||||||
while (!(RCC->CSR & RCC_CSR_LSIRDY))
|
while (!(RCC->CSR & RCC_CSR_LSIRDY))
|
||||||
|
@ -146,12 +148,13 @@ void rtc_lld_init(void){
|
||||||
/* According to errata sheet we must wait additional 100 uS for
|
/* According to errata sheet we must wait additional 100 uS for
|
||||||
stabilization.
|
stabilization.
|
||||||
TODO: Change this code, software loops are not reliable.*/
|
TODO: Change this code, software loops are not reliable.*/
|
||||||
uint32_t tmo = (STM32_SYSCLK / 1000000) * 100;
|
volatile uint32_t tmo = (STM32_SYSCLK / 1000000) * 100;
|
||||||
while (tmo--)
|
while (tmo--)
|
||||||
;
|
;
|
||||||
preload = STM32_LSICLK - 1;
|
preload = STM32_LSICLK - 1;
|
||||||
#elif STM32_RTC == STM32_RTC_HSE
|
#elif STM32_RTC == STM32_RTC_HSE
|
||||||
preload = (STM32_HSICLK / 128) - 1;
|
#define RTC_CLK (STM32_HSECLK / 128)
|
||||||
|
preload = (STM32_HSECLK / 128) - 1;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Selects clock source (previously enabled and stabilized).*/
|
/* Selects clock source (previously enabled and stabilized).*/
|
||||||
|
@ -213,19 +216,28 @@ void rtc_lld_set_time(RTCDriver *rtcp, const RTCTime *timespec) {
|
||||||
* @brief Get current time.
|
* @brief Get current time.
|
||||||
*
|
*
|
||||||
* @param[in] rtcp pointer to RTC driver structure
|
* @param[in] rtcp pointer to RTC driver structure
|
||||||
* @param[out] timespec pointer to a @p RTCTime structure
|
* @param[in] timespec pointer to a @p RTCTime structure
|
||||||
*
|
*
|
||||||
* @notapi
|
* @notapi
|
||||||
*/
|
*/
|
||||||
void rtc_lld_get_time(RTCDriver *rtcp, RTCTime *timespec) {
|
void rtc_lld_get_time(RTCDriver *rtcp, RTCTime *timespec) {
|
||||||
uint32_t time_frac;
|
|
||||||
|
|
||||||
(void)rtcp;
|
(void)rtcp;
|
||||||
|
|
||||||
|
uint32_t time_frac;
|
||||||
|
|
||||||
|
READ_REGISTERS:
|
||||||
|
chSysLock();
|
||||||
|
timespec->tv_sec = ((uint32_t)(RTC->CNTH) << 16) + RTC->CNTL;
|
||||||
time_frac = (((uint32_t)RTC->DIVH) << 16) + (uint32_t)RTC->DIVL;
|
time_frac = (((uint32_t)RTC->DIVH) << 16) + (uint32_t)RTC->DIVL;
|
||||||
timespec->tv_msec = (uint16_t)(((STM32_LSECLK - time_frac) * 1000) /
|
chSysUnlock();
|
||||||
STM32_LSECLK);
|
|
||||||
timespec->tv_sec = (RTC->CNTH << 16) + RTC->CNTL;
|
/* If second counter updated between reading of integer and fractional parts
|
||||||
|
* we must reread both values. */
|
||||||
|
if((timespec->tv_sec) != (((uint32_t)(RTC->CNTH) << 16) + RTC->CNTL)){
|
||||||
|
goto READ_REGISTERS;
|
||||||
|
}
|
||||||
|
|
||||||
|
timespec->tv_msec = (uint16_t)(((RTC_CLK - 1 - time_frac) * 1000) / RTC_CLK);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue