如何使用带有 PLL 的 HSE 与 STM32 使用 RTC 时钟

3

我正在使用STM32F0xx系列芯片,尝试让RTC工作。我连接了一个外部8MHz晶体,并使用PLL创建了一个48MHz的系统时钟。显然,我想将此时钟与RTC一起使用。我尝试了以下方法:

//(1) Write access for RTC registers
    //(2) Enable init phase
    //(3) Wait until it is allow to modify RTC register values
    //(4) set prescaler, 
    //(5) New time in TR
    //(6) Disable init phase
    //(7) Disable write access for RTC registers
    RTC->WPR = 0xCA;  //(1)
    RTC->WPR = 0x53;  //(1)
    RTC->ISR |= RTC_ISR_INIT;  //(2)
    while ((RTC->ISR & RTC_ISR_INITF) != RTC_ISR_INITF)  //(3)
    {
        //add time out here for a robust application
    }
    RCC->BDCR = RCC_BDCR_RTCSEL_HSE;
    RTC->PRER = 0x007C2E7C;  //(4)
    RTC->TR = RTC_TR_PM | 0x00000001;  //(5)
    RTC->ISR &=~ RTC_ISR_INIT;  //(6)
    RTC->WPR = 0xFE;  //(7)
    RTC->WPR = 0x64;  //(7)

在主循环中有一个无限for循环,该循环会使两个LED灯交替闪烁。没有RTC配置时,这可以正常工作,但只要我添加上述代码,它就无法正常工作。
如果我这样做,那么其余的代码就会出问题。我可以使用HSE吗?如果可以,我是否正确使用了预分频器?

为什么不使用ST标准库?那里已经实现了一个用于使用RTC的API。 - Étienne
我必须承认,我不是ST库的忠实粉丝,因为它有两个抽象级别。第一个是结构体,第二个是所有函数。此外,ST库只能使用LSE和LSI时钟选项,而不能使用我需要的HSI时钟。 - TracyB
你说过你想使用外部晶体,对吧?这是HSE,不是HSI,并且ST库支持它。(搜索RCC_RTCCLKSource_HSE_Div128)。 - Étienne
抱歉,我指的是HSE而不是HSI。我只有RCC_RTCCLKSource_HSE_Div32。这只是一个#define,对应着RCC_BDCR_RTCSEL_HSE,我正在使用这个定义来设置RCC->BDCR的值。 - TracyB
哦,抱歉我查看了STM32F1库而不是STM32F0。 - Étienne
显示剩余3条评论
1个回答

3

以下是使用STM HAL软件库实现STM32f429 RTC的HSE实际工作代码示例。这可以给你提供解决方案的线索。

请注意,在使用此代码之前,HSE必须已经被配置并用作频率源。

备注:在读取时,您应该不仅读取时间,还要读取日期。 例如: HAL_RTC_GetTime(&RTChandle, &RTCtime, FORMAT_BIN); //第一步 HAL_RTC_GetDate(&RTChandle, &RTCdate, FORMAT_BIN); //第二步,即使您不需要 否则寄存器将保持冻结状态(在这种情况下,您只能在调试器下看到滴答声,而在实际运行中看不到,因为调试器会读取两个寄存器)

// enable access to rtc register
HAL_PWR_EnableBkUpAccess();
// 1. 8Mhz oscillator (Source crystal! Not after PLL!) div by 8 = 1 Mhz
__HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_HSE_DIV8);
RTChandle.Instance = RTC;
RTChandle.Init.HourFormat = RTC_HOURFORMAT_24;
// 2. (1 Mhz / 125) = 7999 ticks per second
RTChandle.Init.AsynchPrediv = 125 - 1;
RTChandle.Init.SynchPrediv = 8000 - 1;
RTChandle.Init.OutPut = RTC_OUTPUT_DISABLE;
RTChandle.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
RTChandle.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;

// do init
HAL_RTC_Init(&RTChandle);
// enable hardware
__HAL_RCC_RTC_ENABLE();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接