对于用硬件SPI控制的方法,网上已经有很多资料了,我也是查看网上的资料重新进行了封装,主要遇到一个第一个灯始终无法控制问题。

首先感谢作者提供的思路和方法。

1.控制思路请看这一篇

https://blog.csdn.net/tq384998430/article/details/88542469?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3

2.代码的实现请看这一篇

https://blog.csdn.net/weixin_43572492/article/details/89632893

其中使用代码的实现后发现第一个灯时钟没法控制。后来发现了把复位指令直接放到每一次数据发送完成后,再发送一次就可以了。

我的代码实现如下,使用的STM32 HAL库

主要是封装了控制代码,如下实现了红、绿每500ms变化一次

//一般SPI速率控制在6.5MHz就能达到每个字节1.25us左右
#define CODE0 0xC0
#define CODE1 0xF8#define LED_COUNT_NUM   10    //灯的总长度//100次,
const uint8_t LedsArrayRest[100] = {0};
uint8_t LedsArray[LED_COUNT_NUM * 24];
int16_t LedsCount = 0;/* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */void WS2811_Set_RGB(uint8_t r,uint8_t g, uint8_t b, uint16_t len)
{//清除掉所有数据memset(LedsArray,0,len * 24);//添加数据进入到发送数组for(uint16_t i = 0; i < len; i ++){//红for(int8_t j = 7; j >= 0; j--){if((r & (1<<j)) == 0){LedsArray[LedsCount++] = CODE0;}else{LedsArray[LedsCount++] = CODE1;}}//绿for(int8_t j = 7; j >= 0; j--){if((g & (1<<j)) == 0){LedsArray[LedsCount++] = CODE0;}else{LedsArray[LedsCount++] = CODE1;}}//蓝for(int8_t j = 7; j >= 0; j--){if((b & (1<<j)) == 0){LedsArray[LedsCount++] = CODE0;}else{LedsArray[LedsCount++] = CODE1;}}}HAL_SPI_Transmit_DMA(&hspi1, LedsArray, LedsCount);LedsCount = 0;while(!(HAL_SPI_GetState(&hspi1) == HAL_SPI_STATE_READY));//发送完成后一定要发送一次复位,不然会第一个灯无法控制HAL_SPI_Transmit_DMA(&hspi1, LedsArrayRest, 100);while(!(HAL_SPI_GetState(&hspi1) == HAL_SPI_STATE_READY));
}/* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);WS2811_Set_RGB(100,0,0,8);HAL_Delay(500);WS2811_Set_RGB(0,100,0,8);HAL_Delay(500);}

//一般SPI速率控制在6.5MHz就能达到每个字节1.25us左右

SPI配置如下

时钟频率:这里没用最大的72M,使用48M,然后SPI分频可以得到接近6.4MHZ的频率,这样比较接近1.25us的时序。

以上参考链接如有侵权,麻烦作者告知,本人立即处理,谢谢理解。

STM32F103C8T6 硬件SPI+DMA 控制WS2811相关推荐

  1. GD32F303调试小记(二)之SPI(软件SPI、硬件SPI、硬件SPI+DMA)

    前言 目前有一个项目中用到了TFT-LCD,其驱动芯片为ILI9341.为更好的达到显示效果,在最终的代码中我们会使用单片机自带的硬件SPI+DMA模块(由于调试过程中SPI+DMA输出的波形没能驱屏 ...

  2. 【STM32】CubeMX+HAL库之 硬件IIC+DMA控制OLED(兼容SSD1306SH1106驱动)

    [STM32]CubeMX+HAL库之 硬件IIC+DMA控制1.3寸OLED 前言 目前网上大多数驱动OLED屏都采用软件IIC,因为HAL库的升级使得硬件IIC的稳定性得到了保障,所以想采用硬件I ...

  3. STM32G0 硬件SPI+DMA+LL库,最高通讯速率32MBit/s

    硬件SPI+DMA+LL库代码连接STM32G0硬件SPI+DMA+LL库,最高通讯速率32MBit/s-嵌入式文档类资源-CSDN下载 近期在写0.96寸OLED显示屏驱动的程序,之前试过用软件模拟 ...

  4. STM32F103C8T6硬件SPI控制6针/7针0.96寸OLED显示屏

    OLED介绍 OLED主要参数 1.高分辨率:12864(和12864LCD相同分辨率,但该OLED屏的单位面积像素点多). 2.广可视角度:大于160°. 3.低功耗:正常显示时0.04W. 4.宽 ...

  5. STM32 7针0.96寸OLED显示屏(硬件SPI+DMA)无需内核响应 超高刷新率!

    芯片:STM32f103c8t6 f103型号大同小异,其他芯片请根据情况修改接口和配置 使用的是7针的0.96寸OLED屏幕,黑白两色显示 以下是实物图 一.原理: 首先你要了解STM32上的AFI ...

  6. STM32 HAL 硬件IIC+DMA+简单图形库控制OLED

    目录 前言 一.建立工程 二.编写和移植 前期准备 驱动部分修改 三.使用和验证 结论 (2022年1月22日重制)本文主要是移植带简单图形库的程序,如果只是实现DMA控制,建议看[0.96寸 OLE ...

  7. 小熊派 FreeRTOS+SPI+DMA 驱动 TFT-LCD

    文章目录 小熊派 FreeRTOS+SPI+DMA 驱动 TFT-LCD 一.文章前言 二.SPI+DMA 配置 三.FreeRTOS 配置 四.代码编写 五.实验现象 小熊派 FreeRTOS+SP ...

  8. SPI驱动0.96/1.3寸 OLED屏幕,易修改为DMA控制

    目录 OLED SPI 端口定义 七针OLED引脚定义 六针OLED引脚定义 驱动程序 oled.c oled.h oledfont.h 使用 main.c 实验现象 STC实验箱4 IAP15W4K ...

  9. STM32硬件SPI控制TM1638 按键数码管LED显示模块

    STM32硬件SPI控制TM1638按键数码管LED显示模块   从淘宝买来的,TM1638专门是控制LED的,LED组合起来就可以变成数码管,还有按键,这个我就没管了,不想管了,发这个帖子只是为了记 ...

  10. 硬件SPI控制ST7789V

    文章目录 前言 一.能用的方法有那些? 1.利用硬件UART模拟SPI,实现9位数据发送 2.搭建一个数字逻辑电路,人为实现9位spi发送 3.发送两组8位SPI 二.具体操作 1.具体实现 总结 前 ...

最新文章

  1. HDU 1285--确定比赛名次【拓扑排序 amp;amp; 邻接表实现】
  2. python实训收获_英泰移动通信:学习Python心得体会
  3. 喜欢产品小师妹?你必须知道的一点产品知识,竞品分析:流利说雅思
  4. hdu 1874 Dijkstra算法模板
  5. java jpa 注解_Java : JPA相关以及常用注解
  6. 一个非常实用的 div+css 实现的导航条
  7. android开发EditText输入时弹出数字输入键盘
  8. ups维护服务器,UPS电源的在线维护和管理
  9. 电商项目的app学习笔记(三)-嵌套路由组件的实现
  10. 我眼中 迪杰斯特拉(Dijkstra)与 普雷姆 (prim)的 区别
  11. 第十二章 比较器(1.5)
  12. angelhack_我的团队如何撼动AngelHack Seattle Hackathon
  13. pdfbox或icepdf转换PDF为图片时,中文乱码处理
  14. java利用正则表达式提取字符串中的整数和小数部分
  15. A - The Fool HDU - 6555
  16. 【C++】定义一个求绝对值函数的模板,实现对不同数据类型的数求绝对值。
  17. python matplotlib画图及配色
  18. 基于Python的换脸应用
  19. 云客Drupal源码分析之权限系统(上)
  20. 运筹学——各类求解优化

热门文章

  1. 手工杀毒辅助软件(PC Hunter) V1.51 免费绿色版
  2. C++1.1 #include<iostream>
  3. 深度解读 - TDD(测试驱动开发)
  4. y480 linux无线网卡驱动,联想y480无线网卡驱动下载
  5. matlab节约里程法_求助节约算法MATLAB代码
  6. SqlServer 备份数据库语句
  7. java string 截取中文乱码_Java如何处理中文乱码问题
  8. 课程设计-工资管理系统
  9. 【全网世界区划最全整理输出之第三部分】全世界所有国家的行政区划整理,省市信息,已按照国家,省,市排好序,可直接复制使用,第三部分到12722行,总条数:21088
  10. HanLP Demo(学习笔记)