Imody 发表于 2017-7-5 19:49:59

stm32L152芯片使用RTC制作万年历

大家好,小弟在这里有个疑问,看了正点原子FI的RTC实时时钟试验后,想自己写一个STM32L152的实时时钟(万年历),但不知道如何配置,网上的资源大都是用Cube来写的,但小弟我想不用Cube来写。求大神们指点一下。

Imody 发表于 2017-7-5 19:52:23

希望能得到大神的指点,我QQ是1253414972:'(

zhao.zhao 发表于 2017-7-6 08:56:30

直接读出RTC内的秒数,然后就一样了

发表于 2017-7-6 09:31:26

stm32L152可以直接设置日期、时间、星期。设置以后会自动进行更新。

Imody 发表于 2017-7-6 12:49:45

zhao.zhao 发表于 2017-7-6 08:56
直接读出RTC内的秒数,然后就一样了

在STM32L152中 好像没有秒中断函数的吧,看了好久都没找到,只有图片里面的这些函数。还有清除中断位函数中的秒中断和溢出中断函数也没找到

Imody 发表于 2017-7-6 12:52:34

安 发表于 2017-7-6 09:31
stm32L152可以直接设置日期、时间、星期。设置以后会自动进行更新。

版主。在L152板子上配置的时候时钟分频的配置函数跟F1的板子好像不一样,但没找到具体是什么函数

zhao.zhao 发表于 2017-7-6 13:25:34

使用HAL库,也不用动什么脑筋,很好使

发表于 2017-7-6 13:46:21

都差不多,L152系列的例程里面都有了。如下代码:
RTC_InitTypeDef RTC_InitStructure;
RTC_TimeTypeDef RTC_TimeStruct;
        RTC_DateTypeDef RTC_DateStruct;
        uint32_t t;
        bool scc = FALSE;

/* Enable the PWR clock */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);

/* Allow access to RTC */
PWR_RTCAccessCmd(ENABLE);

/* Reset RTC Domain */
RCC_RTCResetCmd(ENABLE);
RCC_RTCResetCmd(DISABLE);

        /* Enable the LSE OSC */
RCC_LSEConfig(RCC_LSE_ON);
        t = Fun_GetTicks();
/* Wait till LSE is ready */
while(Fun_GetTicks()-t<2000)
{
                if(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == SET)
                {
                        /* Select the RTC Clock Source */
                        RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
                        scc = TRUE;
                        printf("LSE OK\n");
                        break;
                }
}
        if(scc == FALSE)
        {
                /* Enable the LSI OSC */
                RCC_LSICmd(ENABLE);
                t = Fun_GetTicks();
                /* Wait till LSI is ready */
                while(Fun_GetTicks()-t<2000)
                {
                        if(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == SET)
                        {                       
                                /* Select the RTC Clock Source */
                                RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
                                scc = TRUE;
                                printf("LSI OK\n");
                                break;
                        }
                }
        }
       
/* Enable the RTC Clock */
RCC_RTCCLKCmd(ENABLE);
       
/* Configure the RTC data register and RTC prescaler */
RTC_InitStructure.RTC_AsynchPrediv = 0x7F;
RTC_InitStructure.RTC_SynchPrediv= 0xFF;
RTC_InitStructure.RTC_HourFormat   = RTC_HourFormat_24;
RTC_Init(&RTC_InitStructure);
       
/* Set the time to 00h 00mn 00s AM */
RTC_TimeStruct.RTC_H12   = RTC_H12_AM;
RTC_TimeStruct.RTC_Hours   = hh;
RTC_TimeStruct.RTC_Minutes = mm;
RTC_TimeStruct.RTC_Seconds = ss;
RTC_SetTime(RTC_Format_BIN, &RTC_TimeStruct);       
       
/* Set the date */
RTC_DateStruct.RTC_WeekDay = RTC_Weekday_Monday;
        RTC_DateStruct.RTC_Year    = year;
        RTC_DateStruct.RTC_Month   = m;
        RTC_DateStruct.RTC_Date    = day;
RTC_SetDate(RTC_Format_BIN, &RTC_DateStruct);

       
/* Wait for RTC APB registers synchronisation */
RTC_WaitForSynchro();

Imody 发表于 2017-7-6 14:05:34

zhao.zhao 发表于 2017-7-6 13:25
使用HAL库,也不用动什么脑筋,很好使

恩恩。是的。直接用stm32cube来配置的话很容易就弄好了。:lol但主要是想不用cube然后自己弄一个写一个万年历的。谢谢提醒啦

Imody 发表于 2017-7-6 14:23:42

安 发表于 2017-7-6 13:46
都差不多,L152系列的例程里面都有了。如下代码:

版主,我想问下时钟分频那里为什么是0X7F0XFF。查了一下是同步的跟异步的,到时候用的是32.768K的外部晶振吧,原子是直接用的这个函数RTC_SetPrescaler()。那为什么要设置同步跟异步的那两个数呢。 L系列开发板没有秒中断函数,我查了一下用时间戳中断函数好像也行的,那我该怎么配置呢
页: [1] 2 3
查看完整版本: stm32L152芯片使用RTC制作万年历