完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
STM32控制WS2812灯带【含完整代码】
用STM32控制WS2812 RGB灯带的代码资料不多。这里的代码是通过示波器一点一点调整得到的。本着开源原则,和大家分享学习。 灯带信息 实现代码 核心代码如下: // 引脚对应的寄存器(更多信息见下文) #define A0_HIGH GPIOA->BSRR = 1 // A low electrical level. (GPIO_PIN_0: 1) #define A0_LOW GPIOA->BSRR = 65536u // A high electrical level.(GPIO_PIN_0: 1 << 16u) #define A1_HIGH GPIOA->BSRR = 2 // A low electrical level. (GPIO_PIN_1: 2) #define A1_LOW GPIOA->BSRR = 131072u // A high electrical level.(GPIO_PIN_1: 2 << 16u) #define B12_HIGH GPIOB->BSRR = 4096 // A low electrical level. (GPIO_PIN_12: 4096) #define B12_LOW GPIOB->BSRR = 268435456u // A high electrical level.(GPIO_PIN_12: 4096 << 16u) #define HIGH B12_HIGH // 持续一个很短时间的高电平 #define LOW B12_LOW // 持续一个很短时间的低电平 // 连续多个HIGH/LOW == 一个HIGH/LOW + delay函数 (卡示波器得到的) #define SIG1() HIGH;HIGH;HIGH; HIGH;HIGH;LOW // 一个 signal 1. #define SIG0() HIGH;HIGH;LOW; LOW;LOW;LOW // 一个 signal 0. // 示例颜色 (注意这里的颜色顺序是:高位->低位 —— G->R->B) #define RED 0x00ff00 #define GREEN 0xff0000 #define BLUE 0x0000ff #define LED_LEN 144 // 灯带长度 #define BIT_LEN 24 // 每颗灯对应24位 0/1 signal uint32_t led_buf[LED_LEN] = { 0 }; // 存储每颗灯的颜色值,范围:[0, 0xffffff]. void sync() { uint32_t bit_buf[LED_LEN * BIT_LEN] = { 0 }; // 将要传输的bit数组 for (uint32_t i = 0; i < LED_LEN; ++i) { for (uint32_t j = 0; j < BIT_LEN; ++j) { bit_buf[i * BIT_LEN + j] = (led_buf >> (BIT_LEN - 1 - j)) & 1; // 高位先传 } } __disable_irq(); // 关闭中断 for (uint32_t i = 0; i < LED_LEN * BIT_LEN; ++i) { if (bit_buf) { SIG1(); } else { SIG0(); } } __enable_irq(); // 开启中断 } 引脚对应寄存器信息大全 #define GPIO_PIN_0 ((uint16_t)0x0001) /* Pin 0 selected */ #define GPIO_PIN_1 ((uint16_t)0x0002) /* Pin 1 selected */ #define GPIO_PIN_2 ((uint16_t)0x0004) /* Pin 2 selected */ #define GPIO_PIN_3 ((uint16_t)0x0008) /* Pin 3 selected */ #define GPIO_PIN_4 ((uint16_t)0x0010) /* Pin 4 selected */ #define GPIO_PIN_5 ((uint16_t)0x0020) /* Pin 5 selected */ #define GPIO_PIN_6 ((uint16_t)0x0040) /* Pin 6 selected */ #define GPIO_PIN_7 ((uint16_t)0x0080) /* Pin 7 selected */ #define GPIO_PIN_8 ((uint16_t)0x0100) /* Pin 8 selected */ #define GPIO_PIN_9 ((uint16_t)0x0200) /* Pin 9 selected */ #define GPIO_PIN_10 ((uint16_t)0x0400) /* Pin 10 selected */ #define GPIO_PIN_11 ((uint16_t)0x0800) /* Pin 11 selected */ #define GPIO_PIN_12 ((uint16_t)0x1000) /* Pin 12 selected */ #define GPIO_PIN_13 ((uint16_t)0x2000) /* Pin 13 selected */ #define GPIO_PIN_14 ((uint16_t)0x4000) /* Pin 14 selected */ #define GPIO_PIN_15 ((uint16_t)0x8000) /* Pin 15 selected */ #define GPIO_PIN_All ((uint16_t)0xFFFF) /* All pins selected */ GPIOx->BSRR = GPIO_Pin_x; // 高电平 GPIOx->BSRR = (uint32_t)GPIO_Pin << 16u; // 低电平 注意点 如果不在传输数据过程中停止中断,数据传输会因为被打断而出现误差,导致灯带闪烁,颜色变得离谱。 传输bit时应该高位先传(详见代码sync()函数),颜色顺序为:高位->低位 —— G->R->B |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1760 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1613 浏览 1 评论
1058 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
721 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1670 浏览 2 评论
1932浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
724浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
564浏览 3评论
590浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
548浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-20 14:49 , Processed in 0.775200 second(s), Total 76, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号