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);
}
实测和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触发信号的影响也很大,几乎不可以用了。
乌龙事件。是逻辑分析仪测量方法的问题,将逻辑分析仪所有的地都接上就OK了。
125M 双通道ADC采集 + 25MHz SPI读取数据。没问题。
最后一个波形,看上去还是不够“均匀”:lol ifree 发表于 2022-3-22 06:59
最后一个波形,看上去还是不够“均匀”
逻辑分析仪的高低电平识别问题。400MHz逻辑分析仪识别125MHz,每个周期识别还不到4个点,识别成这样已经可以了。
页:
[1]