之前就遇到过一次,但是长时间没用过dma,又给忘记了。
问题描述:
使用stm32cubemx配置各种usart,并且优先级使用的是默认的配置。
因为在使用相关的模块驱动,直接移植以前写的程序,结果移植的是古老的,没有修改过的程序。其中就是在usart2的中断里面使用的usart3的DMA。在模块运行的时候,一直发现输出数据的时候,数据少了半截,并且卡死。
原因:
在USART2_IRQHandler()函数中,使用了HAL_UART_Transmit_DMA()函数。这样产生了一个问题,DMA是需要中断才能使用的,这就相当于,在一个中断优先级为5的一个中断中,又开了一个中断优先级为5的DMA,这样中断中,是会冲突的,很容易卡死。
解决方法:
1、在usart2的中断中不使用DMA。
2、将DMA的优先级>usart2的中断优先级。