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

树莓派Pico驱动WS2812时出现异常长GPIO脉冲问题

树莓派Pico驱动WS2812 LED时首段信号出现异常长脉冲问题

我在开发树莓派Pico驱动WS2812 LED的程序,示波器显示Pico发送正确信号前,画面左侧出现异常长脉冲,右侧信号完全符合预期,但无法定位问题原因。

示波器截图

示波器截图

程序代码

#include "pico/stdlib.h"
int main() {
    const uint GREENDO = 16;
    const uint BLUEBO = 17;
    const uint LEDPIN = 25;
    gpio_init(LEDPIN);
    gpio_init(GREENDO);
    gpio_init(BLUEBO);
    gpio_set_dir(GREENDO, GPIO_OUT);
    gpio_set_dir(BLUEBO, GPIO_OUT);
    gpio_set_dir(LEDPIN, GPIO_OUT);
    gpio_put(LEDPIN,1);
    gpio_put(BLUEBO,0);
    gpio_put(GREENDO,0);

    int GRBValues[] ={1,1,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,};
    int CurBit = 1;
    for (size_t Index = 0; Index < 6; Index++){
        for (size_t BitIndex = 0; BitIndex < 25; BitIndex++){
            CurBit = GRBValues[BitIndex];
            if (CurBit == 1){
                //800-450
                gpio_put(GREENDO,1);
               asm volatile ("nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n");
               asm volatile ("nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n");
               asm volatile ("nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n");
               asm volatile ("nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n");
               asm volatile ("nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n");
               asm volatile ("nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n");
               asm volatile ("nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n");
               asm volatile ("nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n");
               asm volatile ("nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n");
               asm volatile ("nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n");
               asm volatile ("nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n");
               asm volatile ("nop\nnop\nnop\n");
                gpio_put(GREENDO,0);
                asm volatile ("nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n");
                asm volatile ("nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n");
                asm volatile ("nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n");
                asm volatile ("nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n");
                asm volatile ("nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n");
                asm volatile ("nop\nnop\nnop\n");
            }else{
                //400-850
                gpio_put(GREENDO,1);
                asm volatile ("nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n");
                asm volatile ("nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n");
                asm volatile ("nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n");
                asm volatile ("nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n");
                gpio_put(GREENDO,0);
                asm volatile ("nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n");
                asm volatile ("nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n");
                asm volatile ("nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n");
                asm volatile ("nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n");
                asm volatile ("nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n");
                asm volatile ("nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n");
                asm volatile ("nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n");
                asm volatile ("nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n");
                asm volatile ("nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n");
                asm volatile ("nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n");
                asm volatile ("nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n");
                asm volatile ("nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n");
                asm volatile ("nop\nnop\nnop\n");
            }             
          /*  if (BitIndex == 0){
                sleep_us(51);   //Test to fix problem, did not work
              }*/
        }          
    }
    while (true){
        gpio_put(LEDPIN,0);
        sleep_ms(1000);
        gpio_put(LEDPIN,1);
        sleep_ms(1000);
    }
}

已尝试的调试方法

  • 在第一个比特后添加51us延迟,问题依旧
  • 使用空循环或填充无效数据,导致所有比特过长

怀疑方向

怀疑问题可能与for循环迭代启动的时间间隔有关,但无法确认为何仅首次迭代出现异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 19:13:19