WS2812的STM32程序-错误的
- 格式:docx
- 大小:15.56 KB
- 文档页数:3
/* WS2812灯中断服务函数
设置PWM周期为1.28us 72MHz 4分频18MHz 定时器计数到22 基本定时器配置
// TIM_TimeBaseStructure.TIM_Period =22; //当定时器从0计数到22,即为23次,为一个定时周期
// TIM_TimeBaseStructure.TIM_Prescaler =3; //设置预分频:
// TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ; //设置时钟分频系数:不分频(这里用不到)
// TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式// TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
PWM模式配置
// TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //配置为PWM模式1
// TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //使能输出
// TIM_OCInitStructure.TIM_Pulse =0;
//设置初始PWM脉冲宽度为0
// TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //当定时器计数值小于CCR1_Val时为低电平
TIM3->CCR3 = 13;时高电平时间为720ns 低电平时间为560ns 1码
TIM3->CCR3 = 7;时高电平时间为390ns 低电平时间为880ns 0码
复位时间为88us 通过定时器计时周期25
程序中驱动3个串联WS2812灯每个灯用24位表示颜色所以用3*8表示三个灯的颜色在shuju[][]的二维矩阵里存放
程序中用了定时器关闭和打开用来消除中断程序运行时间对输出波形的影响
*/
u8 shuju[3][3]={{100,0,0},{2,200,2},{10,10,200}};//GRB 高位先发
void TIM3_IRQHandler(void)
{
static uint16_t period_cnt = 0; //用于计算周期数
static u8 i=0,j=0,n=0;
static u8 ledbuf=0;
if (TIM_GetITStatus(TIM3, TIM_IT_Update)!= RESET) //TIM_IT_Update
{
if(period_cnt<25){TIM3->CCR3=0;period_cnt++;}
else
{ TIM_Cmd(TIM3, DISABLE);//TIM3->CCR3 =7;period_cnt=0;
if(n==0)ledbuf=shuju[i][j];else ledbuf=ledbuf;
if(i<3)
{
if(j<3)
{
if(n<8)//
{ n++;
if((ledbuf&0x80)!=0){TIM3->CCR3 = 13;}else{TIM3->CCR3 = 7;}
ledbuf=ledbuf<<1;//TIM_ClearITPendingBit (TIM3, TIM_IT_Update);
if(n==8){n=0;j++;}//
}//else{n=0;}
if(j==3){j=0;i++;}
}//else{j=0;}
if(i==3){i=0;period_cnt=0;}//复位一下
}//else{i=0;}
}
TIM_Cmd(TIM3, ENABLE);
TIM_ClearITPendingBit (TIM3, TIM_IT_Update); //必须要清除中断标志位}
}
/* WS2812灯中断服务函数
设置PWM周期为1.28us 72MHz 4分频18MHz 定时器计数到22 基本定时器配置
// TIM_TimeBaseStructure.TIM_Period =22; //当定时器从0计数到22,即为23次,为一个定时周期
// TIM_TimeBaseStructure.TIM_Prescaler =3; //设置预分频:
// TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ; //设置时钟分频系数:不分频(这里用不到)
// TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式// TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
PWM模式配置
// TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //配置为PWM模式1
// TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //使能输出
// TIM_OCInitStructure.TIM_Pulse =0;
//设置初始PWM脉冲宽度为0
// TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //当定时器计数值小于CCR1_Val时为低电平
TIM3->CCR3 = 13;时高电平时间为720ns 低电平时间为560ns 1码
TIM3->CCR3 = 7;时高电平时间为390ns 低电平时间为880ns 0码
复位时间为88us 通过定时器计时周期25
程序中驱动3个串联WS2812灯每个灯用24位表示颜色所以用3*8表示三个灯的颜色在shuju[]的二维矩阵里存放
程序中用了定时器关闭和打开用来消除中断程序运行时间对输出波形的影响
*/
u32 shuju[3]={0XAAAAAA00,0XFFAAAA00,0X00AFFA00};//GRB 高位先发
void TIM3_IRQHandler(void)
{
static uint16_t period_cnt = 0; //用于计算周期数
static u8 i=0,n=0;
static u32 ledbuf=0,j=0X80000000;
TIM_Cmd(TIM3, DISABLE);
if (TIM_GetITStatus(TIM3, TIM_IT_Update)!= RESET) //TIM_IT_Update
{
if(period_cnt<25){TIM3->CCR3=0;period_cnt++;}
else
{ //TIM3->CCR3 =7;period_cnt=0;
// if(n==0)ledbuf=shuju[i];else ledbuf=ledbuf;
if(i<3)
{
if(n<24)//
{ n++;
if((shuju[i]&j)!=0){TIM3->CCR3 = 13;}else{TIM3->CCR3 = 7;}
j=j>>1;
if(n==24){n=0;i++;period_cnt=0;}//
}//else{n=0;}
if(i==3){i=0;period_cnt=0;}//复位一下
}//else{i=0;}
}
TIM_ClearITPendingBit (TIM3, TIM_IT_Update); //必须要清除中断标志位
TIM_Cmd(TIM3, ENABLE);
}
}。