问答

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

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

ST 单片机

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
7人浏览 0人回答问题 分享 举报
0 个回答

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