如何设置 stm32f4 实时时钟(RTC)以在亚秒寄存器中获取有效值?

Posted

技术标签:

【中文标题】如何设置 stm32f4 实时时钟(RTC)以在亚秒寄存器中获取有效值?【英文标题】:How to setup the stm32f4 real time clock(RTC) to get valid values in the sub second register? 【发布时间】:2019-08-27 07:51:00 【问题描述】:

我喜欢以高分辨率使用我的 stm32f412 RTC。对于测试,我使用 CubeMX 代码生成器。 为了读取我正在使用的 rtc 时间戳

// get sub second
ss = (u16_t) LL_RTC_TS_GetSubSecond(RTC);
// 0x00HHMMSS in bcd format
t = LL_RTC_TIME_Get(RTC);
// 0xWWDDMMYY
d = LL_RTC_DATE_Get(RTC);

rtc 在 PC14 和 PC15(LSE 输入)上使用 32.768kHz 振荡器。设置代码如下:

static LL_RTC_InitTypeDef const initData = 
    .HourFormat = LL_RTC_HOURFORMAT_24HOUR,
    /* prescaler values for LSE @ 32768 Hz */
    .AsynchPrescaler = 0x7F,
    .SynchPrescaler = 0x00FF
;

LL_PWR_EnableBkUpAccess();
LL_RCC_ForceBackupDomainReset();
LL_RCC_ReleaseBackupDomainReset();

LL_RCC_LSE_Enable();

/* Wait untill LSE is ready */
while (LL_RCC_LSE_IsReady() != 1) ;

LL_RCC_SetRTCClockSource(LL_RCC_RTC_CLKSOURCE_LSE);

LL_RCC_EnableRTC();

if (LL_RTC_DeInit(RTC) != SUCCESS) 
    return -EIO;


if (LL_RTC_Init(RTC, (LL_RTC_InitTypeDef *)&initData) != SUCCESS) 
    return -EIO;


LL_RTC_EnableShadowRegBypass(RTC);

我猜我在设置中遗漏了一些步骤。 有什么想法吗?

【问题讨论】:

【参考方案1】:

使用正确的 API 函数有助于:

// get sub section
ss = (u16_t) LL_RTC_TIME_GetSubSecond(RTC);
// 0x00HHMMSS in bcd format
t = LL_RTC_TIME_Get(RTC);
// 0xWWDDMMYY
d = LL_RTC_DATE_Get(RTC);

【讨论】:

以上是关于如何设置 stm32f4 实时时钟(RTC)以在亚秒寄存器中获取有效值?的主要内容,如果未能解决你的问题,请参考以下文章

STM32F4 HAL库开发 -- RTC

STM32F4 HAL库开发 -- RTC

STM32F4 HAL库开发 -- RTC

STM32-RTC实时时钟-毫秒计时实现

STM32F0xx_RTC实时时钟配置详细过程

stm32之时钟控制