发新帖我要提问
12
返回列表
打印

GD32F305的DMA能不能通过外部EXTI触发?

[复制链接]
楼主: tovax
手机看帖
扫描二维码
随时随地手机跟帖
21
jimmhu| | 2024-3-12 15:38 | 只看该作者 回帖奖励 |倒序浏览
在GD32F305中,DMA和EXTI是两个独立的模块,它们有不同的用途和触发机制。DMA传输通常不直接使用EXTI作为触发源。

使用特权

评论回复
22
菜鸟的第一步| | 2024-3-28 13:27 | 只看该作者
可以外部中断触发,在中断函数中启动DMA

使用特权

评论回复
23
黑心单片机| | 2024-3-28 13:29 | 只看该作者
可以啊,外部中断触发后,在中断函数中启动DMA就行

使用特权

评论回复
24
原来是wjc| | 2024-5-31 23:44 | 只看该作者
本帖最后由 原来是wjc 于 2024-6-1 03:00 编辑

如何在外部中断处理函数中启动DMA接收串口数据:

#include "gd32f3x0.h"

#define BUFFER_SIZE 64
uint8_t receive_buffer[BUFFER_SIZE];

void usart0_dma_config(void)
{
    // DMA配置代码
}

void exti0_config(void)
{
    /* enable the EXTI GPIO clock */
    rcu_periph_clock_enable(RCU_GPIOB);

    /* configure button pin as input */
    gpio_mode_set(GPIOB, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO_PIN_0);

    /* enable and set EXTI line source */
    gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOB, GPIO_PIN_SOURCE_0);

    /* configure EXTI line */
    exti_init(EXTI_0, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
    exti_interrupt_flag_clear(EXTI_0);
    exti_interrupt_enable(EXTI_0, ENABLE);

    /* enable and set EXTI0_IRQn Interrupt */
    nvic_irq_enable(EXTI0_IRQn, 2U, 0U);
}

void exti0_IRQHandler(void)
{
    /* clear EXTI line interrupt flag */
    exti_interrupt_flag_clear(EXTI_0);

    /* 启动DMA传输 */
    dma_channel_enable(DMA0, DMA_CH2);
}

int main(void)
{
    /* 初始化USART、DMA、外部中断等 */
    usart0_dma_config();
    exti0_config();

    while (1) {
        /* 在这里处理其他任务 */
    }

    return 0;
}

使用特权

评论回复
25
原来是wjc| | 2024-5-31 23:44 | 只看该作者
本帖最后由 原来是wjc 于 2024-6-1 03:01 编辑

可以在外部中断的处理函数中启动DMA来接收串口数据。这种方法常用于在外部事件(比如按键按下、传感器触发等)发生时开始数据传输。

使用特权

评论回复
26
原来是wjc| | 2024-5-31 23:44 | 只看该作者
本帖最后由 原来是wjc 于 2024-6-1 03:02 编辑
jkl21 发表于 2024-3-11 20:37
在配置DMA传输时,可以设置相应的EXTI线(例如,EXTI线0-15)来触发DMA传输。在EXTI线产生上升沿或下降沿事 ...

D32 系列微控制器中,DMA 控制器的触发可以与外部中断线(EXTI)相结合,以实现在外部事件触发(例如上升沿或下降沿)时启动 DMA 传输

使用特权

评论回复
27
原来是wjc| | 2024-5-31 23:44 | 只看该作者
本帖最后由 原来是wjc 于 2024-6-1 03:01 编辑
mikewalpole 发表于 2024-3-11 14:33
配置EXTI线路以触发中断。在EXTI中断服务函数中,您可以设置DMA请求标志。

外部中断触发时,会执行 exti0_IRQHandler 函数,在这个函数中,我们通过 dma_flag_set 函数设置了 DMA 请求标志,从而启动了 DMA 传输。

使用特权

评论回复
28
原来是wjc| | 2024-5-31 23:44 | 只看该作者
本帖最后由 原来是wjc 于 2024-6-1 03:03 编辑
yorkbarney 发表于 2024-3-11 16:33
支持通过外部中断/事件控制器(EXTI)来触发DMA传输。#include "gd32f3x0.h"

#define BUFFER_SIZE 64
uint8_t receive_buffer[BUFFER_SIZE];

void usart0_dma_config(void)
{
    // DMA配置代码
}

void exti0_config(void)
{
    /* enable the EXTI GPIO clock */
    rcu_periph_clock_enable(RCU_GPIOB);

    /* configure button pin as input */
    gpio_mode_set(GPIOB, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO_PIN_0);

    /* enable and set EXTI line source */
    gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOB, GPIO_PIN_SOURCE_0);

    /* configure EXTI line */
    exti_init(EXTI_0, EXTI_INTERRUPT, EXTI_TRIG_BOTH);
    exti_interrupt_flag_clear(EXTI_0);
    exti_interrupt_enable(EXTI_0, ENABLE);

    /* enable and set EXTI0_IRQn Interrupt */
    nvic_irq_enable(EXTI0_IRQn, 2U, 0U);
}

void exti0_IRQHandler(void)
{
    /* clear EXTI line interrupt flag */
    exti_interrupt_flag_clear(EXTI_0);

    /* 设置DMA请求标志,启动DMA传输 */
    dma_flag_set(DMA0, DMA_CH2, DMA_INT_FLAG_G);
}

int main(void)
{
    /* 初始化USART、DMA、外部中断等 */
    usart0_dma_config();
    exti0_config();

    while (1) {
        /* 在这里处理其他任务 */
    }

    return 0;
}

使用特权

评论回复
29
FranklinUNK| | 2024-6-20 20:51 | 只看该作者
可以直接触发的

使用特权

评论回复
30
digit0| | 2024-6-21 20:26 | 只看该作者
Gd32f305的 dma (直接内存访问)功能本身不支持通过外部扩展(外部中断)直接触发。

使用特权

评论回复
31
鹿鼎计| | 2024-6-26 11:11 | 只看该作者
配置 dma 通道使其与 exti 触发的 dma 请求相关联,并设置与数据传输相关联的参数

使用特权

评论回复
32
wangtaohui| | 2024-7-31 22:12 | 只看该作者
可以在 ISR 中调用 DMA_Channel_Enable() 来启动 DMA 传输,或设置 DMA 的触发条件。

使用特权

评论回复
33
亚瑟| | 2024-7-31 22:28 | 只看该作者
应该是可以这样触发的

使用特权

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

本版积分规则