随遇安 发表于 2022-12-12 15:47

AT32F403A DMA传输数据翻转IO速度异常

测试一下使用定时器2通道1触发DMA传输数据到GPIO实现IO口的快速翻转,目前程序中只配置了定时器触发DMA,没有其他程序,DMA配置的是循环模式,没有开中断。但是以目前的测试来看,当触发频率超过20M时,DMA的速度停留在了20M(通过观察IO翻转频率观察的),无法进一步提高,这会是什么原因呢,测试IO口翻转频率是可以达到120M的,所以可能是达到了DMA传输的最快频率导致的吗,还是说可能是我哪配置错了

随遇安 发表于 2023-1-9 23:49

本帖最后由 随遇安 于 2023-1-9 23:52 编辑

感谢各位的回复指点,在这统一回复说明一下,直接调用IO寄存器是可以实现120MHZ的翻转频率的,所以GPIO配置是没问题的。也肯定不是示波器的问题,因为可以测出更高频率。经过测试应该是受限于DMA的带宽,传输速度不够快(当然相对来说已经很快了),导致IO翻转频率受限。感谢各位的意见,本帖到此结束,各位不用再留言了。

muyichuan2012 发表于 2022-12-12 17:55

定时器和DMA的配置程序可以贴一下吗?

随遇安 发表于 2022-12-12 19:36

muyichuan2012 发表于 2022-12-12 17:55
定时器和DMA的配置程序可以贴一下吗?

void timer2_pwm_dma_init(void)
{
        gpio_init_typegpio_init_struct;
        tmr_output_config_type tmr_output_struct;
        dma_init_type dma_init_struct;
       
        crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
        crm_periph_clock_enable(CRM_TMR2_PERIPH_CLOCK, TRUE);
        crm_periph_clock_enable(CRM_DMA1_PERIPH_CLOCK, TRUE);
       
        /* timer1 output pin Configuration */
        gpio_init_struct.gpio_pins = GPIO_PINS_0;
        gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
        gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
        gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
        gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
        gpio_init(GPIOA, &gpio_init_struct);
       
        tmr_base_init(TMR2, 1, 3);
        tmr_cnt_dir_set(TMR2, TMR_COUNT_UP);
       
        /* channel 1, 2, 3 and 4 configuration in output mode */
        tmr_output_default_para_init(&tmr_output_struct);
        tmr_output_struct.oc_mode = TMR_OUTPUT_CONTROL_PWM_MODE_A;
        tmr_output_struct.oc_output_state = TRUE;
        tmr_output_struct.oc_polarity = TMR_OUTPUT_ACTIVE_LOW;
        tmr_output_struct.oc_idle_state = TRUE;
        tmr_output_struct.occ_output_state = TRUE;
        tmr_output_struct.occ_polarity = TMR_OUTPUT_ACTIVE_HIGH;
        tmr_output_struct.occ_idle_state = FALSE;
       
        /* channel 1 */
        tmr_output_channel_config(TMR2, TMR_SELECT_CHANNEL_1, &tmr_output_struct);
        tmr_channel_value_set(TMR2, TMR_SELECT_CHANNEL_1, 1);
       
        tmr_dma_request_enable(TMR2, TMR_C1_DMA_REQUEST, TRUE);
       
        /* output enable */
        tmr_output_enable(TMR2, TRUE);
       
        /* enable tmr1 */
        tmr_counter_enable(TMR2, TRUE);
       
        /* dma1 channe6 configuration */
        dma_default_para_init(&dma_init_struct);
        dma_init_struct.buffer_size = sizeof(src_buffer)/2;
        dma_init_struct.direction = DMA_DIR_MEMORY_TO_PERIPHERAL;
        dma_init_struct.memory_base_addr = (uint32_t)src_buffer;
        dma_init_struct.memory_data_width = DMA_MEMORY_DATA_WIDTH_HALFWORD;
        dma_init_struct.memory_inc_enable = TRUE;
        dma_init_struct.peripheral_base_addr = (uint32_t)&GPIOB->odt;
        dma_init_struct.peripheral_data_width = DMA_PERIPHERAL_DATA_WIDTH_HALFWORD;
        dma_init_struct.peripheral_inc_enable = FALSE;
        dma_init_struct.priority = DMA_PRIORITY_HIGH;
        dma_init_struct.loop_mode_enable = TRUE;
        dma_init(DMA1_CHANNEL5, &dma_init_struct);
       
        dma_channel_enable(DMA1_CHANNEL5, TRUE);
}

随遇安 发表于 2022-12-13 10:57

muyichuan2012 发表于 2022-12-12 17:55
定时器和DMA的配置程序可以贴一下吗?

是配置程序有问题吗

muyichuan2012 发表于 2022-12-15 22:10

tmr_base_init(TMR2, 1, 3);这句话决定了你的触发频率。

随遇安 发表于 2022-12-15 22:32

muyichuan2012 发表于 2022-12-15 22:10
tmr_base_init(TMR2, 1, 3);这句话决定了你的触发频率。
是的,测试来看DMA传输速度没有达到触发速度。在240M主频下,DMA传输速度在30M左右(16bit),当我尝试提高主频到300M时,DMA传输速度提高到了38M左右,由此看来不是触发频率的问题,而是达到了DMA的最大传输速度。

febgxu 发表于 2023-1-5 11:31

20Mhz的频率就是有点快了。

mickit 发表于 2023-1-5 14:26

IO的驱动速度太快了。            

benjaminka 发表于 2023-1-5 15:05

是不是没有配置IO的速度为50Mhz的频率

zerorobert 发表于 2023-1-5 15:35

这个应该能支持50Mhz以上的吧。

随遇安 发表于 2023-1-5 18:15

本帖最后由 随遇安 于 2023-1-5 18:16 编辑

benjaminka 发表于 2023-1-5 15:05
是不是没有配置IO的速度为50Mhz的频率
直接调用寄存器翻转IO状态是可以达到120MHZ的,只不过用定时器触发DMA写IO寄存器就卡到了30M左右,应该是受限于DMA的传输速度

随遇安 发表于 2023-1-5 18:16

zerorobert 发表于 2023-1-5 15:35
这个应该能支持50Mhz以上的吧。
直接调用寄存器翻转IO状态是可以达到120MHZ的,只不过用定时器触发DMA写IO寄存器就卡到了30M左右,应该是受限于DMA的传输速度

pixhw 发表于 2023-1-6 13:48

有可能是你的示波器跟不上速度了。

minzisc 发表于 2023-1-6 15:08

你的IO配置代码有问题吗
            

kkzz 发表于 2023-1-6 16:09

是不是IO的配置出现问题了呢            

kkzz 发表于 2023-1-6 19:35

这个IO的速度跟不上了吗?
            

hudi008 发表于 2023-1-9 11:32

单片机的性能跟不上了吗?            

mikewalpole 发表于 2023-1-9 13:23

这个IO最大应该是50Mhz吧。

hearstnorman323 发表于 2023-1-9 13:53

你检查一下配置的IO口的速度是多少?

lihuami 发表于 2023-1-9 15:55

这个dma有问题吗?            
页: [1] 2
查看完整版本: AT32F403A DMA传输数据翻转IO速度异常