CC2530用Timer1通过设置PWM波占空比配置彩灯颜色
思路:
运行流程:
PC端用UART工具发送灯光配置参数 -> zigbee接收到串口数据读取数据 -> 把数据通过调用驱动层彩灯控制函数传参进行定时器通道比较值寄存器赋值,完成彩灯颜色调试。
驱动层:
配置系统时钟 -> 配置相关LED三色灯的IO口的功能和模式(我用的是P0_4,P0_5,P0_6) -> 配置Timer1的优先级和通道优先级 -> 根据IO引脚映射表配置外设控制(通过这个配置,把LED相关IO连接引脚映射到Timer的Alt1中2,3,4的比较通道,通过内部比较对相关IO进行高低电平处理) -> 配置定时器的工作模式和分频数(我选择的模模式) -> 配置捕获比较寄存器初始值(定时器计数的峰值) -> 配置通道2,3,4的比较值(定时器计数值与这个值进行比较来确定通道IO高低电平)
应用层:
在App_Int中调用驱动层写的Timer1初始化函数,以及原有的串口初始化函数
在App.c文件中写一个串口回显函数接收串口数据,接收到数据后把数据发送给串口,之后把数据通过函数传参给通道比较值寄存器。
相关寄存器可以网上搜索,我主要是说一下自己的思路
下边是我的相关函数代码可以参考
驱动层处理:
Timer.h中的宏定义和枚举
#define CONFIGURE_IO 0x70 //定义IO口寄存器
#define CONFIGURE_CLK 0x40 //定义时钟源晶振
#define CLK_MAIN 0x07 //系统主时钟频率设置
#define PRIORITY_TM1 0x10 //定时器1定时器优先级设置
#define PRIORITY_CHANNEL_TM1 0xC0 //定时器1通道优先级设置
#define BACKUP_TM1 0x40 //定时器1备用模式设置
#define COMPARE_H 0xFF //捕获比较寄存器初始值高字节
#define COMPARE_L 0xFE //捕获比较寄存器初始值低字节
#define CHANNEL_COMPARE_H 0x00 //比较通道初始值高字节
#define CHANNEL_COMPARE_L 0x01 //比较通道初始值低字节
#define CHANNEL_MODE 0x1C //通道模式
#define CONTROL_STATE_TM1 0x02 //定时器控制和状态设置
enum rgb{LED_RED = 1, LED_GREEN = 2, LED_BLUE = 3}; //LED对应颜色通道
Timer.c中的函数配置
定时器1初始化函数
void HalTimerInit(void)
{
//系统时钟配置
CLKCONCMD &= ~CONFIGURE_CLK; //设置系统时钟源为32MHz的晶振
while (CLKCONSTA & CONFIGURE_CLK); //等待晶振稳定为32MHz
CLKCONCMD &= ~CLK_MAIN; //设置系统主时钟频率为32MHz
//定时器配置
P0DIR |= CONFIGURE_IO; //p0_4,p0_5,p0_6 IO输出模式
P0SEL |= CONFIGURE_IO; //外设功能
P2SEL &= ~PRIORITY_TM1; //TIM1优先
P2DIR |= PRIORITY_CHANNEL_TM1; //通道2-3优先
PERCFG &= ~BACKUP_TM1; //打开TIM1引脚映射相关备用位置
T1CTL = CONTROL_STATE_TM1; //控制寄存器和状态 不分频2.048ms
T1CC0H = COMPARE_H;
T1CC0L = COMPARE_L; //捕获比较寄存器初始值
T1CC2H = CHANNEL_COMPARE_H;
T1CC2L = CHANNEL_COMPARE_L;
T1CCTL2 = CHANNEL_MODE; //通道2
T1CC3H = CHANNEL_COMPARE_H;
T1CC3L = CHANNEL_COMPARE_L;
T1CCTL3 = CHANNEL_MODE; //通道3
T1CC4H = CHANNEL_COMPARE_H;
T1CC4L = CHANNEL_COMPARE_L;
T1CCTL4 = CHANNEL_MODE; //通道4
return;
}
通道比较值寄存器赋值控制彩灯颜色函数
void HalChoseLedColor(uint8 led, uint8 low, uint8 high)
{
switch (led)
{
case LED_RED:
T1CC2H = high;
T1CC2L = low;
break;
case LED_GREEN:
T1CC3H = high;
T1CC3L = low;
break;
case LED_BLUE:
T1CC4H = high;
T1CC4L = low;
break;
}
return;
}
应用层处理
App.h中的宏定义和枚举
#define BUFF_LEN 10 //数组长度
#define UART_NUM 0 //串口0
enum buffindex{LED_TERM = 0, LOW_TERM = 1, HIGH_TERM = 2}; //数组下标
App.c中函数处理
void uart_callback (uint8 port, uint8 even)
{
uint8 buff[BUFF_LEN] = {0};
uint8 len = 0;
len = HalUARTRead(UART_NUM, buff, BUFF_LEN);
if (0 < len)
{
HalUARTWrite(UART_NUM, buff, len);
//buff[LED_TERM]颜色通道,buff[HIGH_TERM]颜色值高字节,buff[LOW_TERM]颜色值低字节
HalChoseLedColor(buff[LED_TERM], buff[LOW_TERM], buff[HIGH_TERM]);
}
return;
}
source insight 里边代码很规范复制到这里就不行了 ,有强迫症的我 又排版一番。。。。
好了 暂时结束彩灯!