CC2530 T1定时器输出比较
void init()
{
P1SEL &= ~0x08; // 设置P1.3为普通IO口
P1DIR |= 0x08 ; // 设置P1.3为输出
LED3 = 0; // P1.3输出高电平点亮其所控制的LED3(黄色)
PERCFG |= 0x40; // 配置Timer1的外设I/O使用位置2
P1SEL |= 0x01; //配置P1.0为定时器1的片内外设I/O
P1DIR |= 0x01 ; // 设置P1.0为输出
T1CCTL2 |= ((0x02 << 3) | /* 发生匹配时通道2的输出电平切换 */
(0x01 << 2)); /* 通道2工作在输出比较模式(匹配模式) */
T1CC2L =62500 & 0xFF; // 把62500的低8位写入T1CC2L
T1CC2H = ((62500 & 0xFF00) >> 8); // 把62500的高8位写入T1CC2H
T1CTL = 0x0D; // 配置128分频,自由计数器工作模式,并开始启动
TIMIF &= ~0x40; //不产生定时器1的溢出中断
IEN1 |= 0x02; //使能定时器1的中断
EA = 1; //使能全局中断
}
#pragma vector=T1_VECTOR
__interrupt void T1_ISR(void)
{
EA = 0; // 关闭全局中断
if((T1STAT & 0x04) == 0x04) //若产生的是通道2中断
{
T1STAT &= ~0x04; // 清零通道2中断标志
LED3=!LED3; //切换LED3(绿色)的亮灭状态
// T1CNTL = 0x00; // 清零定时器1计数器
// T1CNTH=0x00;
T1IF=0; //清T1的中断请求
}
EA = 1; // 使能全局中断
}
void main(void)
{
init();
while(1);
}
程序功能:使用定时器1的输出比较功能,控制LED1(P1.0)。每0.5s切换一次LED3(绿色)
* 的亮灭状态。当发生匹配时,P1.0(即定时器1的通道2)的输出发生切换,这样就控制了LED1(P1.0)的亮/灭。同时,在发生匹配时,还将产生中断,在 中断服务程序中切换LED3(P1.3)的亮灭。
出现问题:在中断程序里的两条语句 // T1CNTL = 0x00; // 清零定时器1计数器
// T1CNTH=0x00;
不添加,则定时器工作时间不对,即T1CC2L、T1CC2H的值不对;添加了这两条语句,定时器工作时间对了,但比较输出结果P1.0没有取反,即P1.0接口的灯没有闪烁
咨询一下,您的例程中对T1STAT寄存器的清零有效果吗?我这边是Timer1作为PWM输出的计数器使用,使用Timer1 的中断计数PWM输出个数,结果不对,断点中断后发现对T1STAT的清零无效。