我想在SMCLK =16 MHz时使用TimerA进行延迟。
以下代码有效并给出请求的延迟(大约),其中函数的参数是请求的延迟(以微秒为单位):
void Delayus (无符号int delayamt)
{
//延迟为0-6.5535万 usec;已初始化以使用SMCLK,除以16,因此计时器增量为一次/usec;到达delayamt时,给出一个中断,延迟结束
TA0CCR0 = delayamt; //在计数到此值时中断
TA0CTL ||(MC_1 | TALCL);
__bis_sr_register(LPM0_bits | GIE); //进入睡眠模式。 Timer0 ISR将在适当的时间过后唤醒我们
}
#pragma vector=TIMER0_A0_vector
__interrupt void TIMER0_A0_ISR(void)
{
TA0CTL |= MC_0; //停止计时器0
__BIC_SR_REGISTER_ON_EXIT (LPM0_bits); //从LPM0唤醒并在Delayus功能后继续
}
在取得了成功之后,我想我将进一步扩大,以实现大量的,大约几秒钟的延迟。 它不工作.... CPU永远休眠。
void Delaysec (无符号int dela) //延迟为65.535 毫秒
{
无符号长I,delas;
DELA = 20*DELA; // 1秒= 20*DELA 5万 USEC
用于(i=0;i<delas;i++) Delayus (5万);
}
在主要的程序中,我已经禁用了看门狗。
WDTCTL = WDTPW | WDTHOLD; //停止看门狗
有什么想法导致这一失败?