[ZLG-ARM] ★★★ 再测试RTC,把我吓坏了!

[复制链接]
2750|6
 楼主| 汽车电子 发表于 2009-5-15 17:14 | 显示全部楼层 |阅读模式
&nbsp;&nbsp;&nbsp;那台机,从昨天下班一直开到现在,RTC出现问题了。<br /><br /><br />&nbsp;&nbsp;&nbsp;4字节整形变量Cnt,在RTC每秒中断清零Cnt=0,在主任务里每秒加1,Cnt++;<br /><br />&nbsp;&nbsp;&nbsp;当Cnt大于5时,认为RTC不工作,即切换RTC时钟源(系统初始化时首选外部,原来内部就切换到外部,原来外部就切换到内部),同时清零Cnt<br /><br />&nbsp;&nbsp;&nbsp;切换来切换去,RTC就是不工作
 楼主| 汽车电子 发表于 2009-5-15 17:22 | 显示全部楼层

LPC2134

GPS定位、GPRS收发数据正常,其它都正常。<br /><br />重新启动,RTC就可以了
赖皮 发表于 2009-5-15 17:46 | 显示全部楼层

volatile

凭你的能力&nbsp;volatile肯定是加了的<br /><br />奇怪的问题<br /><br />贴一点程序看看
 楼主| 汽车电子 发表于 2009-5-17 21:35 | 显示全部楼层

加了,这个程序是以前一直用的

&nbsp;&nbsp;因为以前有些型号的RTC确实有问题,就加了RTC切换内外时钟源的程序。<br />&nbsp;&nbsp;一旦RTC不行了,就使用系统节拍来实现秒计数器。实际上,我的系统都有GPS,MCU的RTC基本不用的(只在GPS无效的时候用)。且不直接用RTC,是用秒计数器。<br />4字节的秒计数器,长达&nbsp;130多年。<br /><br />&nbsp;&nbsp;目前只发现了那么一台机子的RTC有问题。
 楼主| 汽车电子 发表于 2009-5-19 14:46 | 显示全部楼层

确实是有些RTC有问题

&nbsp;&nbsp;&nbsp;有些板子,用外部32K晶振不行,用内部就行。<br /><br />&nbsp;&nbsp;&nbsp;这跟代码无关。<br /><br />&nbsp;&nbsp;&nbsp;也和赖皮说的volatile无关,即使不加volatile也没关系的。计数器是类内私有变量,主函数根本不允许操作的。是通过调用RTC对象操作的。<br /><br /><br /><br />/*&nbsp;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$<br />&nbsp;&nbsp;&nbsp;&nbsp;函数名称:<br />&nbsp;&nbsp;&nbsp;功能描述:检测RTC是否正常工作,本函数只能供外部任务调用,不能在RTC内部调用<br />&nbsp;&nbsp;&nbsp;入口参数:无<br />&nbsp;&nbsp;&nbsp;出口参数:无<br />&nbsp;&nbsp;&nbsp;全局变量:&nbsp;<br />&nbsp;&nbsp;&nbsp;创建时间:<br />&nbsp;&nbsp;&nbsp;修改时间:<br />*/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />#include&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;..UARTUART0.h&quot;<br />//&nbsp;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$&nbsp;以上原形声明的函数供本函数调用<br />void&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RtcCls::CheckWorkStatus(void)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;每秒调用1次<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;//////////////////////////////////////////////////////////////////////<br />&nbsp;&nbsp;&nbsp;&nbsp;if(++RtcStopCnt&gt=10)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SystemSecondCnt++;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;RTC损坏,相关秒计数器的加1任务由主任务完成<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GSM_RTC_AddOneSecond();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(RtcStopCnt%10==0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NOP();&nbsp;&nbsp;&nbsp;&nbsp;NOP();&nbsp;&nbsp;&nbsp;&nbsp;NOP();&nbsp;&nbsp;&nbsp;&nbsp;NOP();&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RtcClockSource&nbsp;=&nbsp;!RtcClockSource;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Init(RtcClockSource);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;外部时钟不工作,切换到内部的&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NOP();&nbsp;&nbsp;&nbsp;&nbsp;NOP();&nbsp;&nbsp;&nbsp;&nbsp;NOP();&nbsp;&nbsp;&nbsp;&nbsp;NOP();&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Uart.puts(&quot;Change&nbsp;RTC&nbsp;Clock
&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />}
zhousd 发表于 2009-5-19 18:35 | 显示全部楼层

如果不是用汇编做的程序,最好不要怀凝MCU

每种C编译器都有它本身皮气。
赖皮 发表于 2009-5-20 11:53 | 显示全部楼层

CRITICAL

if(++RtcStopCnt&gt=10)&nbsp;看看汇编需不需要临界保护<br /><br />当主程序从内存调出RtcStopCnt值时发生RTC中断,中断清零RtcStopCnt<br />返回主程序,主程序用的RtcStopCnt印象值&nbsp;改变后回存<br /><br />连续发生10次的可能性为0<br />但不知道有无可能半字操作时数据出错所以
您需要登录后才可以回帖 登录 | 注册

本版积分规则

366

主题

2058

帖子

5

粉丝
快速回复 在线客服 返回列表 返回顶部