问答

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

21ic问答首页 - stm32f407VG 串口IDLE与其DMATC中断问题

DMA 串口 stm32f407 tc

stm32f407VG 串口IDLE与其DMATC中断问题

limoooo2026-07-05
stm32f407VG 串口IDLE与其DMATC中断问题
  void test_USART1(void)
{
    if(USART1_RX_PRJ_DATA[0] == 0xAA)
    {
        //关闭串口空闲中断
        //LL_USART_DisableIT_IDLE(USART1);
        for(uint32_t i=0;i<16;i++)
        {
            LL_DMA_DisableStream(DMA2,LL_DMA_STREAM_5);
            LL_DMA_ClearFlag_TC5(DMA2);
            LL_DMA_SetDataLength(DMA2,LL_DMA_STREAM_5,1024);
            LL_DMA_EnableStream(DMA2,LL_DMA_STREAM_5);
            printf("请输入程序\r\n");
            while(test_data != 1);            //等待程序读取完成
            test_data = 0;
            printf("已经得到1024字节数据\r\n");
        }
    }
    USART1_receive_ok_flag = 0;
}
其中USART1_receive_ok_flag由IDLE中断置位,test_data 由DMATC中断置位

该程序在上位机发送0xAA后进入空闲中断然后置USART1_receive_ok_flag 进入test_USART1程序,该程序在收到1024字节后触发DMATC中断,置test_data 循环后退出,运行没有任何问题

问题:将LL_USART_DisableIT_IDLE取消注释后程序收到0xAA触发空闲中断,置USART1_receive_ok_flag 进入test_USART1中后程序不会等待输入1024字节,会直接继续执行;循环16都不会等待test_data ,,相当于:

            LL_DMA_DisableStream(DMA2,LL_DMA_STREAM_5);
            LL_DMA_ClearFlag_TC5(DMA2);
            LL_DMA_SetDataLength(DMA2,LL_DMA_STREAM_5,1024);
            LL_DMA_EnableStream(DMA2,LL_DMA_STREAM_5);
执行完成后test_data 直接就是1了,为什么?查看好像是LL_DMA_DisableStream执行完成后就置1了,,期间只有空闲中断与DMATC中断生效没有其他任何中断打断
空闲中断与DMATC中断有什么关系?为什么不能关闭空闲中断?

回答 +关注 0
879人浏览 8人回答问题 分享 举报
8 个回答
  • 先检查DMA中断优先级,确保DMA中断不会覆盖USART1 IDLE中断,然后确保USART1接收缓冲区清空后再禁用IDLE中断。
  • 先检查DMA中断优先级是否高于USART1 IDLE中断,可能DMA中断先触发导致USART1处理中断逻辑未执行。同时,确保USART1接收缓冲区清空后再禁用IDLE中断。
  • 先检查DMA2 Stream 5的优先级配置,确保DMA中断优先级高于USART1的IDLE中断。可能DMA中断先触发,导致USART1处理中断的逻辑没被执行。
  • 清除USART接收缓冲区,再尝试禁用IDLE中断,确保DMA流配置无误,特别是DMA中断优先级设置。
  • 清除USART1接收缓冲区,确保DMA配置无误,检查DMA中断优先级设置。
  • LL_USART_DisableIT_IDLE取消注释后,确实会导致空闲中断被禁用。你可以尝试先清除USART1的接收缓冲区,确保数据接收正常。同时,检查DMA配置,特别是DMA流配置,确保数据传输路径无误。
  • 你这里的问题可能是因为取消注释后,空闲中断被禁用了,导致程序没有进入等待输入1024字节的循环。你可以尝试在关闭空闲中断之前,先清除USART1的接收缓冲区,确保数据接收正常。另外,检查DMA的流配置是否正确,有时候DMA配置问题也会导致数据接收异常。
  • 看看你的USART1_RX_PRJ_DATA[0]初始化有没有问题,之前遇到过类似情况,是初始化导致的。

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