用STC32G144K246驱动WS2812(PWM方式)

单片机在频率较高的情况,完全可以使用软件延时的方式来驱动WS2812。但网上一般都不采用这种方式。本人在参考STC官方例程和查阅手册的基础上,终于实现了使用PWM模式来驱动WS2812,效果如下:
https://www.bilibili.com/video/BV1b6KE6JEsx/
下面是PWM初始化函数:
void PWMA5_Init(void)
{
P4M1 &= ~0x40;P4M0 |= 0x40;//P46
PWMA_PSCRH = 0;PWMA_PSCRL = 0;//分频

PWMA_CCMR5 = 0x60;
PWMA_CCER3 = 0x03;

PWMA_ARRH = 0x00;
PWMA_ARRL = 30;
PWMA_CCR5H = 0x00;
PWMA_CCR5L = 0x55;

PWMA_ENO2 |=0x01;
PWMA_PS2 = 0x00; //选择P4.6

PWMA_BKR = 0x80;
PWMA_CR1 |= 0x09;
}
发送八位数据函数:
void SendData(u8 dat)
{
u8 i;
for(i=0;i<8;i++)
{
if(dat & 0x80)
PWMA_CCR5L = 8;
else
PWMA_CCR5L = 22;
PWMA_CR1 |= 0x01;
dat = dat<<1;
while(PWMA_CR1 &0x01);
}
}

发送24位数据函数:
void WS2812_rand_color(u8 R,u8 G,u8 B)
{
SendData(G);
SendData(R);
SendData(B);
}
主函数:
void main(void)
{

EAXFR = 1; //扩展寄存器(XFR)访问使能
CKCON = 0; //提高访问XRAM速度
PWMA5_Init(); // 初始化 PWMA5
while(1)
{
WS2812_rand_color(1,0,0);
delay_ms(500);
WS2812_rand_color(0,1,0);
delay_ms(500);
WS2812_rand_color(0,0,1);
delay_ms(500);
}
}

2026.7.17

image

欢迎关注本人公众号,了解更多。

posted @ 2026-07-17 11:36  lmn2005  阅读(33)  评论(0)    收藏  举报