cc2541之pwm笔记

cc2541有四路timer,其中timer2为rtos使用,所以我们可以使用timer1、timer3、timer4。 其中timer1、timer2是16位的,timer3、timer4是8位的。

timer1 有5个通道,其中通道0输出比较功能较少,使用时需要特别注意。

        timer3、timer4各拥有两个通道。


        timer对应的io  map如下图所示:

cc2541之pwm笔记

   其中timer3、timer4输出pwm的配置代码如下(以timer4为例):

[cpp] view plain copy
 cc2541之pwm笔记cc2541之pwm笔记
  1. void pwmTimer4Init(void)      
  2. {       
  3.   P1SEL |= BV(1)|BV(0);         //P11、P10设置为外设功能;       
  4.         
  5.   T4CTL = 0x00;                     //1分频(32M/256=125K)、关timer、*运行模式      
  6.       
  7.   T4CC0 = 255;                      //P10的初始化值      
  8.   T4CC1 = 255;                      //P11的初始化值      
  9.       
  10.   T4CCTL0 = 0x2C;               //00 101 100无中断、Set output on compare, clear on 0xFF、比较模式、No Capture      
  11.   T4CCTL1 = 0x2C;               //00 101 100无中断、Set output on compare, clear on 0xFF、比较模式、No Capture        
  12.         
  13.   T4CTL |= BV(4);               //开始timer  
  14. }   



timer1输出pwm的配置代码如下:

[cpp] view plain copy
 cc2541之pwm笔记cc2541之pwm笔记
  1. void pwmTimer1Init(void)      
  2. {       
  3.     P1SEL |=  0x01;      //P1.0设置为外设I/O口:定时器1通道2  
  4.     PERCFG |= (1<<6);   //定时器1为外设位置2  即上表中alt2  
  5.     P2SEL &= ~(1<<4);   //优先级控制:定时器1优先  
  6.   
  7.   
  8.     T1CTL  = 0x0f;     //定时器1设置为128分频,正计数/倒计数模式  
  9.     T1CCTL2 = 0x6c;    //定时器1通道2配置为比较输出,模式101,开通道2中断  
  10.     T1CC0L = 0x00;     //定时器1通道0捕获/比较值低位  
  11.     T1CC0H = 0x88;     //定时器1通道0捕获/比较值高位  
  12.     T1CC2L = 0x00;     //定时器2通道0捕获/比较值低位  
  13.     T1CC2H = 0x44;     //定时器1通道2捕获/比较值高位  
  14.     TIMIF &= ~(1<<6);  //定时器1溢出中断使能  
  15.     IEN1  |= (1<<1);   //定时器1中断使能  
  16.     EA = 1;            //开总中断  
  17.   
  18. }   

1、timer1如果使用port0引脚,则需要注意To have all Timer 1 channels visible in the alternative 1 location, move both USART 0 and USART 1 to
the alternative 2 location, 及
使uart0和uart1的peripheral 功能设置为alt2


2、如果开了timer中断功能,一定要添加中断处理函数,不然会跑飞。


特别注意:

timer1输出pwm不稳定的现象,可以通过以下两个设置解决。

1:需要把POWER_SAVING关闭或者在INIT函数里加osal_pwrmgr_device(PWRMGR_ALWAYS_ON);

2:必须关闭CLK自动分频,HCI_EXT_ClkDivOnHaltCmd( HCI_EXT_DISABLE_CLK_DIVIDE_ON_HALT );!