发表于 2017-7-6 14:35:48

手册中写了,The maximum resolution allowed (30.52 μs with a 32768 Hz clock) is obtained with PREDIV_S set to 0x7FFF.
用秒中断做什么?要根据实际情况来进行设置。

Imody 发表于 2017-7-6 15:00:14

安 发表于 2017-7-6 14:35
手册中写了,The maximum resolution allowed (30.52 μs with a 32768 Hz clock) is obtained with PREDIV ...

就像图中的打×和感叹号的语句一样,编译的时候是不通过的。我是直接把原子的代码复制过来,然后改一些地方。但现在这些地方找不到对应的函数

Imody 发表于 2017-7-6 15:07:55

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

好像懂了,里面的这个两个数是跟这句话有关的吧。RTC_PRER register: Write first the synchronous value and
then write the asynchronous。 然后LSE = 32.768 kHz,PREDIV_A 127=0x7F。 PREDIV_S[12:0】 255=0xFF.这么设置的话正好外部晶振的频率是32768HZ。

发表于 2017-7-6 16:46:14

楼主,你看的是103的例程吧。L152是不一样的。

Imody 发表于 2017-7-6 17:18:44

安 发表于 2017-7-6 16:46
楼主,你看的是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写的吗?

freeelectron 发表于 2017-7-6 19:05:55

STM32L152的rtc是真正的rtc,只要配置完成,就可以直接读取数据了:loveliness:

Imody 发表于 2017-7-6 19:22:02

freeelectron 发表于 2017-7-6 19:05
STM32L152的rtc是真正的rtc,只要配置完成,就可以直接读取数据了

想问下大佬该怎么配置呢?能给个模板么:'(

Imody 发表于 2017-7-6 19:41:45

freeelectron 发表于 2017-7-6 19:05
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写

freeelectron 发表于 2017-7-6 22:58:56

Imody 发表于 2017-7-6 19:41
版主,不要再写其他的函数了么?比如说像F103例程里面的u8 RTC_Set(u16 syear,u8 smon,u8 sday,u8 hour,u ...

L1中直接读取寄存器,库函数里面也有函数,直接可以读取年月日时分秒星期

发表于 2017-7-7 09:03:22

我给出的配置里面已经写了如何设置年月日、时分秒、星期了。需要的时候直接读取时间和日期即可,不需要进行将秒转换为日期了。
页: 1 [2] 3
查看完整版本: stm32L152芯片使用RTC制作万年历