STM32
直播中

打马过草原

9年用户 893经验值
擅长:可编程逻辑 电源/新能源
私信 关注

想通过外部EXTI的上升沿和下降沿分别触发两组DMA数据传输,请问GD32F305支持这种用法吗?

想通过外部EXti的上升沿和下降沿分别触发两组DMA数据传输,请问GD32F305支持这种用法吗?

回帖(1)

杨平

2024-9-29 16:32:00
GD32F305是一款高性能的32位微控制器,具有丰富的外设和功能。关于您的问题,GD32F305确实支持通过外部EXTI(外部中断)的上升沿和下降沿分别触发两组DMA数据传输。

以下是实现此功能的步骤:

1. **配置外部中断(EXTI)**:
   - 首先,您需要配置外部中断线(例如,EXTI0)以检测上升沿和下降沿。
   - 在EXTI配置中,您需要启用上升沿和下降沿触发。

2. **配置DMA**:
   - 为两组数据传输配置两个DMA通道。
   - 设置DMA的源地址、目标地址、传输大小等参数。

3. **关联EXTI与DMA**:
   - 将配置好的DMA通道与相应的EXTI线关联起来。
   - 这通常涉及到设置DMA的触发源为EXTI。

4. **编写中断服务例程(ISR)**:
   - 编写一个中断服务例程来处理EXTI中断。
   - 在ISR中,您可以根据上升沿或下降沿触发相应的DMA传输。

5. **启动DMA传输**:
   - 在ISR中,启动DMA传输。

6. **测试**:
   - 通过模拟外部信号或实际应用来测试您的设置。

以下是一些可能的代码片段示例(注意,这只是一个概念性的示例,实际代码需要根据您的具体需求和硬件配置进行调整):

```c
// 假设使用EXTI0和DMA通道0

void EXTI0_IRQHandler(void) {
    if (EXTI_GetITStatus(EXTI_Line0) != RESET) {
        // 清除EXTI线挂起位
        EXTI_ClearITPendingBit(EXTI_Line0);

        // 检查是上升沿还是下降沿
        if (EXTI_GetEXTILineStatus(EXTI_Line0) == SET) {
            // 启动DMA传输
            DMA_Cmd(DMA_Channel0, ENABLE);
        } else {
            // 启动另一组DMA传输
            DMA_Cmd(DMA_Channel1, ENABLE);
        }
    }
}

void DMA_Config(void) {
    // 配置DMA通道0
    DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&PERIPH_BASE;
    DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)memory_address;
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
    DMA_InitStructure.DMA_BufferSize = BUFFER_SIZE;
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable;
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
    DMA_InitStructure.DMA_Priority = DMA_Priority_High;
    DMA_InitStructure.DMA_M2M = DMA_M2M_Enable;
    DMA_Init(DMA_Channel0, &DMA_InitStructure);

    // 配置DMA通道1
    DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)another_memory_address;
    DMA_Init(DMA_Channel1, &DMA_InitStructure);
}

void EXTI_Config(void) {
    // 配置EXTI0,上升沿和下降沿触发
    EXTI_InitStructure.EXTI_Line = EXTI_Line0;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);

    // 配置NVIC
    NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}
```

请确保您已经正确配置了所有的外设时钟和GPIO,并且您的硬件连接是正确的。此外,您可能还需要根据您的具体应用调整DMA和EXTI的配置参数。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分