OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3803|回复: 2

在论坛上找到一个WS2812的代码,有几处不是很明白。

[复制链接]

1

主题

6

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2018-4-12
在线时间
3 小时
发表于 2018-9-19 10:59:28 | 显示全部楼层 |阅读模式
1金钱
源代码来自这个网页#6楼提供的代码
[mw_shl_code=c,true]buffersize = (len*24)+43;        // number of bytes needed is #LEDs * 24 bytes + 42 trailing bytes[/mw_shl_code]
这处代码是WS2812_SEND函数中的一句,不理解的是为何要再加42个trailing 【拖尾】bytes。
捕获.PNG 捕获1.PNG
这边算的话就多两个灯,就是48bit。

此处写+43我猜这因为这处:
[mw_shl_code=c,true]//===================================================================//       
//bug£o×îoóò»¸öÖüÆú2¨DÎ2»ÖaμàÎaê2Ã′è«êǸßμçÆ½£¬1êÔö¼óò»¸ö2¨DÎ
          LED_BYTE_Buffer[memaddr] = ((color[0][2]<<8) & 0x0080) ? TIMING_ONE:TIMING_ZERO;
//===================================================================//        [/mw_shl_code]
还有一处关于DMA与TIM2对应的通道,感觉对应有误:

dma_ch2

dma_ch2

捕获.PNG
[mw_shl_code=c,true]RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
        /* GPIOA Configuration: TIM2 Channel 1 as alternate function push-pull */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);[/mw_shl_code]
此处用的是PORTA.0。
捕获.PNG
[mw_shl_code=c,true]DMA_Init(DMA1_Channel2, &DMA_InitStructure);

                /* TIM3 CC1 DMA Request enable */
        TIM_DMACmd(TIM2, TIM_DMA_Update, ENABLE);[/mw_shl_code]
此处用的却是DMA1_CH2?这个就不是很懂了。感觉像对应关系是错的。


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
83
金钱
83
注册时间
2019-1-23
在线时间
15 小时
发表于 2019-12-30 17:29:03 | 显示全部楼层
我也看他的代码了,他用的是定时器的更新中断,TIM2_UP对应DMA1_CH2       
你看这句话TIM_DMACmd(TIM2, TIM_DMA_Update, ENABLE);
但是为什么加42拖尾我不太明白,你能给我解释一下么。
还有,ws2812B的数据发送顺序是G->R->B,但是代码里WS2812_send()函数,Green对应的1,Red对应0,这是为什么?
回复

使用道具 举报

15

主题

96

帖子

0

精华

高级会员

Rank: 4

积分
650
金钱
650
注册时间
2017-4-21
在线时间
151 小时
发表于 2020-3-11 10:18:44 | 显示全部楼层
夜雨声烦Roc 发表于 2019-12-30 17:29
我也看他的代码了,他用的是定时器的更新中断,TIM2_UP对应DMA1_CH2       
你看这句话TIM_DMACmd(TIM2, TIM_DMA ...

你应该仔细看看手册,WS2812的reset信号需要50us以上,当数据发送到最后一个WS2812时需加上reset信号结束,因为发一个0码所需的时间是1.25us,所以加上42,rsset时间就是42*1.25us=52.5us
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-22 08:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表