Chinaunix首页 | 论坛 | 博客
  • 博客访问: 698962
  • 博文数量: 193
  • 博客积分: 1875
  • 博客等级: 上尉
  • 技术积分: 2187
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-23 23:21
个人简介

有时候,就是想窥视一下不知道的东东,因为好奇!

文章分类

全部博文(193)

文章存档

2024年(9)

2023年(3)

2020年(1)

2019年(1)

2018年(1)

2017年(2)

2016年(69)

2015年(53)

2014年(14)

2013年(1)

2012年(5)

2011年(25)

2010年(9)

分类: 其他平台

2024-03-31 09:51:58

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.其它……电路……
阅读(107) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~