资源简介
该资源包含了连个文件,分别是.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软件教程
- 下一篇:游戏编程中的寻路算法研究
相关资源
- 基于stm32f103ve的程序——跑马灯实验
- STM32f103超声波模块例程
- stm32f103c8t6 4 oled.rar
- STM32F103 串口程序(完整版)
- STM32F103定时器中断程序
- [免费]基于stm32f103ze 的OLED驱动代码
- STM32F103RBT6驱动UC1698控制芯片的160160黑
- STM32F103 DS18B20 V3.5.0固件库驱动程序工
- STM32F103 CC2500完整驱动(模拟SPI)
- SX1280.rar
- STM32F103C8T6+NRF24l01无线通信
- stm32f103.SchDoc
- STM32F103 USART+DMA
- 基于STM32F103C8单片机的晶联讯电子JL
- STM32F103实现OV7670摄像头显示
- STM32F103VCT6TR - High-density performance lin
- stm32f103 虚拟U盘,调试成功的
- 基于stm32F103vct6的SD卡FATFS文件系统移植
- STM32F103启动文件HD;MD
- 基于STM32F103的实时时钟程序,采用D
- STM32F103系列PWM输出应用之纸短情长音
- STM32F103移植FreeModbus实现modbus主机.zi
- 基于STM32F103C8T6的循迹避障小车完成
- 基于STM32+TM1638芯片的共阳极数码管驱
- stm32f103AES加密 cbc模式
- 中国移动 M5310 模组资料 DEMO 例程- S
- STM32F103移植rt-thread
- PCA9685驱动STM32F103
- stm32f103c8t6-max31865-pt100测温
- stm32F103C8外部flash图片显示
评论
共有 条评论