一:WS2812B灯介绍:
1: 脚位:
2:数据
0码:高电平时间220ns-500ns 低电平时间750ns-2us
1码:高电平时间750ns-2us 低电平时间220ns-500ns
复位码:300us以上的低电平
由24位数据控制,高8bit控制绿灯,中8bit控制红灯,低8bit控制蓝灯。
二:STM32介绍
由于STM32时钟教学时钟配置72兆,按照计算纳秒延时应该是可以的,可是通过实际测试,可能由于单条指令也会时间延时,所以延时达不到纳秒,所以只能通过单条指令循环的方法来实现纳秒延时。延时程序如下:
void delay_ns(u32 nus){
while(nus--);
}
以下为控制6个灯不同颜色的程序:
uint8_t rgb_data[18] = {0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x7F,0xFF,0x00,0xFF,0xFF,0x00,0x00,0x7F,0xFF};
void delay_ns(u32 nus){ //延时程序n为1时大概延时时间为370ns左右
while(nus--);
}
void send_code(uint8_t * sdata){ //发送亮度数据
uint8_t i = 0,n = 0;
uint8_t x = 0,y = 0,z = 0;
for(x = 0;x < 18;x++){ //发送18字节数据;18 = 一个灯3字节数据*6个灯
n = sdata[x];
for(y = 0;y < 8;y++){
z = ((n<<y)&0x80);
if(z){
LED2 = 1; //灯的控制脚位设置为输出高
delay_ns(7);
LED2 = 0;
delay_ns(1); //灯的控制脚位设置为输出低
}else{
LED2 = 1;
delay_ns(1);
LED2 = 0;
delay_ns(7);
}
}
}
}
int main(void)
{
delay_init(); //延时函数初始化
LED_Init(); //初始化与LED连接的硬件接口
LED2 = 0;
delay_us(310); //发送数据前发送300us以上的复位数据
send_code(&rgb_data[0]);
delay_us(310);
send_code(&rgb_data[0]); //控制灯的数据发送两次以防其他影响
LED2 = 0;
delay_ms(310);
LED2 = 1;
while(1);
}
效果展示: