STM32控制RGB(WS2812B)灯 ,纳秒(ns)级延时配置

一: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);
 }

效果展示:

 

  • 22
    点赞
  • 124
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值