资源简介
该资源包含了连个文件,分别是.c和.h,可以实现stm32f103c8t6开发板控制24位WS2812 5050RGB灯圈,其中灯个数可随意修改,在拿到文件后不能很好控制RGB灯时,需自行拿逻辑分析仪测出1,0码所需的延时时间。
代码片段和文件信息
#include “led.h“
#include “delay.h“//滴答时钟系统延时相关头文件,自行添加。因为下面函数中用到了Delay_us操作,不用系统滴答的话,可用自定义的延时函数HAL_Delay
//不过延时数值要尽量大一些最好用逻辑分析仪测一下时长
/*
WS2812 5050RGBLED灯是一款可级联无限个的,内置处理芯片的,由10时序控制的,色彩控制及呈现良好的灯
其10码对时间的要求相对苛刻,在选型处理器时一定要注意,处理器的处理频率是否达到所需控制量级,像一
般的51单片机是不能很好的控制这款灯的,但一般M系列内核的处理器都可以,当然集成51内核的还有很多处理
速度相对高一点的芯片,本人没有做过相应测试,但看到10码所需的纳秒级别就知道处理器的处理速度不能太
小。
*/
void led_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
//PA0
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB ENABLE );
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB &GPIO_InitStructure);
WS2812 = 1;
}
#define numLEDs 24 //灯的个数
unsigned char buf_R[numLEDs] = {0};//颜色缓冲
unsigned char buf_G[numLEDs] = {0};
unsigned char buf_B[numLEDs] = {0};
void RGB_Set_Up(); //送0码
void RGB_Set_Down(); //送1码
void HAL_Delay(unsigned int t)
{
while(t--);
}
//1码高电平850ns 低电平400ns 误差正负150ns
void RGB_Set_Up()
{
//这里要直接对寄存器进行操作,是因为WS2812 5050RGB灯对时间要求非常苛刻,对寄存器直接操作可以降低使用库函数处理时耗损时间的影响
GPIOB->BSRR = 0x01;
//经过逻辑分析仪调试的延时,这个很重要,不同的MPU其处理速度不同,需用逻辑分析仪获得这个延时时长是否达到要求,下同。
HAL_Delay(4);
GPIOB->BRR = 0x01;
HAL_Delay(1);
__nop;
}
//1码高电平400ns 低电平850ns 误差正负150ns
void RGB_Set_Down()
{
GPIOB->BSRR = 0x01;
//经过逻辑分析仪调试的延时
HAL_Delay(1);
GPIOB->BRR = 0x01;
HAL_Delay(2);
}
//发送24位数据
void Send_2811_24bits(unsigned char G8unsigned char R8unsigned char B8)
{
unsigned int n = 0;
//发送G8位
for(n=0;n<8;n++)
{
G8<<=n;
if(G8&0x80 == 0x80)
{
RGB_Set_Up();
}
else
{
RGB_Set_Down();
}
}
//发送R8位
for(n=0;n<8;n++)
{
R8<<=n;
if(R8&0x80 == 0x80)
{
RGB_Set_Up();
}
else
{
RGB_Set_Down();
}
}
//发送B8位
for(n=0;n<8;n++)
{
B8<<=n;
if(B8&0x80 == 0x80)
{
RGB_Set_Up();
}
else
{
RGB_Set_Down();
}
}
}
//复位码
void RGB_Rst()
{
WS2812 = 0;
Delay_us(50);
}
//把24位数据GRB码转RGB
void Set_Colour(unsigned char runsigned char gunsigned char b)
{
unsigned char i;
for(i=0;i {
buf_R[i] = r; //缓冲
buf_G[i] = g;
buf_B[i] = b;
}
for(i=0;i {
Send_2811_24bits(buf_G[i]buf_R[i]buf_B[i]);//????
}
}
//某一个点显示的颜色
void SetPointColour(unsigned int numunsigned char runsigned char gunsigned char b)
{
unsigned char i;
for(i=0;i {
buf_R[num] = r;//??
buf_G[num] = g;
buf_B[num] = b;
}
for(i=0;i {
Send_2811_24bits(buf_G[i]buf_R[i]buf_B[i]);//????
}
}
//颜色交换24位不拆分发
void SetPixelColor(unsigned char numunsigned long c)
{
unsigned char i;
for(i=0;i {
buf_R[num] = (unsigned char)(c>>16);
buf_G[num] = (unsigned char)(c>>8);
buf_B[num] = (unsigned char)(c);
}
for(i=0;i
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2019-01-09 11:28 WS2812_RGBLED\
文件 6516 2019-01-09 12:03 WS2812_RGBLED\led.c
文件 1226 2019-01-09 11:43 WS2812_RGBLED\led.h
- 上一篇:deap2.1软件教程
- 下一篇:游戏编程中的寻路算法研究
相关资源
- stm32同步规则转换DMA传输
- STM32f103 ADC采集电压数据 显示在LCD液晶
- STM32F103 LORA配置
- STM32F103的PWM的扫频程序
- STM32F103读取MPU6050原始数据
- STM32f103两线PT100例程.rar
-
DAPli
nk stm32f103cbt6内核 原理图及使用 - STM32F103ZET6核心板原理图和封装库
- 基于stm32f103zet6de条码识别
- STM32驱动MG955舵机的源代码
- 适用于2016年电子设计竞赛江苏省以及
- STM32f103c8t6编码器.zip
- 贝一特 STM32F103ZET6 V3.0核心板电路图
- STM32F1-MPU9250陀螺仪源码
- STM32F103C6简单的应用原理图
- STM32f103驱动SSD1306的OLED0.96寸演示动画
- 三轴陀螺仪MPU6050基于STM32F103的IIC驱动
- STM32F103增量式编码器的采集以及处理
- stm32f103-sim800cTCP透传
- STM32F103C8T6 V1_2原理图
- grbl1.1f20170801-stm32f103c8t6
- STM32F103ZET6原理图引脚封装
- STM32f103的DS18B20温度读取
- stm32F103通过IIC读取MPU9250用DMP融合得到
- STM32F103ZET6最小系统板原理图
- SPWM波产生STM32F103 DMA
- STM32F103测频率
- STM32F103+DAC8552
- STM32F103C8T6 LCD12864 串行通信
- cubeMX视频教程stm32hal库函数cubemx实战讲
评论
共有 条评论