cc2541之pwm笔记
cc2541有四路timer,其中timer2为rtos使用,所以我们可以使用timer1、timer3、timer4。 其中timer1、timer2是16位的,timer3、timer4是8位的。
timer1 有5个通道,其中通道0输出比较功能较少,使用时需要特别注意。
timer3、timer4各拥有两个通道。
timer对应的io map如下图所示:
其中timer3、timer4输出pwm的配置代码如下(以timer4为例):
- void pwmTimer4Init(void)
- {
- P1SEL |= BV(1)|BV(0); //P11、P10设置为外设功能;
- T4CTL = 0x00; //1分频(32M/256=125K)、关timer、*运行模式
- T4CC0 = 255; //P10的初始化值
- T4CC1 = 255; //P11的初始化值
- T4CCTL0 = 0x2C; //00 101 100无中断、Set output on compare, clear on 0xFF、比较模式、No Capture
- T4CCTL1 = 0x2C; //00 101 100无中断、Set output on compare, clear on 0xFF、比较模式、No Capture
- T4CTL |= BV(4); //开始timer
- }
timer1输出pwm的配置代码如下:
- void pwmTimer1Init(void)
- {
- P1SEL |= 0x01; //P1.0设置为外设I/O口:定时器1通道2
- PERCFG |= (1<<6); //定时器1为外设位置2 即上表中alt2
- P2SEL &= ~(1<<4); //优先级控制:定时器1优先
- T1CTL = 0x0f; //定时器1设置为128分频,正计数/倒计数模式
- T1CCTL2 = 0x6c; //定时器1通道2配置为比较输出,模式101,开通道2中断
- T1CC0L = 0x00; //定时器1通道0捕获/比较值低位
- T1CC0H = 0x88; //定时器1通道0捕获/比较值高位
- T1CC2L = 0x00; //定时器2通道0捕获/比较值低位
- T1CC2H = 0x44; //定时器1通道2捕获/比较值高位
- TIMIF &= ~(1<<6); //定时器1溢出中断使能
- IEN1 |= (1<<1); //定时器1中断使能
- EA = 1; //开总中断
- }
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 );!