21ic问答首页 - stm32f407VG 串口IDLE与其DMATC中断问题
stm32f407VG 串口IDLE与其DMATC中断问题
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中断有什么关系?为什么不能关闭空闲中断?
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中断有什么关系?为什么不能关闭空闲中断?

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