你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32 HAL库使用SPI+DMA驱动WS2812优化方案  

[复制链接]
waiman 发布时间:2018-2-6 15:03
阅读主题, 点击返回1楼
1 收藏 28 评论77 发布时间:2018-2-6 15:03
77个回答
jjbboox 回答时间:2018-3-21 17:36:10
本帖最后由 jjbboox 于 2018-3-21 17:39 编辑 ) j( l2 ?4 t2 ~
* t, U, f* J- z$ D. J6 j4 L
其实把SPI的速度调到2.25Mbps,用3bit代表1位即可。这样24bit只需要用8个字节就OK了。
( k* o, W- X  j! ^STM32F103C8T6 SPI2 16分频 2.25Mbps完美实现。
. i4 T6 X4 r5 o% B( n+ w' [- l6 l8 r
yyq006 回答时间:2018-3-22 09:03:00
SPI速度调到2.5Mbps,对W2812来说时序确实更准确一些。不过一个像素是用9个字节。
waiman 回答时间:2018-3-22 10:06:37
jjbboox 发表于 2018-3-21 17:36
+ `/ h" n( A9 V" b其实把SPI的速度调到2.25Mbps,用3bit代表1位即可。这样24bit只需要用8个字节就OK了。& M6 o; u1 `; C* O' h
STM32F103C8T6 SPI2  ...
7 Y+ K# m! _$ u7 J4 i! q" O
厉害!9 k* \8 ^7 y5 e3 ^1 k5 Q
但3bit要对齐8bit的变量点难度哦。
" N8 P9 c5 j# V请教一下用什么方法对齐变量的?
yyq006 回答时间:2018-3-22 15:21:03
按颜色处理,每种颜色正好3个字节,处理不算复杂。
* l2 f. R  P8 x7 U7 H+ r( N压缩存储位可以节省空间,但数据处理要多花一些时间,使用中要根据实际情况来选择。
waiman 回答时间:2018-3-23 22:54:57
yyq006 发表于 2018-3-22 15:211 I/ b# \$ }2 y
按颜色处理,每种颜色正好3个字节,处理不算复杂。6 @1 }0 }) i, l4 h0 T& F
压缩存储位可以节省空间,但数据处理要多花一些时间,使 ...

, p* p' q! B3 o3 x相当于用Flash和运算时间换RAM空间。
jjbboox 回答时间:2018-3-24 11:24:04
本帖最后由 jjbboox 于 2018-3-24 11:25 编辑 1 T8 C( h+ H+ U- r8 }; z
waiman-156411 发表于 2018-3-22 10:06# K) |0 x+ O# d  K& l2 O
厉害!
! `  C, r- R+ G$ ?! O- e但3bit要对齐8bit的变量点难度哦。" ^( O0 A% m4 {+ @) Z/ x/ |
请教一下用什么方法对齐变量的? ...
  t: h  u: e9 ~' S  x/ ?* }
110代表1
$ a4 x; [! @+ Z3 Z" K100代表01 S. y2 H7 A: v# p

& d$ Q' H: |6 S6 W, z5 Z- k% E) D
sztyzhi 回答时间:2018-3-24 16:12:20
谢谢LZ
sztyzhi 回答时间:2018-3-24 16:12:54
再次感谢
nanren0542 回答时间:2018-3-24 21:23:21
好资料,需要学习
lin-ba-xin 回答时间:2018-3-27 22:04:41
請問 我目前只驅動一顆WS2812 8 s# V, @  a0 `0 H
所以我將PIXELS_LEN 改成 1 後 燈就不動作- U& z# d; S6 J6 Y! |
能問一下還有什麼地方沒注意到的
! ^5 Q2 N, s* k& l. ~5 u% t感謝
jjbboox 回答时间:2018-3-27 23:02:26
lin-ba-xin 发表于 2018-3-27 22:04
, c6 x2 m* u8 e  b' N+ w請問 我目前只驅動一顆WS2812
0 J8 ~2 v( c( W% X& {所以我將PIXELS_LEN 改成 1 後 燈就不動作
$ y& ^" v2 }$ b" ?. e' I, ]能問一下還有什麼地方沒注意到的
2 L: }' M4 \# Q2 s0 W' e
可能是你的reset信号不正确,或者说低电平的持续时间不够。
翱翔云端的鸟 回答时间:2018-4-9 15:02:45
jjbboox 发表于 2018-3-21 17:363 a, [. S! F9 Z3 E$ R& b7 A( f, |
其实把SPI的速度调到2.25Mbps,用3bit代表1位即可。这样24bit只需要用8个字节就OK了。* y5 V6 q' L  g( }0 j/ ~0 A  k
STM32F103C8T6 SPI2  ...
* m5 k7 o$ S1 m. k% D8 i: \! Z
2.25Mbps   3bit表示24位中的一个位     那一个完整的颜色需要24*3=72bit  的SPI数据   也就是72/8=9byte
9 j( D7 o( ?" j( o, U0 X这里24bit应该是9byte的数据吧?
1 W7 ?  V4 x: X) h8 v. E   
jjbboox 回答时间:2018-4-10 07:30:42
本帖最后由 jjbboox 于 2018-4-10 07:35 编辑
) I) x, h8 J, {7 Q' Y
翱翔云端的鸟 发表于 2018-4-9 15:028 b- Z& a# D9 u( K# J+ I' G% C) c
2.25Mbps   3bit表示24位中的一个位     那一个完整的颜色需要24*3=72bit  的SPI数据   也就是72/8=9byte ...

; T% w1 D. j- ]  b9 l- Y& x是的,其实两头各还要加一个RESET信号,大概在32个字节左右吧。9 H0 O6 j5 a. C
比如8颗粒的灯条,那么分配的内存就应该是8 * 9 + 32 = 104字节。/ g; U! q' L0 y
16颗粒的灯条就是 16 * 9 + 32 = 176 字节
" [! O+ \- v) o/ Z9 T1 U! p
翱翔云端的鸟 回答时间:2018-4-10 09:42:55
jjbboox 发表于 2018-4-10 07:30
- k' `$ z* q/ W是的,其实两头各还要加一个RESET信号,大概在32个字节左右吧。3 O3 ^1 f- M( z, Q' l) i
比如8颗粒的灯条,那么分配的内存就应该是 ...
( c( B  \1 x- G# _
我现在遇到一个问题    3bit表示一个code     001  表示0code         110表示1code     
7 S, Z2 S4 f/ p1 ^当我要发送9byte的一个24bit颜色值的时候  比如是传输红色2 x  _2 H& i: B6 R$ h2 l
按照G R B  传输 为   0x00  0xFF  0x00   
6 h7 i# p9 m! _! J
# T1 G' G! d) X  H8 I* H  F7 P6 w转换为二进制  i" G: ~' X: o3 {
001 001 001 001 001 001 001 001 001 001 001" @5 d/ U4 e* d# V, Y5 h
110 110 110 110 110 110 110 110 110 110 1100 G9 o& ]3 Z6 H4 O4 q  V
001 001 001 001 001 001 001 001 001 001 001 3 P+ R' J, c- z4 |3 Y- G- M3 o

9 i) l' m, }) |6 e# JSPI数据为:+ J  a$ U/ \3 P* x  F0 z$ G
        0x24                0x92                0x49# O  Z: w/ y* r) o% X0 z
0010 0100   1001 0010    0100 1001  
& W- i( Z( x$ ]( c1 v2 u6 f        0xDB                0x6D                0xB6: c1 Q+ o( p) q  {) X$ |
1101 1011   0110 1101    1011 0110
3 R) p) K: d) F* C        0x24                0x92                0x49
/ o& k2 C2 s" `( Y/ v0010 0100   1001 0010    0100 1001 0 y3 l# v; p$ |0 p4 d7 \: e
# _  j: D& J! E% k0 B+ b! k

! [! [4 e9 {" L4 ~  x/ Q9 n! h: }& _7 _这里的问题是当我SPI发送完0x24之后  发送0x92的时候  0x24的最后一位是0  0x92最后一位是1   导致0x24的最后一个0码和0x92的1码混合了  
翱翔云端的鸟 回答时间:2018-4-10 09:43:50
jjbboox 发表于 2018-4-10 07:30
  p, U6 ]& _3 _5 z0 L! I是的,其实两头各还要加一个RESET信号,大概在32个字节左右吧。' @9 `8 ^8 }& b# Q4 y! r8 o9 B4 |! q1 p
比如8颗粒的灯条,那么分配的内存就应该是 ...
# h. w8 F$ y5 j' |
另外  楼主这里的4M  是不是改为 3.2M更合适啊   

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版