如何将RTC时钟与STM32一起使用,将HSE与PLL一起使用

如何将RTC时钟与STM32一起使用,将HSE与PLL一起使用,stm32,discovery,real-time-clock,Stm32,Discovery,Real Time Clock,我正在使用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,

我正在使用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吗?如果可以,我是否正确使用了预分流器?

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

请注意,在此代码之前,必须配置HSE并将其用作频率源

备注:阅读时,不仅要看时间,还要看日期。 即。: HAL_RTC_GetTime(&rtchHandle,&rtchTime,FORMAT_BIN)//第一 HAL_RTC_GetDate(&RTChandle,&RTCdate,FORMAT_BIN)//第二,即使你不需要 否则,寄存器将保持冻结状态(在这种情况下,您只会在调试器下看到记号,而不会在实际运行中看到记号,因为调试同时读取两个寄存器)

//启用对rtc寄存器的访问
HAL_PWR_EnableBkUpAccess();
// 1. 8Mhz振荡器(源晶体!不在PLL之后!)除以8=1MHz
__HAL_RCC_RTC_配置(RCC_RTCCLKSOURCE_HSE_DIV8);
rtchHandle.Instance=RTC;
rtchHandle.Init.HourFormat=RTC\u HourFormat\u 24;
// 2. (1 Mhz/125)=每秒7999个滴答声
rtchHandle.Init.AsynchPrediv=125-1;
rtchHandle.Init.SynchPrediv=8000-1;
rtchHandle.Init.OutPut=RTC\u OutPut\u DISABLE;
rtchHandle.Init.OutPutPolarity=RTC\u输出极性\u高;
rtchHandle.Init.OutPutType=RTC_OUTPUT_TYPE_OPENDRAIN;
//开始
HAL_RTC_Init(&rtchhandle);
//启用硬件
__HAL_RCC_RTC_ENABLE();

为什么不使用ST标准库?一个使用RTC的API已经在那里实现了。我必须承认我不是ST库的忠实粉丝,因为你有两个抽象层次。第一个是结构,第二个是所有函数。此外,ST库只有使用LSE和LSI时钟的选项。不是我需要的HSI时钟。你说你想用外置水晶,对吗?这是HSE,而不是HSI,由ST图书馆支持。(搜索RCC_RTCCLKSource_HSE_Div128)。抱歉,我的意思是HSE而不是HSI。我只有RCC\u RTCCLKSource\u HSE\u Div32。这只是一个#定义:RCC#BDCR#RTCSEL#HSE这是我在RCC->BDCR=RCC#BDCR#RTCSEL#HSEOh行中所做的对不起,我检查了STM32F1库而不是STM32F0。