You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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配置、普通/循环模式选择、内存宽度设置存在疑问

求助需求

  1. 如何正确计算TIM3的ARR与CCR参数,精准匹配SK6812RGBW的时序要求?
  2. DMA的模式(普通/循环)、FIFO配置、内存宽度需要如何调整,才能保证数据正确传输到定时器?
  3. 当前代码逻辑中是否存在导致LED异常的隐藏问题?

内容的提问来源于stack exchange,提问作者Graeme Coard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 18:57:34