打印

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

[复制链接]
6411|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
随遇安|  楼主 | 2022-12-12 15:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
测试一下使用定时器2通道1触发DMA传输数据到GPIO实现IO口的快速翻转,目前程序中只配置了定时器触发DMA,没有其他程序,DMA配置的是循环模式,没有开中断。但是以目前的测试来看,当触发频率超过20M时,DMA的速度停留在了20M(通过观察IO翻转频率观察的),无法进一步提高,这会是什么原因呢,测试IO口翻转频率是可以达到120M的,所以可能是达到了DMA传输的最快频率导致的吗,还是说可能是我哪配置错了

使用特权

评论回复
来自 2楼
随遇安|  楼主 | 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_type  gpio_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);
}

使用特权

评论回复
5
随遇安|  楼主 | 2022-12-13 10:57 | 只看该作者
muyichuan2012 发表于 2022-12-12 17:55
定时器和DMA的配置程序可以贴一下吗?

是配置程序有问题吗

使用特权

评论回复
6
muyichuan2012| | 2022-12-15 22:10 | 只看该作者
tmr_base_init(TMR2, 1, 3);这句话决定了你的触发频率。

使用特权

评论回复
7
随遇安|  楼主 | 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的最大传输速度。

使用特权

评论回复
8
febgxu| | 2023-1-5 11:31 | 只看该作者
20Mhz的频率就是有点快了。

使用特权

评论回复
9
mickit| | 2023-1-5 14:26 | 只看该作者
IO的驱动速度太快了。              

使用特权

评论回复
10
benjaminka| | 2023-1-5 15:05 | 只看该作者
是不是没有配置IO的速度为50Mhz的频率

使用特权

评论回复
11
zerorobert| | 2023-1-5 15:35 | 只看该作者
这个应该能支持50Mhz以上的吧。

使用特权

评论回复
12
随遇安|  楼主 | 2023-1-5 18:15 | 只看该作者
本帖最后由 随遇安 于 2023-1-5 18:16 编辑
benjaminka 发表于 2023-1-5 15:05
是不是没有配置IO的速度为50Mhz的频率

直接调用寄存器翻转IO状态是可以达到120MHZ的,只不过用定时器触发DMA写IO寄存器就卡到了30M左右,应该是受限于DMA的传输速度

使用特权

评论回复
13
随遇安|  楼主 | 2023-1-5 18:16 | 只看该作者
zerorobert 发表于 2023-1-5 15:35
这个应该能支持50Mhz以上的吧。

直接调用寄存器翻转IO状态是可以达到120MHZ的,只不过用定时器触发DMA写IO寄存器就卡到了30M左右,应该是受限于DMA的传输速度

使用特权

评论回复
14
pixhw| | 2023-1-6 13:48 | 只看该作者
有可能是你的示波器跟不上速度了。

使用特权

评论回复
15
minzisc| | 2023-1-6 15:08 | 只看该作者
你的IO配置代码有问题吗
              

使用特权

评论回复
16
kkzz| | 2023-1-6 16:09 | 只看该作者
是不是IO的配置出现问题了呢              

使用特权

评论回复
17
kkzz| | 2023-1-6 19:35 | 只看该作者
这个IO的速度跟不上了吗?
              

使用特权

评论回复
18
hudi008| | 2023-1-9 11:32 | 只看该作者
单片机的性能跟不上了吗?              

使用特权

评论回复
19
mikewalpole| | 2023-1-9 13:23 | 只看该作者
这个IO最大应该是50Mhz吧。

使用特权

评论回复
20
hearstnorman323| | 2023-1-9 13:53 | 只看该作者
你检查一下配置的IO口的速度是多少?

使用特权

评论回复
21
lihuami| | 2023-1-9 15:55 | 只看该作者
这个dma有问题吗?              

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

10

帖子

0

粉丝