请选择 进入手机版 | 继续访问电脑版

硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1068|回复: 4
收起左侧

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

[复制链接]

747

主题

1048

回帖

3294

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3294
发表于 2022-3-21 16:09:41 | 显示全部楼层 |阅读模式
在PWM口线变化时刻,PIO实现的125M ADC触发信号出现脉宽变化。这将导致125M的采样时钟抖动厉害。普通GPIO操作也会导致抖动。PIO实现的SPI口线操作也会导致抖动。


image.png

PIO 125M 采集数据:
[C] 纯文本查看 复制代码
/*-------------------------------------------------------------------------------
        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_program  dso_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部分代码:
[C] 纯文本查看 复制代码
#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);
}






回复

使用道具 举报

747

主题

1048

回帖

3294

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3294
 楼主| 发表于 2022-3-21 21:18:05 | 显示全部楼层
实测和PWM控制无关。普通GPIO操作也会出现这个问题。也就说在示波器高速采集等待触发期间,不能有GPIO操作。
image.png
[C] 纯文本查看 复制代码
        dma_channel_configure(dma_rx,
            &c,
            rxbuf, // write address
            &pio->rxf[sm], // 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触发信号的影响也很大,几乎不可以用了。
image.png

回复

使用道具 举报

747

主题

1048

回帖

3294

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3294
 楼主| 发表于 2022-3-22 03:13:23 | 显示全部楼层
乌龙事件。是逻辑分析仪测量方法的问题,将逻辑分析仪所有的地都接上就OK了。
125M 双通道ADC采集 + 25MHz SPI读取数据。没问题。
image.png
回复

使用道具 举报

18

主题

90

回帖

144

积分

初级会员

积分
144
发表于 2022-3-22 06:59:11 | 显示全部楼层
最后一个波形,看上去还是不够“均匀”
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
105942
QQ
发表于 2022-3-22 09:34:56 | 显示全部楼层
ifree 发表于 2022-3-22 06:59
最后一个波形,看上去还是不够“均匀”

逻辑分析仪的高低电平识别问题。400MHz逻辑分析仪识别125MHz,每个周期识别还不到4个点,识别成这样已经可以了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-3-29 21:08 , Processed in 0.186758 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表