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.

CC2530 Timer3 输出PWM

程序描述: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,所以这样想法是不正确的。