打印

关于 RTC 的疑问

[复制链接]
3531|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
a1z26|  楼主 | 2009-5-12 10:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
RTC, TE, IO, pi, TI
ST自带的 RTC-Calendar 例程中,当系统由 Vdd 正常供电并且 RTC 计数到 0x00015180 (对应 23:59:59)时,重新设置 RTC 计数起始值为 0 ,同时时间变为 00:00:00 。(在中断中实现)原中断程序如下:

********************************************************************/
void RTC_IRQHandler(void)
{
  if (RTC_GetITStatus(RTC_IT_SEC) != RESET)
  {
    /* Clear the RTC Second interrupt */
    RTC_ClearITPendingBit(RTC_IT_SEC);

    /* Toggle GPIOB pin 15 each 1s */
    GPIO_WriteBit(GPIOB, GPIO_Pin_15, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_15)));

    /* Enable time update */
    TimeDisplay = 1;

    /* Wait until last write operation on RTC registers has finished */
    RTC_WaitForLastTask();
      
    /* Reset RTC Counter when Time is 23:59:59 */
    if (RTC_GetCounter() == 0x00015180)
    {
      RTC_SetCounter(0x0);
      /* Wait until last write operation on RTC registers has finished */
      RTC_WaitForLastTask();
    }
  }
}
                                                             
但是在由电池供电时,是没有中断的,这将可能导致计数器值大于 0x00015180 ,比方说到了0x00030360,此时系统再工作时显示的就将是 48:00:00,而不是 00:00:00。于是我把中断程序改了一下,系统工作第一次进中断时读取 RTC 计数器值并判断,如果大于 0x00015180,就做相应调整,重新设置 RTC 计数器值。程序如下。但是这样修改之后,程序反倒不能正常
运行了。在 IAR 下调试时,第一次下载进去,执行完 NVIC_Configuration(配置RTC中断)之后就会莫名的跳到 RTC_WaitForLastTask(),而且过不去。但是把程序下载到芯片是可以运行的。设置时间为 23:59:50(便于观测),然后断电(电池供电),等待10多秒后,重新上电,这次只显示

External Reset occurred....
 No need to configure RTC....
 
但时间却显示不出来了,调试发现又卡在了中断里 if 语句中的 RTC_WaitForLastTask 上。程序也就只多了一个判断和算术运算,却出不来结果了。不知何故,请教大家。

********************************************************************/
void RTC_IRQHandler(void)
{
  if (RTC_GetITStatus(RTC_IT_SEC) != RESET)
  {
    /* Clear the RTC Second interrupt */
    RTC_ClearITPendingBit(RTC_IT_SEC);

    /* Toggle GPIOB pin 15 each 1s */
    GPIO_WriteBit(GPIOB, GPIO_Pin_15, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_15)));

    /* Enable time update */
    TimeDisplay = 1;

    /* Wait until last write operation on RTC registers has finished */
    RTC_WaitForLastTask();
    
    tmp = RTC_GetCounter();
      
    /* Reset RTC Counter when Time is 23:59:59 */
    if (tmp >= 0x00015180)
    {
      RTC_SetCounter(tmp - tmp / 0x00015180 * 0x00015180);
      /* Wait until last write operation on RTC registers has finished */
      RTC_WaitForLastTask();
    }
  }
}
沙发
fqingy2003| | 2009-5-12 12:14 | 只看该作者

呵呵,这就是RTC的中断问题

有时候就是莫名其妙,就是一个小小的判读语句都可能导致中断问题,最好不要使用RTC中断

使用特权

评论回复
板凳
a1z26|  楼主 | 2009-5-13 18:20 | 只看该作者

楼上也遇到过这种情况?

但问题总得解决啊。

使用特权

评论回复
地板
fqingy2003| | 2009-5-14 17:21 | 只看该作者

不要使用RTC的中断,

就是不用呀,我没有办法就屏蔽了,有时候没有问题,但是一添加语句有可能产生新的问题。

使用特权

评论回复
5
Col_Chayton| | 2013-9-27 17:57 | 只看该作者
楼主,这个问题解决了吗?我也有同样问题啊

使用特权

评论回复
6
hkcj| | 2013-9-27 20:50 | 只看该作者
帮你们顶一个   希望楼主 能共享一下解决方法

使用特权

评论回复
7
outstanding| | 2013-9-27 21:58 | 只看该作者
帮顶

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

28

主题

214

帖子

0

粉丝