Skip to content

Added getPrescaler( ); setPrescaler( ); for calibrating STM32F1xx during runtime. #38

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 8 commits into from
10 changes: 10 additions & 0 deletions src/STM32RTC.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,16 @@ void STM32RTC::setPrediv(int8_t predivA, int16_t predivS)
RTC_setPrediv(predivA, predivS);
}


void STM32RTC::getPrescaler(uint32_t *prescaler){
RTC_getPrescaler(prescaler);
}

void STM32RTC::setPrescaler(uint32_t prescaler){
RTC_setPrescaler(prescaler);
}


/**
* @brief enable the RTC alarm.
* @param match: Alarm_Match configuration
Expand Down
3 changes: 3 additions & 0 deletions src/STM32RTC.h
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,9 @@ class STM32RTC {
void getPrediv(int8_t *predivA, int16_t *predivS);
void setPrediv(int8_t predivA, int16_t predivS);

void getPrescaler(uint32_t *prescaler);
void setPrescaler(uint32_t prescaler);

bool isConfigured(void)
{
return _configured;
Expand Down
35 changes: 33 additions & 2 deletions src/rtc.c
Original file line number Diff line number Diff line change
Expand Up @@ -248,6 +248,37 @@ void RTC_getPrediv(int8_t *asynch, int16_t *synch)
#endif /* !STM32F1xx */
}

void RTC_setPrescaler(uint32_t prescaler)
{
#if defined(STM32F1xx)

/* if(prescaler==RTC_AUTO_1_SECOND) prescaler = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_RTC); // Automatically calculate for 1Sec
SET_BIT((RtcHandle).Instance->CRL, RTC_CRL_CNF);//__HAL_RTC_WRITEPROTECTION_DISABLE(RtcHandle);
MODIFY_REG(RtcHandle.Instance->PRLH, RTC_PRLH_PRL, (prescaler >> 16U));
MODIFY_REG(RtcHandle.Instance->PRLL, RTC_PRLL_PRL, (prescaler & RTC_PRLL_PRL));
CLEAR_BIT((RtcHandle).Instance->CRL, RTC_CRL_CNF);//__HAL_RTC_WRITEPROTECTION_ENABLE(RtcHandle);
*/

RtcHandle.Init.AsynchPrediv = prescaler;
HAL_RTC_Init(&RtcHandle);

#else
UNUSED(asynch);
UNUSED(synch);
#endif /* STM32F1xx */
}

void RTC_getPrescaler(uint32_t *prescaler)
{
#if defined(STM32F1xx)
// *prescaler = (((uint32_t) RtcHandle.Instance->PRLH << 16U) | READ_REG(RtcHandle.Instance->PRLL & RTC_PRLL_PRL));
*prescaler = RtcHandle.Init.AsynchPrediv;
#else
UNUSED(asynch);
UNUSED(synch);
#endif /* STM32F1xx */
}

#if !defined(STM32F1xx)
/**
* @brief Compute (a)synchronous prescaler
Expand Down Expand Up @@ -324,8 +355,8 @@ void RTC_init(hourFormat_t format, sourceClock_t source, bool reset)

#if defined(STM32F1xx)
/* Let HAL calculate the prescaler */
RtcHandle.Init.AsynchPrediv = RTC_AUTO_1_SECOND;
RtcHandle.Init.OutPut = RTC_OUTPUTSOURCE_NONE;
RtcHandle.Init.AsynchPrediv = RTC_AUTO_1_SECOND;// eg: 0x8000-1 =32768-1
RtcHandle.Init.OutPut = RTC_OUTPUTSOURCE_NONE; /* RTC_OUTPUTSOURCE_CALIBCLOCK; RTC_OUTPUTSOURCE_NONE; RTC_OUTPUTSOURCE_ALARM; RTC_OUTPUTSOURCE_SECOND */
UNUSED(format);
#else
if (format == HOUR_FORMAT_12) {
Expand Down
3 changes: 3 additions & 0 deletions src/rtc.h
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,9 @@ void RTC_SetClockSource(sourceClock_t source);
void RTC_getPrediv(int8_t *asynch, int16_t *synch);
void RTC_setPrediv(int8_t asynch, int16_t synch);

void RTC_getPrescaler(uint32_t *prescaler);
void RTC_setPrescaler(uint32_t prescaler);

void RTC_init(hourFormat_t format, sourceClock_t source, bool reset);
void RTC_DeInit(void);
bool RTC_IsTimeSet(void);
Expand Down