SPI 读取不同长度 寄存器_SPI发送协议的STM单片机实现- 利用CubeMx控制WS2812灯带...

62bbc64bff7c3015197a3b3c414f5efc.png

欢迎关注BUG记录知乎专栏BUG记录公众号,关注BUG记录公众号回复2812获取本文的参考单片机程序以及STM32CubeMx的安装包和库文件

755a390269dad7a9cb004cf43664e4a5.png
微信号:BugRec

之前曾写过SPI协议的verilog实现,其实单片机也有很多地方用到了SPI,今天我们说一个比较冷门的SPI用法——控制WS2812灯带。

本文主要介绍STM32CubeMx的使用,WS2812灯带的控制。通过WS2812的例程,简单展示STM32CubeMx的方便,快捷


玩过单片机的人或多或少都知道STM32单片机,而STM32单片机因为其相对而言强大的性能,操作也变得较为复杂;为了让更多的人能够快速的上手STM32,减少各种外设内设寄存器操作的复杂干扰,官方推出了STM32CubeMx,能够以图形化界面,设置好相关的内部寄存器,使开发者不被底层操作束缚。

22dde807b139b92016cf71dbe94a4393.png
WS2812 图片来源网上

WS2812,如上图,它可以显示256级亮度,完成16777216种颜色的全真色彩显示。用它可以完成各种绚丽的色彩显示。但是,它的控制也有一点麻烦,通过一根线上占空比不同区别0-1,将色彩的RGB二进制代码发送到WS2812显示

c5d6a1711995d5dcaa00308429d70859.png
输入码型 图片来源网上

6f26b0429f223e0378871c213ab25cf8.png
传输时间 图片来源网上

RGB一共要发24位,而输入码型却不是简单的高低电平,它有较为复杂的时序要求;为了解决这个问题,有人想到了“曲线实现”的方法,通过SPI输出不同的数据来实现对WS2812的控制。

举例来说,假设SPI发送速率为4.5MBit/s, 那么发送1bit所占的时间为1/4.5 us,大概为0.22us; 那么,我发送0xf0时,前4位数都是高电平,占时0.88us,满足了T1L的高电平时间,这时候有人会说你低4位都是低电平,没关系,满足条件后的低电平默认为空闲状态,实验证明这确实也不会影响最终效果。

同样,发送0xc0,满足T0L的时序要求,而现在,需要做的就是使用STM32CubeMx完成相关的寄存器设置;

b074ed7a5ec41088a759af75c792a0bc.png
New Project

a933cd4e6d92f5ba16a7ec54bb1a7ac3.png
找到相应的STM32型号,然后Start Project

2c40a0bd459108afed91a40bbb84ecbd.png
设置时钟源

415d5ca937a3befcc78a979d33197ca1.png
HSE(High Speed Clock)选用Crystal/Ceramic Resonator

这个地方需要注意,因为SPI的速率较高,内部的8MHz时钟可能无法满足,这个时候需要启用外部晶振,再经过PLL倍频,操作如下:

0d5eaf98937730bf7bfc0ce757436a32.png
PLL倍频操作如上图

PLL的倍频操作如上图,可以适当做调整。

2690c59381b2ea78cf42902b5f402571.png
Debug选用

设置好Debug,否则没办法Debug代码;这个地方根据自己的调试器做选择;

9b37431aeef6641e8e04319d7d5b320e.png
开始SPI发送模式

选用SPI1,模式选择仅主发送,然后在Parameter Setting里面,选择MSB First,上面的PLL设置倍频后,SPI的时钟为72MHz,经过预分频16后,SPI的波特率为4.5MBit/s,这个地方需要选择CPOL和CPHA,关于CPOL,CPHA的内容可以查看配置芯片寄存器的SPI通信协议的verilog实现(一)

61bcef962e9fecb0d8d0e65bf31cc8d2.png
SPI的DMA设置

这个地方,添加一个SPI1_TX的DMA,具体设置如上;

a4110a9043e649e86a0157df14d6e626.png
Project Manager设置

点击Project Manager子标签,设置如同上面

6e50a72016de4c86e26dea554f6a8261.png
Project Manager设置

注意选择正确的Toolchain,然后点击右上角“generate code”,就可以生成相关的工程文件啦;

7fb605c9f8254520461240add68be843.png
注意ws2812.h ws2812.c不是工程生成的

f5a9f051700785107b36889013957b48.png
串口通信控制

里面的通信控制主要是使用了HAL_SPI_Transmit_DMA函数,这是HAL库自带的库函数,使用这个库函数发送数据;

b572448533154fbd4ff06865ebbcfcf9.png
RGB转成SPI需要发送的数据

这个是RGB转成SPI发送需要发送的数据;转换的过程比较简单粗暴,没想什么巧法子。

0f4b9e2c95655dca06782d8187d307a7.png
WS2812的RGB发送程序

这个是WS2812总的发送程序,其实也就是结合了上面的两个程序,到此WS2812驱动就基本写完了,具体细节可以关注BUG记录公众号回复2812获取本文的参考单片机程序以及STM32CubeMx的安装包和库文件

注意,STM32CubeMx生成的代码里想做修改,需要在“/* USER CODE END WHILE */”和“/* USER CODE BEGIN 3 */”中间写,这样如果使用STM32CubeMx重新修改设置,重新生成代码不会抹掉用户做的代码修改;

maxs-well/ws2812_by_SPI_DMA_STM32​github.com
cc9821d120adb6f4c7360d1033a9087d.png

这是本文用到的代码,除去ws2812.c和ws2812.h,其他的源代码基本是STM32CubeMx生成,如果想看本文用到的STM32CubeMx工程,安装包和库文件,欢迎关注微信公众号BUG记录(BugRec),回复2812获取资源。

如果有更好的方法方案可以留言一起谈论,欢迎大家点赞收藏留言讨论交流。


万物皆可卷积:配置芯片寄存器的SPI通信协议的verilog实现(二)- Verilog实现讲解​zhuanlan.zhihu.com
e1dc2877631081bc7408712aeb39dffb.png
万物皆可卷积:(LVDS差分信号简单处理)4. 使用ISERDES接收高速串行数据​zhuanlan.zhihu.com
12af3b9f8f2eec348bd3428e7c0ddfb3.png
万物皆可卷积:(LVDS差分信号简单处理)3. Idelay对时序的补救​zhuanlan.zhihu.com
12af3b9f8f2eec348bd3428e7c0ddfb3.png
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值