请问stm32L152芯片怎么使用RTC制作万年历

2019-07-14 13:12发布

大家好,小弟在这里有个疑问,看了正点原子FI的RTC实时时钟试验后,想自己写一个STM32L152的实时时钟(万年历),但不知道如何配置,网上的资源大都是用Cube来写的,但小弟我想不用Cube来写。求大神们指点一下。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
18条回答
jsgssg
1楼-- · 2019-07-16 15:20
TOPCB 发表于 2019-4-19 14:49
楼主,你看的是103的例程吧。L152是不一样的。

恩恩。版主。我是想按照F103的例程写一个L152的万年历。现在就是在配置上还有写中断服务函数上卡壳了,不知道用什么来代替F103的秒中断和RTC-Setcounter()函数。因为在L152里面没找到秒中断标志位和溢出中断的标志位。代码如下:

void RTC_IRQHandler(void)
{                 
        if (RTC_GetITStatus(RTC_IT_SEC) != RESET)
        {                                                       
                RTC_Get();//¸üÐÂʱ¼ä   
        }
        if(RTC_GetITStatus(RTC_IT_ALRA)!= RESET)
        {
                RTC_ClearITPendingBit(RTC_IT_ALRA);                                    
          }                                                                                                    
        RTC_ClearITPendingBit(RTC_IT_SEC|RTC_IT_OW);               
}

然后看了资料有人这么写的。

   //配置自动定时功能
    /* 中断配置 *******************************************************/
    EXTI_ClearITPendingBit(EXTI_Line20);
    EXTI_InitStructure.EXTI_Line = EXTI_Line20;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);

    /*使能 RTC Wakeup Interrupt */
    NVIC_InitStructure.NVIC_IRQChannel = RTC_WKUP_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    /* RTC 唤醒中端配置: Clock Source: RTCDiv_16, Wakeup Time Base: 4s */
    RTC_WakeUpClockConfig(RTC_WakeUpClock_RTCCLK_Div16);
    RTC_SetWakeUpCounter(0x1FFF);//0x1FFF = 8191; 4s = (8191+1)*(1/(32768/16))

    /* 使能 the Wakeup Interrupt */
    RTC_ITConfig(RTC_IT_WUT, ENABLE);  
}



使能了RTC的定时中断,那么就要编写中断服务子程序,如下:
void RTC_WKUP_IRQHandler(void)
{
  if(RTC_GetITStatus(RTC_IT_WUT) != RESET)
  {
    RTC_ClearITPendingBit(RTC_IT_WUT);
    EXTI_ClearITPendingBit(EXTI_Line20);
  }
}

但我不懂下面的那种写法中为什么还要给唤醒时钟进行分频,这样用能不能实现跟F103一样的效果。
版主  你写的代码是用cube写的吗?
Green_LJ
2楼-- · 2019-07-16 15:42
 精彩回答 2  元偷偷看……
jsgssg
3楼-- · 2019-07-16 20:24
Green_LJ 发表于 2019-4-19 15:15
STM32L152的rtc是真正的rtc,只要配置完成,就可以直接读取数据了

想问下大佬该怎么配置呢?能给个模板么
jsgssg
4楼-- · 2019-07-17 01:04
Green_LJ 发表于 2019-4-19 15:15
STM32L152的rtc是真正的rtc,只要配置完成,就可以直接读取数据了

版主,不要再写其他的函数了么?比如说像F103例程里面的u8 RTC_Set(u16 syear,u8 smon,u8 sday,u8 hour,u8 min,u8 sec),u8 RTC_Get(void),u8 RTC_Get_Week(u16 year,u8 month,u8 day)的这些函数。能帮忙写一下么?不用Cube写
Green_LJ
5楼-- · 2019-07-17 02:30
jsgssg 发表于 2019-4-19 15:39
版主,不要再写其他的函数了么?比如说像F103例程里面的u8 RTC_Set(u16 syear,u8 smon,u8 sday,u8 hour,u8 min,u8 sec),u8 RTC_Get(void),u8 RTC_Get_Week(u16 year,u8 month,u8 day)的这些函数。能帮忙写一下么?不用Cube写

L1中直接读取寄存器,库函数里面也有函数,直接可以读取年月日时分秒星期
TOPCB
6楼-- · 2019-07-17 04:44
我给出的配置里面已经写了如何设置年月日、时分秒、星期了。需要的时候直接读取时间和日期即可,不需要进行将秒转换为日期了。

一周热门 更多>