STM32H7控制SK6812RGBW/Neopixel异常问题求助
STM32H757XIH6控制SK6812RGBW LED异常问题排查
硬件与基础配置
- 主控:STM32H757XIH6
- LED负载:9颗SK6812RGBW灯条,通过1.3kΩ上拉电阻连接至PC7引脚
- 控制方案:采用DMA+PWM方式驱动
- 核心参数:
- SK6812RGBW时序要求:0码为0.4μs高电平 + 0.85μs低电平,1码为0.8μs高电平 + 0.45μs低电平,复位信号需≥80μs低电平
- 时钟配置:APB1 Timer时钟为240MHz
- TIM3配置:16位定时器,DMA流配置为半字模式
- DMA配置:尝试使用循环模式,缓冲区声明为
__attribute__((aligned(4)))
代码实现
led.h
/* * led.h * * Created on: Jan 27, 2025 * Author: Graeme */ #ifndef APPLICATION_USER_CORE_DASH_APP_LED_LED_H_ #define APPLICATION_USER_CORE_DASH_APP_LED_LED_H_ #include "header.h" #include "tim.h" #define NEOPIXEL_ZERO 72 #define NEOPIXEL_ONE 144 #define NUM_PIXELS 9 #define DMA_BUFF_SIZE (NUM_PIXELS * 32) + 64 typedef union { struct { uint8_t w; uint8_t b; //switch coz some reason uint8_t g; uint8_t r; } color; uint32_t data; } PixelRGBW_t; extern void led_test(); #endif /* APPLICATION_USER_CORE_DASH_APP_LED_LED_H_ */
led.c
/* * led.c * * Created on: Jan 27, 2025 * Author: Graeme */ #include "led.h" void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim) { //HAL_TIM_PWM_Stop_DMA(htim, TIM_CHANNEL_2); } void led_test() { PixelRGBW_t pixel[NUM_PIXELS] = { 0 }; uint32_t dmaBuffer[DMA_BUFF_SIZE]__attribute__((aligned(4))) = { 0 }; uint32_t *pBuff; for (int i = 0; i < NUM_PIXELS; i++) { pixel[i].color.r = 3; pixel[i].color.g = 7; pixel[i].color.b = 15; pixel[i].color.w = 31; } pBuff = dmaBuffer; for (int i = 0; i < NUM_PIXELS; i++) { for (int j = 31; j >= 0; j--) { if ((pixel[i].data >> j) & 0x01) { *pBuff = NEOPIXEL_ONE; } else { *pBuff = NEOPIXEL_ZERO; } pBuff++; } } for (int i = 0; i < 64; i++) { dmaBuffer[DMA_BUFF_SIZE - 65 + i] = 0; } // dmaBuffer[DMA_BUFF_SIZE - 1] = 0; // last element must be 0! HAL_TIM_PWM_Start_DMA(&htim3, TIM_CHANNEL_2, dmaBuffer, DMA_BUFF_SIZE); //HAL_Delay(10); //HAL_TIM_PWM_Stop_DMA(&htim3, TIM_CHANNEL_2); }
注:已注释DMA停止函数,尝试使用DMA循环模式
问题现象
- LED随机点亮,颜色固定(重启后颜色会变化),完全不符合预期的RGBW值
- 定时器参数测试异常:
- 当ARR=299,CCR值设为144(对应1码)、72(对应0码)时,输出PWM频率400KHz(周期2.5μs),位时序符合SK6812要求,但LED依旧异常
- 当ARR=149,CCR值设为72(对应1码)、36(对应0码)时,输出PWM频率800KHz(周期1.25μs),实测位时序仅为预期的一半
- 调试确认DMA缓冲区的SK6812RGBW编码位序正确,但LED无正确响应
- 对DMA的FIFO配置、普通/循环模式选择、内存宽度设置存在疑问
求助需求
- 如何正确计算TIM3的ARR与CCR参数,精准匹配SK6812RGBW的时序要求?
- DMA的模式(普通/循环)、FIFO配置、内存宽度需要如何调整,才能保证数据正确传输到定时器?
- 当前代码逻辑中是否存在导致LED异常的隐藏问题?
内容的提问来源于stack exchange,提问作者Graeme Coard
相关产品推荐
相关产品推荐

