问题描述:
使用HAL_UART_Transmit_DMA()发送数据时,只有第一次被正常发送,之后的数据由于串口状态huart->gState = HAL_UART_STATE_BUSY_TX而不能被发送。
原因分析:
阅读HAL_UART_Transmit_DMA()代码,发现会调用HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)函数,在该函数中打开了DMA的(DMA_IT_TC | DMA_IT_TE | DMA_IT_DME | DMA_IT_HT)中断,但是我没有对中断做相应的处理。
解决方案:
使能DMA中断及串口中断
HAL_NVIC_EnableIRQ(DMA2_Stream7_IRQn); /* 使能DMA2_Stream7中断通道 */
HAL_NVIC_SetPriority(DMA2_Stream7_IRQn, 9, 0); /* 抢占优先级9,子优先级0 */
HAL_NVIC_EnableIRQ(USART_UX_IRQn); /* 使能USART1中断通道 */
HAL_NVIC_SetPriority(USART_UX_IRQn, 3, 3); /* 抢占优先级3,子优先级3 */
并在中断服务函数中调用HAL库处理函数
void DMA2_Stream7_IRQHandler(void)
{
HAL_DMA_IRQHandler(&gDma_Handle);
}
void USART_UX_IRQHandler(void)
{
HAL_UART_IRQHandler(&g_uart1_handle); /* 调用HAL库中断处理公用函数 */
}
这两个服务函数判断触发中断的条件并将串口标志位和DMA标志位恢复为huart->gState == HAL_UART_STATE_READY和 hdma->State = HAL_DMA_STATE_READY