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

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:30
" T. [" F5 B, _- [8 X6 M是的,其实两头各还要加一个RESET信号,大概在32个字节左右吧。8 T& g! ~: {! k& C' }+ `$ D. E$ s
比如8颗粒的灯条,那么分配的内存就应该是 ...

; O8 h2 |: w% m' s# M选择数据当做0码 1码的时候  是不是需要 首尾有限制
jjbboox 回答时间:2018-4-10 13:34:21
本帖最后由 jjbboox 于 2018-4-10 13:39 编辑
# D9 m( S  |9 r2 ]! ?; [
翱翔云端的鸟 发表于 2018-4-10 09:459 M( e1 V# y8 X7 G& t7 l
选择数据当做0码 1码的时候  是不是需要 首尾有限制
, S7 s' s" B$ H7 i8 _' F! V2 B+ h( b
用3位代表1个bit通过SPI方式驱动WS2812时,SPI的速度请调整到2.25Mbps. f, B7 y  j+ J1 j7 K* l0 S
( ?$ H  B! I5 O, q8 z# X
以下是我用的代码,供你参考。ptr指向SPI Buf,value 是要转码的值。
$ {; r$ o8 i0 w- t, t8 A. Q
1 ]2 W* ]* f- h, A
  1. #define        PIXEL_BYTE_0        (0x92)                                //10010010
    * Y7 B, J4 E% C& H" i8 B4 b
  2.         #define        PIXEL_BYTE_1        (0x49)                                //01001001
    4 g, d2 u' B% @3 z# [2 o& B: x4 ~% b
  3.         #define        PIXEL_BYTE_2        (0x24)                                //00100100, ^, a9 r0 e& y# e

  4. 8 k0 {( H5 j/ a3 N
  5.         uint16_t ws2812_spi::setbuffer(){0 s! q% H: W' E# H# ^. F
  6.                 uint8_t *ptr = buf_ptr + 16;/ u. Q& C1 }1 U" t
  7.                 if(pixel_count == 0 || pixels == NULL || buf_ptr == NULL): m4 g4 F9 [+ B
  8.                         return 0;, a: J2 i7 @4 V/ T' B4 ?
  9.                 else {
    , p' _+ G, Y% D
  10.                         for(int i = 0; i < pixel_count; i ++){" \" e8 B  V; b0 j; G* j
  11.                                 ptr = setPixelBuf(ptr, (pixels[i].green) * pixels[i].brightness / 0x100);
    9 u5 C8 k4 b5 M: ^$ Q8 ~# S$ a
  12.                                 ptr = setPixelBuf(ptr, (pixels[i].red) * pixels[i].brightness / 0x100);
    " ^/ _+ w: S( {3 ?% X
  13.                                 ptr = setPixelBuf(ptr, (pixels[i].blue) * pixels[i].brightness / 0x100);& ?3 H6 ]) n  b7 U- j
  14.                         }8 C' c/ ]  }8 G% G; ?# b
  15.                 }
    & Z- ^; s  S8 C! |8 s: f
  16.                 return (ptr - buf_ptr);
    7 X. ?% I4 z& k. A
  17.         }
    - \7 }2 Q: Q& V; s( p+ i

  18. / b3 D6 G5 d3 I9 }2 x& |6 h
  19.         uint8_t* ws2812_spi::setPixelBuf(uint8_t *ptr, uint8_t value)
    ) M6 D# ?) ?( E5 G) b
  20.         {' b' `1 q$ L' J/ L- S/ p, M5 _# Q
  21.                 ptr[0] = PIXEL_BYTE_0;
    , g" A& Q, S0 O$ \! Z: i9 X& c
  22.                 ptr[1] = PIXEL_BYTE_1;
    , P. G7 h( y" p: H. F
  23.                 ptr[2] = PIXEL_BYTE_2;
    . a# q3 T; e  j5 N- Q7 M3 q
  24. , a; s; j2 n" C5 O; @7 {1 n
  25.                 ptr[0] |= (value & 0x80)?(0x40):0x00;
    , s% c# l7 h1 V0 b
  26.                 value <<= 1;
    ; w/ t  s' @3 ~4 D5 v
  27.                 ptr[0] |= (value & 0x80)?(0x08):0x00;
    0 z2 j% G8 d+ _
  28.                 value <<= 1;
    3 Y1 D: O# @( i! D
  29.                 ptr[0] |= (value & 0x80)?(0x01):0x00;9 i6 t) a6 m! r- Q" z/ F" s: W
  30.                 value <<= 1;
    8 \' X) V8 Q7 q+ A0 L/ p
  31.                 ptr[1] |= (value & 0x80)?(0x20):0x00;
    % @/ A6 z: W* S* ^4 k
  32.                 value <<= 1;
    & M1 g! a1 D" E* d2 T4 t
  33.                 ptr[1] |= (value & 0x80)?(0x04):0x00;
    9 j0 r8 P9 E5 ~2 W8 R
  34.                 value <<= 1;( x9 ^1 S4 D3 \( e3 @
  35.                 ptr[2] |= (value & 0x80)?(0x80):0x00;3 ]$ M9 U# z# o  r; `: ~- f
  36.                 value <<= 1;  W8 i* n- s- H
  37.                 ptr[2] |= (value & 0x80)?(0x10):0x00;
    + b% y* j4 A* [' N  b% s' r! l
  38.                 value <<= 1;
    # o4 L) k" J' V3 ?. Z) h/ L
  39.                 ptr[2] |= (value & 0x80)?(0x20):0x00;1 `, x  a* d7 [" S: z( ^; w
  40.                 value <<= 1;
    4 ^( v7 }$ C% j
  41. 5 _+ S5 }- Y3 L+ d& ^
  42.                 return (ptr + 3);
    3 r+ u6 S% _, h
  43.         }
    & P' H( t0 c5 q# G2 i
复制代码
8 }! V2 ]0 J3 R+ }2 u, o
3 y# p. d! Y, R& T& x4 w7 J
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 编辑
) r# F+ ^# B2 ?; Y* y! ~% H
. ]% L4 @9 c! A' g& I6 o% \滴滴滴滴的第一
00dd 回答时间:2018-8-23 22:26:08
jjbboox 发表于 2018-3-21 17:36# T' }) g& k" S6 }. L
其实把SPI的速度调到2.25Mbps,用3bit代表1位即可。这样24bit只需要用8个字节就OK了。
% Z! l3 ?* r  \* ^  ?' ~STM32F103C8T6 SPI2  ...
+ \  M" o( M. t. w
大佬,可以发源码参考一下吗?
al88 回答时间:2018-8-29 16:43:16
应该加精!!

所属标签

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