本文使用stm32f411ret的串口1的DMA方式发送数据,刚开始调试的时候发现串口只能发送一次数据,之后就把系统hang住了。通过网上搜资料和不断尝试,发现问题是中断回调函数没有写的原因。
使用HAL库的DMA,需要同时实现DMA中断回调函数和串口中断回调函数。
void DMA2_Stream7_IRQHandler(void)
{
HAL_DMA_IRQHandler(Uart1Handle.hdmatx);
}
void USART1_IRQHandler(void)
{
HAL_NVIC_ClearPendingIRQ(USART1_IRQn);
HAL_UART_IRQHandler(&Uart1Handle);
}
下面附上我的dma配置和串口配置函数
dma配置
void HAL_UART1_dma_Init(void)
{
static DMA_HandleTypeDef hdma_tx;
__HAL_RCC_DMA2_CLK_ENABLE(); //打开DMA2时钟
/*##-3- Configure the DMA streams ##########################################*/
/* Configure the DMA handler for Transmission process */
hdma_tx.Instance = DMA2_Stream7;
hdma_tx.Init.Channel = DMA_CHANNEL_4;