armfly 发表于 2022-3-21 16:09:41

GPIO操作对PIO小程序执行时间的影响很大

在PWM口线变化时刻,PIO实现的125M ADC触发信号出现脉宽变化。这将导致125M的采样时钟抖动厉害。普通GPIO操作也会导致抖动。PIO实现的SPI口线操作也会导致抖动。




PIO 125M 采集数据:/*-------------------------------------------------------------------------------
      pio 程序 CH1 CH2 双通道采集模式
-------------------------------------------------------------------------------*/
#define dso_ch1ch2_wrap_target 0    // 循环入口
#define dso_ch1ch2_wrap      1    // 循环末尾

static const uint16_t dso_ch1ch2_program_instructions[] = {
    // 0->1 时数据变化, 1->0时采样
    C_IN| IN_SRC_PINS | 16 | SIDE_SET(0x00), // 16bit 输入移位
    C_MOV | MOV_DEST_X | MOV_SRC_X | SIDE_SET(0x18),
    // goto 0
};

static const struct pio_programdso_ch1ch2_program = {
    .instructions = dso_ch1ch2_program_instructions,
    .length = 2,
    .origin = -1,
};

static inline pio_sm_config dso_ch1ch2_program_get_default_config(uint offset) {
    pio_sm_config c = pio_get_default_sm_config();
    sm_config_set_wrap(&c, offset + dso_ch1ch2_wrap_target, offset + dso_ch1ch2_wrap);
    sm_config_set_sideset(&c, 2, false, false);
    return c;
}

PWM部分代码:
#define PWM_TRIG_LEVEL_PIN   20      // 22
   
void PwmLevel(uint32_t _mv)
{
    /* 实测PWM分辨率65535时,PWM频率 = 3.81KHz*/
    uint slice_num = pwm_gpio_to_slice_num(PWM_TRIG_LEVEL_PIN);
   
    gpio_set_function(PWM_TRIG_LEVEL_PIN, GPIO_FUNC_PWM);   
    pwm_set_wrap(slice_num, 65535);
    pwm_set_chan_level(slice_num, PWM_CHAN_A, 10);
    pwm_set_enabled(slice_num, true);
}






armfly 发表于 2022-3-21 21:18:05

实测和PWM控制无关。普通GPIO操作也会出现这个问题。也就说在示波器高速采集等待触发期间,不能有GPIO操作。

      dma_channel_configure(dma_rx,
            &c,
            rxbuf, // write address
            &pio->rxf, // read address
            TEST_SIZE, // element count (each element is of size transfer_data_size)
            true); // don't start yet
      
      //dma_start_channel_mask(1u << dma_rx);
      
      sleep_us(10);
      gpio_put(TEST_GPIO, 0);
      sleep_us(10);
      gpio_put(TEST_GPIO, 1);
      
      dma_channel_wait_for_finish_blocking(dma_rx);

PIO实现的SPI从机波形,对125M触发信号的影响也很大,几乎不可以用了。


armfly 发表于 2022-3-22 03:13:23

乌龙事件。是逻辑分析仪测量方法的问题,将逻辑分析仪所有的地都接上就OK了。
125M 双通道ADC采集 + 25MHz SPI读取数据。没问题。

ifree 发表于 2022-3-22 06:59:11

最后一个波形,看上去还是不够“均匀”:lol

eric2013 发表于 2022-3-22 09:34:56

ifree 发表于 2022-3-22 06:59
最后一个波形,看上去还是不够“均匀”
逻辑分析仪的高低电平识别问题。400MHz逻辑分析仪识别125MHz,每个周期识别还不到4个点,识别成这样已经可以了。
页: [1]
查看完整版本: GPIO操作对PIO小程序执行时间的影响很大