打印

dma_interrupt_flag_clear(Uart0_Info.DMA_CH_TX, DMA_INT_FLAG_FTF);安排在哪里?

[复制链接]
367|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
丙丁先生|  楼主 | 2025-6-12 13:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
DMA, TX, TF, UART0, AG, FT
dma_interrupt_flag_clear(Uart0_Info.DMA_CH_TX, DMA_INT_FLAG_FTF);安排在哪里?

在你的代码中,`dma_interrupt_flag_clear(Uart0_Info.DMA_CH_TX, DMA_INT_FLAG_FTF);` 用于清除DMA发送完成中断标志位,应该放在DMA发送完成中断服务函数(`DMA_Channel1_2_IRQHandler`)中。这样可以确保在处理完中断后,清除中断标志位,防止中断被重复触发。

具体位置
在你的代码中,`DMA_Channel1_2_IRQHandler` 函数如下:

```c
void DMA_Channel1_2_IRQHandler(void)
{
    if (dma_interrupt_flag_get(Uart0_Info.DMA_CH_TX, DMA_INT_FLAG_FTF))          /*如果DMA发送完成标志置位*/
    {
        while (!usart_flag_get(Uart0_Info.UartNumber, USART_FLAG_TC) );                // 等待USART发送移位寄存器空(确保最后一字节已发出)
        DIR_RX0();                                                                                                       /* 发送完成后,切换RS485为接收模式*/
        dma_interrupt_flag_clear(Uart0_Info.DMA_CH_TX, DMA_INT_FLAG_FTF);       // 清除DMA中断标志
    }
}
```

详细说明
1. 中断标志位检查:
   ```c
   if (dma_interrupt_flag_get(Uart0_Info.DMA_CH_TX, DMA_INT_FLAG_FTF))
   ```
   这一行用于检查DMA发送完成中断标志位是否被置位。如果置位,说明DMA发送操作已经完成。

2. 等待USART发送完成:
   ```c
   while (!usart_flag_get(Uart0_Info.UartNumber, USART_FLAG_TC));
   ```
   这一行用于等待USART发送移位寄存器为空,确保最后一字节已经发送完成。

3. 切换RS485方向:
   ```c
   DIR_RX0();
   ```
   这一行用于切换RS485的方向为接收模式。

4. 清除中断标志位:
   ```c
   dma_interrupt_flag_clear(Uart0_Info.DMA_CH_TX, DMA_INT_FLAG_FTF);
   ```
   这一行用于清除DMA发送完成中断标志位。这一步非常重要,因为如果不清除中断标志位,中断可能会被重复触发,导致程序行为异常。

注意事项
位置:`dma_interrupt_flag_clear` 必须放在中断服务函数中,且在确认中断标志位被正确处理后调用。
顺序:先处理中断相关的逻辑(如切换RS485方向),再清除中断标志位。
调试:如果中断仍然被误触发,可以尝试在清除中断标志位后,检查其他可能的中断源是否被意外触发。

通过以上安排,可以确保DMA中断被正确处理,避免因中断标志位未清除而导致的问题。

使用特权

评论回复
沙发
丙丁先生|  楼主 | 2025-6-12 13:41 | 只看该作者
dma_interrupt_flag_clear(Uart0_Info.DMA_CH_TX, DMA_INT_FLAG_FTF);安排在哪里?  https://bbs.21ic.com/icview-3461132-1-1.html

使用特权

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

本版积分规则

1088

主题

4085

帖子

7

粉丝