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

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

[复制链接]
waiman 发布时间:2018-2-6 15:03
阅读主题, 点击返回1楼
1 收藏 28 评论77 发布时间:2018-2-6 15:03
77个回答
翱翔云端的鸟 回答时间:2018-4-10 09:45:13
jjbboox 发表于 2018-4-10 07:302 M* `- g/ C  H8 N4 E8 I7 g
是的,其实两头各还要加一个RESET信号,大概在32个字节左右吧。- ~+ |" d& b8 Q
比如8颗粒的灯条,那么分配的内存就应该是 ...

; e. Y+ [6 B  h. _( F3 b* N# y( f选择数据当做0码 1码的时候  是不是需要 首尾有限制
jjbboox 回答时间:2018-4-10 13:34:21
本帖最后由 jjbboox 于 2018-4-10 13:39 编辑 0 _9 _7 x# K' D; `
翱翔云端的鸟 发表于 2018-4-10 09:45% d% q8 ]4 E4 ^9 ]- q& X
选择数据当做0码 1码的时候  是不是需要 首尾有限制
6 L# L( O' A- s/ o( U
用3位代表1个bit通过SPI方式驱动WS2812时,SPI的速度请调整到2.25Mbps$ w' L( |6 Y1 n$ }( M$ A) `% A
& H3 e! ]! `) T  J2 {
以下是我用的代码,供你参考。ptr指向SPI Buf,value 是要转码的值。
) Q8 |* D% m- x) T
; C& y9 [: W+ n
  1. #define        PIXEL_BYTE_0        (0x92)                                //100100105 Q9 [1 j& Z& T: I: r
  2.         #define        PIXEL_BYTE_1        (0x49)                                //01001001% A( V3 ]% j; U* }% Y
  3.         #define        PIXEL_BYTE_2        (0x24)                                //00100100
    % ~1 L% ~! |4 o! }# p, e$ u

  4. 1 J/ T: a0 h* q2 D6 k( m. q! X
  5.         uint16_t ws2812_spi::setbuffer(){( W* ~, u# |) D& I+ J+ R1 T
  6.                 uint8_t *ptr = buf_ptr + 16;
    $ Z$ P+ |+ T. a% G2 V+ r3 z& X- G
  7.                 if(pixel_count == 0 || pixels == NULL || buf_ptr == NULL)$ A- ~2 M: P# U7 F# d" W
  8.                         return 0;
    ' b  ?( e# L+ |  g
  9.                 else {2 X/ g+ I: z* f# `
  10.                         for(int i = 0; i < pixel_count; i ++){
    1 k; e1 `3 U3 q1 S
  11.                                 ptr = setPixelBuf(ptr, (pixels[i].green) * pixels[i].brightness / 0x100);. L$ B3 E# {. B# E! n9 L0 V
  12.                                 ptr = setPixelBuf(ptr, (pixels[i].red) * pixels[i].brightness / 0x100);: V" \7 s) U2 e- y* v' @( p8 Z
  13.                                 ptr = setPixelBuf(ptr, (pixels[i].blue) * pixels[i].brightness / 0x100);
    5 P; c9 _5 U2 B7 i
  14.                         }
    * d( `7 N( u% b2 q1 j2 _
  15.                 }7 z6 d% E* X6 t8 \' K
  16.                 return (ptr - buf_ptr);
    ( T2 O) E. g; S/ ?9 e
  17.         }
    $ |  a! r* R1 g, p
  18. . x% U2 A  y" g0 @! f9 I0 u7 o9 {
  19.         uint8_t* ws2812_spi::setPixelBuf(uint8_t *ptr, uint8_t value)
    : Q  r% j. }9 ?
  20.         {
    $ X  w' \8 y  k" o6 O2 \* x
  21.                 ptr[0] = PIXEL_BYTE_0;
    , V; A3 r9 r9 e8 q
  22.                 ptr[1] = PIXEL_BYTE_1;5 [: V( L1 h+ X- v0 v8 @
  23.                 ptr[2] = PIXEL_BYTE_2;8 P7 C9 C- T( D; t2 a8 s0 L: x
  24. & ^, w& m- @% x' j: j' A
  25.                 ptr[0] |= (value & 0x80)?(0x40):0x00;
    1 c8 `& |* U- I' @& K+ X
  26.                 value <<= 1;
    ( \6 Z2 O' ]# m* e  s
  27.                 ptr[0] |= (value & 0x80)?(0x08):0x00;: D, x6 r- ^- z$ N( ~
  28.                 value <<= 1;# n. {& _; f4 k% L9 f. p- \' t
  29.                 ptr[0] |= (value & 0x80)?(0x01):0x00;
    ( J( h0 X2 X9 e* ~) U  r0 p
  30.                 value <<= 1;
    # c) O" m- u1 }1 I  h* J9 m: k
  31.                 ptr[1] |= (value & 0x80)?(0x20):0x00;/ E0 Q* q1 B5 J; `
  32.                 value <<= 1;9 ^, W8 k8 k& x7 b% \! D
  33.                 ptr[1] |= (value & 0x80)?(0x04):0x00;
    2 j1 O& K4 y6 ~$ w
  34.                 value <<= 1;+ X7 \  x' [) l) y) A- x
  35.                 ptr[2] |= (value & 0x80)?(0x80):0x00;
    1 s* i/ m* }/ C% H4 u
  36.                 value <<= 1;
    8 e4 f6 t1 t6 g; H
  37.                 ptr[2] |= (value & 0x80)?(0x10):0x00;
    , R% t, b; w# \/ ^
  38.                 value <<= 1;- _9 T- V) T, M- N1 G; t3 d: i/ H
  39.                 ptr[2] |= (value & 0x80)?(0x20):0x00;
    5 {6 U' @8 S( ^$ z" u+ l
  40.                 value <<= 1;. G' E; p6 d8 z  `1 |  u
  41. ; T$ z- C: `, I; S1 Y
  42.                 return (ptr + 3);
    5 Z. q- d- P1 x* J# S6 s# }( p8 U! g$ l
  43.         }
    ; T, Z* o6 }% Y( v, L
复制代码

7 m& }1 [6 L, L9 D% C
* |8 d+ J4 X3 S: Y
a6161220 回答时间:2018-4-11 12:23:19
歇息学习
Belong..to.. 回答时间:2018-4-22 00:56:04
12321213321231132132132
Belong..to.. 回答时间:2018-4-22 00:57:49
请问去问我去恶趣味恶趣味
Belong..to.. 回答时间:2018-4-22 00:58:13
请问恶趣味恶趣味恶趣味恶趣味恶趣味
Belong..to.. 回答时间:2018-4-22 00:58:59
21333333333333333333333333
Belong..to.. 回答时间:2018-4-22 01:00:59
请问去问我去额外企鹅完全额外
Belong..to.. 回答时间:2018-4-22 02:15:03
请问恶趣味恶趣味委屈委屈
shih-min 回答时间:2018-4-23 11:26:46
好东西,谢谢分享
hufuha2 回答时间:2018-6-25 11:05:09
先看看了
ccav2010 回答时间:2018-7-24 15:08:34
思路新颖!赞一个
00dd 回答时间:2018-8-9 13:54:58
本帖最后由 00dd 于 2018-8-9 14:10 编辑
' ~4 M3 r2 m) u& N$ P# r2 Y
% {4 i, L3 ]. {5 P& ^+ S2 @6 @; }滴滴滴滴的第一
00dd 回答时间:2018-8-23 22:26:08
jjbboox 发表于 2018-3-21 17:36
/ u* P0 z9 y" g/ u' \$ H9 [. Y其实把SPI的速度调到2.25Mbps,用3bit代表1位即可。这样24bit只需要用8个字节就OK了。3 K+ }7 A% L. O) x, j. K
STM32F103C8T6 SPI2  ...
, t' j3 J( u2 s% w: N! N( C+ C
大佬,可以发源码参考一下吗?
al88 回答时间:2018-8-29 16:43:16
应该加精!!

所属标签

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