欢迎入群共同学习交流
时间记录:2023/12/2
一、基础介绍
__NOP();宏为空操作,大概1/72us
GPIO口可直接控制
1 数据传输时序图
2 数据传输时间
3 数据传输方式
4 24bit数据结构(高位先发)
二、代码实现(GPIO和延时直接实现)
头文件(.h)
#ifndef __WS2812X_H__
#define __WS2812X_H__
#include <stm32f10x.h>
#include "delay.h"
#include "sys.h"
void vWs2812xInit(void);
void vWs2812xWrite3Byte(u32 colorData);
void vWs2812xReset(void);
#endif
源文件(.c)
#include "ws2812x.h"
static void vDelay21Nop(void);
static void vWriteBit0(void);
static void vWriteBit1(void);
void vWs2812xInit(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
GPIO_SetBits(GPIOA,GPIO_Pin_0);
Delay_Init();
}
static void vDelay21Nop(void)
{
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
__NOP();
}
static void vWriteBit0(void)
{
PAout(0)=1;
vDelay21Nop();
PAout(0)=0;
vDelay21Nop();
vDelay21Nop();
vDelay21Nop();
}
static void vWriteBit1(void)
{
PAout(0)=1;
vDelay21Nop();
vDelay21Nop();
vDelay21Nop();
PAout(0)=0;
vDelay21Nop();
}
void vWs2812xWrite3Byte(u32 colorData)
{
for(u8 index=0;index<24;index++){
if((colorData << index) & 0x800000)
vWriteBit1();
else
vWriteBit0();
}
}
void vWs2812xReset(void)
{
PAout(0)=0;
Delay_Us(500);
}
三、实现的蹦迪灯效果
蹦迪灯