WS2812B-2020 LED点灯记录
WS2812B-2020 LED灯通过 一个pin脚发送24bit(3个byte
对应R/G/B三色),控制显示颜色!
代码如下:
/*************************************************************************/
static void GPIO_bit0(void)
{
GPIOC->BSRR = GPIO_Pin_5; /** GPIO_SetBits(GPIOC, GPIO_Pin_5); **/
NOP();
NOP();
GPIOC->BRR = GPIO_Pin_5; /** GPIO_ResetBits(GPIOC, GPIO_Pin_5); **/
}
static void GPIO_bit1(void)
{
GPIOC->BSRR = GPIO_Pin_5; /** GPIO_SetBits(GPIOC, GPIO_Pin_5); **/
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
GPIOC->BRR = GPIO_Pin_5; /** GPIO_ResetBits(GPIOC, GPIO_Pin_5); **/
}
const paction_t_0 colorArr[] = {
GPIO_bit1,
GPIO_bit0,
};
void LED_display(u32 __color)
{
IRQ_disable();
colorArr[!(__color & (1 << 23))]();
colorArr[!(__color & (1 << 22))]();
colorArr[!(__color & (1 << 21))]();
colorArr[!(__color & (1 << 20))]();
colorArr[!(__color & (1 << 19))]();
colorArr[!(__color & (1 << 18))]();
colorArr[!(__color & (1 << 17))]();
colorArr[!(__color & (1 << 16))]();
colorArr[!(__color & (1 << 15))]();
colorArr[!(__color & (1 << 14))]();
colorArr[!(__color & (1 << 13))]();
colorArr[!(__color & (1 << 12))]();
colorArr[!(__color & (1 << 11))]();
colorArr[!(__color & (1 << 10))]();
colorArr[!(__color & (1 << 9))]();
colorArr[!(__color & (1 << 8))]();
colorArr[!(__color & (1 << 7))]();
colorArr[!(__color & (1 << 6))]();
colorArr[!(__color & (1 << 5))]();
colorArr[!(__color & (1 << 4))]();
colorArr[!(__color & (1 << 3))]();
colorArr[!(__color & (1 << 2))]();
colorArr[!(__color & (1 << 1))]();
colorArr[!(__color & (1))]();
IRQ_enable();
}
/*************************************************************************/
1.不能用循环(或判断):逐位发送24个bit,为啥不用循环的原因,电平信号要严格控制在220ns-380ns之间和580ns-1000ns之间!用循环时,多了条件判断!示波器发现,用循环或判断语句,不添加空指令,延时时间已经超出范围!
2. 不能用库函数:设置I/O口高/低,没有直接用库函数的原因:示波器发现,直接用库函数时,不添加空指令,延时时间已经超出范围!这个与mcu时钟有关!当前用的HK32F0301……
3. 关中断:关中断的原因,电平持续时间,要求严格,操作过程,中断造成的时间偏差已经超出范围!关中断到操作完成后开中断,时间不超过30us! 没有其它更紧急事情,问题不大!
4.在
LED_display()函数中数组下标取反,是为了将位操作的结果限制在0和1之间,防止越界!相应的colorArr[]数组中的置0置1函数的顺序要调换一下!
5.其它……
电路……