初学,CC2540用time4做PWM无输出,请教各位高手
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
谢谢了!参照这个问题解决
很好祝贺你!
