调试回调函数的时候,我在cube中删除了默认的DMA通道,又新增了另外一个通道,导致NVIC中,该通道的优先级为0,后来改成了5就正常了。
另外在调试过程中,发现9字节的缓冲区每次只能接收到4个或5个字节,搞了一天时间,发现回调函数里的标志位写错了,我用的是normal模式。
我是像下面这样写的:
HAL_UARTEx_ReceiveToIdle_DMA(&huart1, (uint8_t*) msg_in.Buf, 9);
__HAL_DMA_DISABLE_IT(&hdma_usart1_rx, DMA_IT_TC);
网上抄来的代码,DMA_IT_TC是接收完成中断,一直理解为上面一行代码清除中断标志位,现在发现这是禁止传输完成中断位,又获悉到HAL_UARTEx_RxEventCallback();回调函数不仅在传输完成时调用,缓冲区半满的时候也会调用(踩坑),所以才出现了只接收一半数据的情况。
改为
HAL_UARTEx_ReceiveToIdle_DMA(&huart1, (uint8_t*) msg_in.Buf, 9);
__HAL_DMA_DISABLE_IT(&hdma_usart1_rx, DMA_IT_HT);
也就是禁用半传输中断,问题解决。