如何使用带有PLL的HSE将STC32与RTC时钟配合使用

时间:2014-07-07 13:06:21

标签: stm32 discovery real-time-clock

我正在使用stm32F0xx系列,并试图让RTC正常工作。我连接了一个外部8MHz晶振,并使用PLL创建一个48MHz的sysclk。显然我想把这个时钟用在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)

在主循环中有一个无限的,可以打开和关闭两个LED。如果没有RTC配置,这可以正常工作,但只要我在上面的代码中添加它就会停止工作。

如果我这样做,那么剩下的代码就会中断。我可以使用HSE,如果是这样,我是否正确使用了预分频器?

1 个答案:

答案 0 :(得分:2)

此示例来自在STM32f429上使用HSE for RTC的实际工作代码。它使用STM HAL软件库,但可以为您提供解决的线索。

请注意,在此代码之前,必须配置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();