stm32f407VG 串口IDLE与其DMATC中断问题

[复制链接]
901|8
limoooo 发表于 2026-7-5 17:36 | 显示全部楼层 |阅读模式
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中断有什么关系?为什么不能关闭空闲中断?

SophiaOP 发表于 2026-7-12 13:09 | 显示全部楼层
看看你的USART1_RX_PRJ_DATA[0]初始化有没有问题,之前遇到过类似情况,是初始化导致的。
AloneKaven 发表于 2026-7-13 12:18 | 显示全部楼层
你这里的问题可能是因为取消注释后,空闲中断被禁用了,导致程序没有进入等待输入1024字节的循环。你可以尝试在关闭空闲中断之前,先清除USART1的接收缓冲区,确保数据接收正常。另外,检查DMA的流配置是否正确,有时候DMA配置问题也会导致数据接收异常。
Henryko 发表于 2026-7-14 14:21 | 显示全部楼层
LL_USART_DisableIT_IDLE取消注释后,确实会导致空闲中断被禁用。你可以尝试先清除USART1的接收缓冲区,确保数据接收正常。同时,检查DMA配置,特别是DMA流配置,确保数据传输路径无误。
Stahan 发表于 2026-7-15 12:14 | 显示全部楼层
清除USART1接收缓冲区,确保DMA配置无误,检查DMA中断优先级设置。
OliviaSH 发表于 2026-7-16 14:32 | 显示全部楼层
清除USART接收缓冲区,再尝试禁用IDLE中断,确保DMA流配置无误,特别是DMA中断优先级设置。
Undshing 发表于 2026-7-17 22:56 | 显示全部楼层
先检查DMA2 Stream 5的优先级配置,确保DMA中断优先级高于USART1的IDLE中断。可能DMA中断先触发,导致USART1处理中断的逻辑没被执行。
CarterERO 发表于 2026-7-19 15:00 | 显示全部楼层
先检查DMA中断优先级是否高于USART1 IDLE中断,可能DMA中断先触发导致USART1处理中断逻辑未执行。同时,确保USART1接收缓冲区清空后再禁用IDLE中断。
班杰明 发表于 2026-7-20 12:39 | 显示全部楼层
先检查DMA中断优先级,确保DMA中断不会覆盖USART1 IDLE中断,然后确保USART1接收缓冲区清空后再禁用IDLE中断。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

12

帖子

0

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