您好,
我正在设计一个需要在显示屏上显示时钟的设备,我的意思是要显示一天中的时间(小时,分钟)。 MCU是MSP430G2553,其3.2768万KHz xtal连接到相关引脚。 我的代码(简化)如下所示:
#define sleep_Time_1S 3.2767万L
void main (void)
{
WDTCTL = WDTPW | WDTHOLD; //停止看门狗
初始化();//各种初始化,例如GPIO,同时显示
(1){
START_LPM_Timer(SLEEGE_1S);
DO_SOME_AND_DISPLAY_CLOCK (); //执行一些任务
LPM3I();
}
}
void START_LPM_Timer(unsigned long Time)
{
TA0CCR0 =时间;
TA0CTL = TIME_CLARK_ACLK+TIMER MODE_UG+TALCLR;
TA0CCTL0 &=~CCIFG;
TA0CCTL0 |= CCIE;
}
作废LPM3I(void)
{
__bis_sr_register (LPM3_bits+GIE);
__NO_OPERATION();
}
#pragma vector=TIMER0_A0_vector
__interrupt void ISR_Timer0_A0(void)//从休眠函数
{
TA0CTL &=~(MC_1);
TA0CCTL0 &=~(CCIE);
_low_power模式_off_on_exit();
}
//启用中断的LPM3
作废LPM3I (作废)
{
__bis_sr_register (LPM3_bits+GIE);
__no_operation();
}
ACLK由外部32kHz晶体计时。
其目的是启动一个计时器,在while (1)内精确计数1。 启动计时器后,代码执行一些任务(包括更新显示屏上的时间),然后进入低功耗模式3。 计时器到期时(即1秒后),MCU将唤醒并开始新的循环。
我希望,不管执行 DO-something_and_display_clock ()需要什么,只要它远少于1,系统就应该实施精确的时钟; 相反,我注意到,大约一天之后,显示屏显示的时间(hh:mm)比我使用的挂钟晚了大约3分钟(这应该非常精确)。 如需进一步的详细信息,do_somethe_and_display_clock()函数执行 几个__delay_cycles(day)的调用,其中delay =4000 (这是通过驱动显示器的代码完成的,它需要驱动一些具有指定定时的引脚)。
MCU的时钟频率为1MHz DCO (因此,delay_cycles每次应达到4ms)。
有没有什么理由让我错过了为什么在24小时后时钟会出现问题? 每天3秒意味着一个月后1个半小时,绝对不可接受。
谢谢,致以诚挚的问候
Fabio