问答

汇集网友智慧,解决技术难题

21ic问答首页 -

GD32 DMA

2025-08-22
本帖最后由 ddb_21ic 于 2025-8-20 09:58 编辑

    //---------------------------------------------------------------------
    /* connect key EXTI line to key GPIO pin */
    syscfg_exti_line_config(EXTI_SOURCE_GPIOE, EXTI_SOURCE_PIN3);

    /* configure key EXTI line */
    exti_interrupt_flag_clear(EXTI_3);      
    exti_init(EXTI_3, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
    // *** exti_init(EXTI_3, EXTI_EVENT, EXTI_TRIG_FALLING); *********
    exti_interrupt_flag_clear(EXTI_3);
   
    // *** exti_event_enable(EXTI_3);                                 //  Event模式不能作为dma同步信号   
    /* enable and set key EXTI interrupt to the lowest priority */
    nvic_irq_enable(EXTI3_IRQn, 2U, 0U);

这里用红色代码,DMA不工作;绿色代码,DMA就能同步启动,中断函数空着的也没问题
这样CPU会增加很多没意义的中断,该怎么解决呢?
EVENT只能用于唤醒MCU?
回答 +关注
人浏览 人回答问题 分享 举报
个回答

  • 就是想禁用中断,不然MCU时间就白白消耗在每秒几十K的中断上了
  • 豌豆爹 发表于 2025-8-21 12:41
    事件模式的设计目的就是不触发中断,而是通过硬件直接触发其他外设。

    谢谢回复,请看7楼代码,改为ENVENT模式,DMA就不传输了
  • 本帖最后由 ddb_21ic 于 2025-8-21 16:31 编辑

    完整的DMA初始化代码

    void spi_dma_data_buff_config(void)
    {
        dma_single_data_parameter_struct dma_init_struct;
        dmamux_gen_parameter_struct dmamux_gen_init_struct;
        dmamux_sync_parameter_struct dmamux_sync_init_struct;
       
        /* deinitialize DMA registers of a channel */
        dma_deinit(DMA0, DMA_CH1);
       
        /* SPI3 DMA0_CH1 SPI发送,PE3 DRDY 触发SPI发送,开始数据传输 */
      dma_single_data_para_struct_init(&dma_init_struct);
            
        dma_init_struct.request = DMA_REQUEST_SPI3_TX;                        //SPI_TX触发DMA传输
        dma_init_struct.direction = DMA_MEMORY_TO_PERIPH;   
        dma_init_struct.memory0_addr = (uint32_t)(&spi_dma_tx_buff[0]);
        dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_DISABLE;   
        dma_init_struct.periph_memory_width = DMA_PERIPH_WIDTH_8BIT;
        dma_init_struct.number = spi_dma_frame_size;                  //发送一个ADC读取命令帧
        dma_init_struct.periph_addr = (uint32_t)&SPI_TDATA(SPI3);
        dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
        dma_init_struct.priority = DMA_PRIORITY_LOW;
        dma_init_struct.circular_mode = DMA_CIRCULAR_MODE_ENABLE;

        dma_single_data_mode_init(DMA0, DMA_CH1, &dma_init_struct);                                          
       
        //---------------------------------------------------------------------
        /* connect key EXTI line to key GPIO pin */
        syscfg_exti_line_config(EXTI_SOURCE_GPIOE, EXTI_SOURCE_PIN3);

        /* configure key EXTI line */
        exti_interrupt_flag_clear(EXTI_3);      
        exti_init(EXTI_3, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
        //exti_init(EXTI_3, EXTI_EVENT, EXTI_TRIG_FALLING);
        exti_interrupt_flag_clear(EXTI_3);
       
        // exti_event_enable(EXTI_3); //Event模式不能作为dma同步信号   
       
        /* enable and set key EXTI interrupt to the lowest priority */
        nvic_irq_enable(EXTI3_IRQn, 2U, 0U);
       
        //---------------------------------------------------------------------
        /* DMAMUX channel configuration */
        /* initialize DMA request multiplexer channel 0 with synchronization mode */                  
        dmamux_sync_struct_para_init(&dmamux_sync_init_struct);
        dmamux_sync_init_struct.sync_id        = DMAMUX_SYNC_EXTI3;                   //EXTI_3作为DMA同步信号
        dmamux_sync_init_struct.sync_polarity  = DMAMUX_SYNC_FALLING;
        dmamux_sync_init_struct.request_number = spi_dma_frame_size;
        dmamux_synchronization_init(DMAMUX_MUXCH1, &dmamux_sync_init_struct);
        dmamux_synchronization_enable(DMAMUX_MUXCH1);     
       
        dma_channel_enable(DMA0, DMA_CH1);                           //等待DRDY,在EXTI_3中断时打开DMA通道
    }
  • 禁用不必要的中断
    ddb_21ic 2025-8-21 16:34 回复TA
    谢谢回复,请看7楼代码,改为ENVENT模式,DMA就不传输了 
  • 检查 DMA 的传输方向。源地址和目标地址配置是否正确。
    ddb_21ic 2025-8-21 16:34 回复TA
    谢谢回复,请看7楼代码,改为ENVENT模式,DMA就不传输了 
  • 在 DMA 的配置中,选择 EXTI 事件作为触发源。
    ddb_21ic 2025-8-21 16:34 回复TA
    谢谢回复,请看7楼代码,改为ENVENT模式,DMA就不传输了 
  • 配置 EXTI 为事件模式
    ddb_21ic 2025-8-21 16:33 回复TA
    谢谢回复,请看7楼代码,改为ENVENT模式,DMA就不传输了 
  • 事件模式的设计目的就是不触发中断,而是通过硬件直接触发其他外设。

您需要登录后才可以回复 登录 | 注册