OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 12533|回复: 10

ALIENTEK MiniSTM32开发板 RTC实时时钟实验(实验11)BUG修正.

[复制链接]

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2010-12-15 15:48:44 | 显示全部楼层 |阅读模式
1,修正《不完全手册》RTC_Init函数中对RTC分频的设置错误问题。
原RTC_Init函数存在RTC分频设置无效的情况,原因是:
  RTC->RLH=0X0000;
  RTC->RLL=32767;          //时钟周期设置(有待观察,看是否跑慢了?)理论值:32767          
的修改发生在:
  RTC->CRL|=1<<4;              //允许配置 
之前,所以导致修改无效。
现在修改后的RTC_Init函数如下:
u8 RTC_Init(void)
{
 //检查是不是第一次配置时钟
 u8 temp=0;
 if(BKP->DR1!=0X5050)//第一次配置
 { 
    RCC->APB1ENR|=1<<28;     //使能电源时钟    
  RCC->APB1ENR|=1<<27;     //使能备份时钟    
  PWR->CR|=1<<8;           //取消备份区写保护
  RCC->BDCR|=1<<16;        //备份区域软复位   
  RCC->BDCR&=~(1<<16);     //备份区域软复位结束    
     RCC->BDCR|=1<<0;         //开启外部低速振荡器
     while((!(RCC->BDCR&0X02))&&temp<250)//等待外部时钟就绪 
  {
   temp++;
   delay_ms(10);
  };
  if(temp>=250)return 1;//初始化时钟失败,晶振有问题    
  RCC->BDCR|=1<<8; //LSI作为RTC时钟     
  RCC->BDCR|=1<<15;//RTC时钟使能  
    while(!(RTC->CRL&(1<<5)));//等待RTC寄存器操作完成 
     while(!(RTC->CRL&(1<<3)));//等待RTC寄存器同步 
     RTC->CRH|=0X01;      //允许秒中断
     while(!(RTC->CRL&(1<<5)));//等待RTC寄存器操作完成 
  RTC->CRL|=1<<4;              //允许配置
  //RTC_PRL.RTC_CNT,RTC_ALR这三个寄存器的修改,必须在CNF被置位之后!!
  RTC->RLH=0X0000;
  RTC->RLL=32767;          //时钟周期设置(有待观察,看是否跑慢了?)理论值:32767          
  RTC_Set(2009,12,2,10,0,55);  //设置时间  
  RTC->CRL&=~(1<<4);           //配置更新
  while(!(RTC->CRL&(1<<5)));   //等待RTC寄存器操作完成             
  BKP->DR1=0X5050;
  //BKP_Write(1,0X5050);;//在寄存器1标记已经开启了
  //printf("FIRST TIME\n");
 }else//系统继续计时
 {
     while(!(RTC->CRL&(1<<3)));//等待RTC寄存器同步 
     RTC->CRH|=0X01;      //允许秒中断
     while(!(RTC->CRL&(1<<5)));//等待RTC寄存器操作完成
  //printf("OK\n");
 }           
 MY_NVIC_Init(0,0,RTC_IRQChannel,2);//RTC,G2,P2,S2.优先级最低    
 RTC_Get();//更新时间
 return 0; //ok
}
请各位复制此段代码,覆盖rtc.c里面的RTC_Init函数即可。

2,修正RTC_Get函数的bug.
在RTC_Get函数里面,对闰年天数的处理存在问题,有问题的部分如下:

   if(Is_Leap_Year(temp1))//是闰年
   {
    if(temp>=366)temp-=366;//闰年的秒钟数
    else {temp1++;break;} 
   }else temp-=365;   //平年
这里的temp1++,并不需要,因为闰年还没过完,不需要增加年份.
修改后的代码如下:
   if(Is_Leap_Year(temp1))//是闰年
   {
    if(temp>=366)temp-=366;//闰年的秒钟数
    else break; 
   }else temp-=365;   //平年 
   其实就是吧temp1++去掉了.


其中,bug1由网友 踏雪无痕 反映,bug2由网友 breaker 反映.在此对他们表示感谢.
另外附上修改后的源码:

ALIENTEK MINISTM32 实验11 RTC实时时钟实验.rar

41.2 KB, 下载次数: 659

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

22

帖子

0

精华

高级会员

Rank: 4

积分
570
金钱
570
注册时间
2010-12-3
在线时间
138 小时
发表于 2010-12-15 15:53:11 | 显示全部楼层
回复 支持 反对

使用道具 举报

51

主题

214

帖子

0

精华

高级会员

Rank: 4

积分
561
金钱
561
注册时间
2011-4-11
在线时间
43 小时
发表于 2011-4-11 16:05:29 | 显示全部楼层
O(∩_∩)O哈哈~   不错!上次我也发现了一个错误,但现在忘了。
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
28
金钱
28
注册时间
2011-6-2
在线时间
0 小时
发表于 2011-6-2 15:23:46 | 显示全部楼层
呵呵,还好我刚做也看到了,现在改了
回复 支持 反对

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
26
金钱
26
注册时间
2011-6-3
在线时间
0 小时
发表于 2011-6-3 09:36:31 | 显示全部楼层
mark
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2011-7-13
在线时间
2 小时
发表于 2011-8-2 09:36:38 | 显示全部楼层
好像改了还不行哦!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
 楼主| 发表于 2011-8-2 11:53:36 | 显示全部楼层
回复【6楼】joan2003:
---------------------------------
什么情况?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2012-2-13
在线时间
0 小时
发表于 2012-3-26 20:19:31 | 显示全部楼层
MARK
回复 支持 反对

使用道具 举报

6

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2012-10-19
在线时间
0 小时
发表于 2012-10-30 15:24:12 | 显示全部楼层
回复【楼主位】正点原子:
---------------------------------
RCC->BDCR|=1<<8; //LSI作为RTC时钟,这个注释感觉不对,该是外部时钟LSE作为RTC时钟啊。位8已经被置1啦,请教!
没什么歌星
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
 楼主| 发表于 2012-10-30 20:45:40 | 显示全部楼层
注释有误
回复 支持 反对

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2018-1-23
在线时间
8 小时
发表于 2018-8-15 10:06:21 | 显示全部楼层
被RTC_Get代码坑死了,一星期后才发现的
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-19 00:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表