你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32L152芯片使用RTC制作万年历

[复制链接]
Imody 提问时间:2017-7-5 19:49 /
阅读主题, 点击返回1楼
收藏 1 评论25 发布时间:2017-7-5 19:49
25个回答
回答时间: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 ...

就像图中的打×和感叹号的语句一样,编译的时候是不通过的。我是直接把原子的代码复制过来,然后改一些地方。但现在这些地方找不到对应的函数
TIM截图20170706145529.png
TIM截图20170706145630.png
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[6:0] 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,只要配置完成,就可以直接读取数据了
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
我给出的配置里面已经写了如何设置年月日、时分秒、星期了。需要的时候直接读取时间和日期即可,不需要进行将秒转换为日期了。

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版