GD32H7 EXTI同步DMA,必须开中断才能运行?

[复制链接]
ddb_21ic 发表于 2025-8-20 09:45 | 显示全部楼层 |阅读模式
本帖最后由 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?
豌豆爹 发表于 2025-8-21 12:41 | 显示全部楼层
事件模式的设计目的就是不触发中断,而是通过硬件直接触发其他外设。
duo点 发表于 2025-8-21 12:41 | 显示全部楼层
配置 EXTI 为事件模式

评论

谢谢回复,请看7楼代码,改为ENVENT模式,DMA就不传输了  发表于 2025-8-21 16:33
onlycook 发表于 2025-8-21 12:42 | 显示全部楼层
在 DMA 的配置中,选择 EXTI 事件作为触发源。

评论

谢谢回复,请看7楼代码,改为ENVENT模式,DMA就不传输了  发表于 2025-8-21 16:34
七毛钱 发表于 2025-8-21 12:42 | 显示全部楼层
检查 DMA 的传输方向。源地址和目标地址配置是否正确。

评论

谢谢回复,请看7楼代码,改为ENVENT模式,DMA就不传输了  发表于 2025-8-21 16:34
内政奇才 发表于 2025-8-21 12:43 | 显示全部楼层
禁用不必要的中断

评论

谢谢回复,请看7楼代码,改为ENVENT模式,DMA就不传输了  发表于 2025-8-21 16:34
 楼主| ddb_21ic 发表于 2025-8-21 16:27 | 显示全部楼层
本帖最后由 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:33 | 显示全部楼层
豌豆爹 发表于 2025-8-21 12:41
事件模式的设计目的就是不触发中断,而是通过硬件直接触发其他外设。

谢谢回复,请看7楼代码,改为ENVENT模式,DMA就不传输了
 楼主| ddb_21ic 发表于 2025-8-21 16:35 | 显示全部楼层

就是想禁用中断,不然MCU时间就白白消耗在每秒几十K的中断上了
 楼主| ddb_21ic 发表于 2025-8-22 09:12 | 显示全部楼层
本帖最后由 ddb_21ic 于 2025-8-22 10:30 编辑

2668568a7c30440cd4.png
同步输入映射表里的EXTI_x究竟是中断信号还是事件信号?我怎么觉得事件信号仅仅用去唤醒MCU了呢?
6460468a7d49541707.png
GD32H737/757/759 用户手册写的是:
EXTI(中断/事件控制器)包括38个相互独立的边沿检测电路并且能够向处理器内核产生中断请求或唤醒事件。  

作为参照STM32F743文档写的是:
所有事件输入均可让 CPU 唤醒以及生成 CPU 中断和/或 CPU 事件


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

本版积分规则

个人签名:夏商周秦汉,唐宋元明清 历史上的王朝更替,不断的在示波器上重现,缺的就是个Trigger Signal

107

主题

1121

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部