树莓派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
相关产品推荐
相关产品推荐

