微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI蓝牙设计交流 > 初学,CC2540用time4做PWM无输出,请教各位高手

初学,CC2540用time4做PWM无输出,请教各位高手

时间:10-02 整理:3721RD 点击:

T4做PWM,P1.0,P1.1做PWM输出,无法正常输出PWM,请教各位高手, 程序如下:
main:

/****************************************************************************
名    称: DelayMS()
功    能: 毫秒延时,系统时钟不配置时默认使用内部16M
入口参数: msec 延时参数,注意,最大数值为65536ms
出口参数: 无
****************************************************************************/
void DelayMS(uint16 msec)

    uint16 i,j;
    
    for (i=0; i<msec; i++)
        for (j=0; j<536*2; j++);
}
int main()
{
  CLKCONCMD &= ~0x40;                        //设置系统时钟源为32MHZ晶振
  while(CLKCONSTA & 0x40);                   //等待晶振稳定为32M
  CLKCONCMD &= ~0x47;                        //设置系统主时钟频率为32MHZ   

  PWM_init();
  pwmPulse(1,1,1);
  uint8 updown=1;
  uint16 count=1;
  while(1)
  {
    //实验呼吸灯,从1递增到200,然后在从200递减1
    if(updown)
      count++;
    else
      count--;
    if(count==250)
      updown=0;
    if(count==1)
      updown=1;
    //设置占空比
    setRGB(count,count,count);
    DelayMS(5);
  }
}


PWM函数如下:

uint16 gRed;
uint16 gGreen;
uint16 gBlue;

void PWM_init()
{
  //设置pwm端口为输出
  P1DIR|= BV(0)|BV(1);
  //设置pwm端口为外设端口,非gpio
  P1SEL|= BV(0)|BV(1);
  //P1SEL&= ~(BV(0)|BV(1));
  //由于uart等会占用我们当前使用的pwm端口,因此需要将uart等重映射到别的端口去。
  PERCFG |= 0x00;//0x40;             // Move USART1&2 to alternate2 location so that T1 is visible

        // Initialize Timer 4
// T4CTL = 0XeC;       // Div = 128, CLR, MODE = Suspended

  T4CTL |= BV(5) | BV(6) | BV(7) ;//128分频
  T4CTL &= ~(BV(0) | BV(1)); //0x00~0xff,重复
        
  T4CCTL0 = 0X4C;     // IM = 1; CMP = Clear output on compare; Mode = Compare
  T4CCTL1 = 0X4C;     // IM = 1; CMP = Clear output on compare; Mode = Compare
  
  T4CC0 = 250;         //ticks=250 ,(1ms=250*4 init duty cycle)
  T4CC1 = 250;         //ticks=250 ,(1ms=250*4 init duty cycle)
  
  T4CNT = 0;          //COUNT REST        
  
  
  IEN1 |= 0x10;               // Enable T4 cpu interrupt
  T4CTL|=0x10;                        //Start T4 Time
  EA=1;

}


void pwmPulse(uint16 red, uint16 green, uint16 blue)
{
  uint16 r,g,b;
  // stop,注意,不能加这句,加了周期偏差十几倍,具体原因未查明
  //T1CTL &= BV(0)|BV(1); 
#if 0
  r=375;
  g=1;
  b=1;
#else
  r=red;
  g=green;
  b=blue;
#endif

   T4CC1 = (uint8)r;
   T4CC0 = (uint8)g;
    T4CC0 = (uint8)b;
  // Reset timer
  T4CNT = 0; 

  // Start timer in modulo mode.
  T4CTL |= 0x02;
}

void setRGB(uint16 red, uint16 green, uint16 blue)
{
  gRed=red;
  gGreen=green;
  gBlue=blue;
}


#pragma vector = T4_VECTOR
__interrupt void pwmISR (void)
{
    uint8 flags = TIMIF;

    // T4 ch 0
    if (flags & 0x10)
      {          
         pwmPulse(gRed,gGreen,gBlue);
    
      }
   TIMIF = ~ flags;
//   P1_1=~P1_1;
}

灯根本点不亮,更不用说呼吸,不知道问题出在哪

timer4,timer3各有一个pwm输出 可以不用中断方式

谢谢提醒,没有用过先去看看,有问题再请教

看了下规格书,没有发现CC2540的T4有单独的PWM,兄弟能提示下吗?

官网的例程cc2541的,兼容cc2540

谢谢了!参照这个问题解决

很好祝贺你!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top