This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
程序描述:T3通道0比较模式,比较成功后toggle。计数器采用自由运行模式。
问题:比较成功触发中断,我在中断函数里想将计数器(T3CNT)清0,单步调试后发现比不会将其清0,为什么?
#include <ioCC2530.h>
#include <stdio.h>
typedef unsigned char uchar;
typedef unsigned int uint;
void InitT3()
{
CLKCONCMD &= ~0x40; //设置系统时钟源为32MHZ晶振
while(CLKCONSTA & 0x40); //等待晶振稳定为32M
CLKCONCMD &= ~0x07; //设置系统主时钟频率为32MHZ
CLKCONCMD |= 0x38; //时钟速度32 MHz 定时器标记输出设置[5:3]250kHz
PERCFG |= 0x20; //T3 Alternative2
P2SEL |= 0x20; //0010 0000 定时器3优先
P2DIR |= 0xC0; //第1优先级:定时器1通道2-3
P1DIR |= 0xff; //端口1为输出
P1SEL |= 0x40; //0100 0000 timer3 通道0映射口P1_6
T3CCTL0 |= 0x14; //比较——跳变3CNT
//T3CCTL0 &= ~0x40; //屏蔽通道0中断
T3CCTL1 &= ~0x40; //屏蔽通道1中断
T3CC0 |= 0x64; //比较的值
T3CTL |= 0x04; //计数器清0;
T3CTL &= ~0x08; //屏蔽溢出中断
EA = 1;
IEN1 |= 0x08; // T3 interrupt = enable
T3CTL |= 0x10; //开始计数,自由模式
}
#pragma vector = T3_VECTOR//T1输入中断向量
__interrupt void T3_ISR(void)
{
if(TIMIF & 0x02)//原来用的是IRCON
{
P1_1 = 0;
TIMIF = 0;
//T3CNT = 0;
T3CTL |= 0x04; //计数器清0;
T3CTL |= 0x10; //开始计数,自由模式
}
}
void main(void)
{
InitT3();
while(1)
{
//P1_7 = 1;
}
}
自己回答一下
问题的初衷在计数器不使用取模模式的情况下,达到T3CC0的值以后,通过触发中断的方式,在中断函数中让其(T3CNT)置零,目前发现这种方法是行不通的。下面解释原因:
我在中断函数中 T3CTL = 0x04; (T3CTL |= 0x04; 这样写是不对的)目的是清除count,它的描述是:Clear counter. Writing a 1 to CLR resets the counter to 0x00 and initializes all output pins of associated channels. Always read as 0.这表示将初始化所有的输出口,这样一来你在通道0无论输出的是什么状态,都会复位回0,所以这样想法是不正确的。