最近搞PWM波输出,参考了一下网上的代码自己总结出CC2530 PWM的配置过程:(此处以T1为例)
配置PWM模式需参考CC2530用户手册中"表7-1 外部设备I/O引脚映射"来进行配置
1、首先选择定时器1-42、选择好定时器后,配置外部设备控制寄存器PERCFG来选择定时器选择的位置。对应表7-1进行配置
3、配置定时器的优先级和定时器通道的优先级,针对选择的IO口,对应表7-1进行配置
4、最后进行定时器模式的设置,选择定时器的模式,这里选择定时器1模模式
5、在定时器1通道0寄存器(T1CC0H、T1CC0L)装入初值
6、选择捕获的通道,并装入比较值。注意:此时选择的通道必须对应所控制的I/O口
下面为PWM设置的代码,P1_0口接LED,可看到LED的亮度在变化。
void PortInit()
{
P1SEL = 0x00; //P1_0口设置为普通I/O口
P1DIR = 0x01; //P1_0口设置为输出模式
}
void T1Init()
{
CLKCONCMD &= ~0x40; //设置系统时钟源为32MHZ的晶振
while(CLKCONSTA & 0x40); //等待晶振稳定为32MHZ
CLKCONCMD &= ~0x07; //设置系统主时钟频率为32MHZ
CLKCONCMD |= 0x38; //定时器标记输出为250KHZ
//定时器通道设置
P1SEL |= 0x01; //定时器1通道2映射至P1_0,功能选择
PERCFG |= 0x40; //备用位置2,说明信息
P2SEL &= ~0x10; //相对于Timer4,定时器1优先
P2DIR |= 0xC0; //定时器通道2-3具有第一优先级
P1DIR |= 0x01;
//定时器模式设置
T1CTL = 0x02; //250KHZ不分频,模模式
//根据表7-1,此处P1_0口必须装定时器1通道2进行比较
T1CCTL2 = 0x1C; //比较相等置1,计数器回0则清零
//装定时器通道0初值
T1CC0H = 0x00;
T1CC0L = 0xFA; //PWM信号周期为1ms,频率为1KHZ
//装定时器通道2比较值
T1CC2H = 0x00;
//T1CC2L = 0xF7; //1%的正占空比
//T1CC2L = 0xE1; //10%的正占空比
//T1CC2L = 0xC8; //20%的正占空比
//T1CC2L = 0xAF; //30%的正占空比
//T1CC2L = 0x96; //40%的正占空比
T1CC2L = 0x7D; //50%的正占空比
//T1CC2L = 0x64; //60%的正占空比
//T1CC2L = 0x4B; //70%的正占空比
//T1CC2L = 0x32; //80%的正占空比
//T1CC2L = 0x19; //90%的正占空比
//T1CC2L = 0x0A; //99%的正占空比
//T1CC2L = 0x01; //设置通道2比较寄存器初值
}
void main()
{
uint8 i;
uint8 rate[11]={0xF7,0xE1,0xC8,0xAF,0x96,0x7D,0x64,0x4B,0x32,0x19,0x0A};
PortInit();
T1Init();
while(1)
{
for(i=0;i<11;i++)
{
T1CC2H = 0x00;
T1CC2L = rate[i];
halMcuWaitMs(500);
}
}
}