STM32之ws2812b驱动
1.手册阅读1.数据传输频率800KHZ对应时间为1.25us后续定时器配置的依据2.所有的数据都是通过一根线DIN传输每个灯拿到自己的数据(24bit,也就是3字节GRB方式排列看手册也有RGB排列的)然后剩余的数据依次往后面传递。3.当DIN端口接收到 RESET 信号时芯片将立即执行以下操作1将接收到的颜色数据送显示2待 RESET 信号结束后芯片恢复数据接收状态继续处理后续数据流。3注意在没有接收到 RESET 码前显示颜色不会改变RGB是最基本的颜色其他颜色都是这几个的组合。可用借助在线颜色对照表去查找通常颜色表是RGB排列要注意顺序两个颜色切换之前要复位,数据手册看到是280us以上4.时序可以看出0码和1码都有高低电平就算持续时间不一样。总的时间是一样的以STM32F103定时器不分频时间为1/72ns0码的周期: T0HT0L(970-1380)ns1码的周期: T1HT1L(970-1380)ns周期为1250ns1.25us800KHZ(这里手册有写1.25us直接选他就行)注意不同的2812手册的时间不太一致要注意看手册还有1种时间不一样(数据手册没有1.25us这个数字)0800-138011160-2000其实无所谓这里也选1250这个数,刚好满足90*1/72。周期计数90T1H和T1L分别给45个也就是1码的比较值为45T0H和T0L这里最终选择(25:65)0码的比较值为25然后分别带回去计算时间看满不满足要求这里是满足的假如我想输出green则green分量全为1R和B分量全为0.由于是GRB顺序所以要给的数据为 1字节的12字节的0那么对应PWM比较值为1对应450对应25从数据手册可以看出0和1的时间通过PWM控制方式调整比较值就能让MCU输出0或者1选PWM1模式小于比较值输出有效电平有效电平设置为1初始化比较值为0则一直输出低电平因为PWM1模式小于比较值才会输出有效电平这样就可以避免电平有翻转的情况.如果想输出绿色此时数组怎么给值呢绿色对应就是ff0000,那么1对应的就给450给25数组长度怎么定义呢uint16_t tx_buff[24*num1];要传递复位(或者给300)这里定义16位是因为DMA传输半字初始化不要打开DMA设置颜色的时候在打开DMA要用普通模式这里一定要注意1个字节的reset时间够不够明显是不够的由于作者两次之间增加了延时所以时间就够了。颜色值如果是1就给450就给25.WS2812B_Data(0x00FF00,0xFF0000);CCR改变一次输出1个bitDMA完成中断关闭.数据传输完毕了要关闭DMA防止PWM输出voidHAL_TIM_PWM_PulseFinshedCallback(TIM_HandleTypeDef*htim){if(htim-InstanceTIM1){HAL_TIM_PWM_Stop_DMA();}}参考添加链接描述添加链接描述添加链接描述添加链接描述添加链接描述SPI方式