解决STM32 HAL_UART_Transmit_DMA只发送第一次的问题

文章讨论了在使用STM32的HAL_UART_Transmit_DMA发送数据时遇到的问题,主要原因是未正确配置中断处理。解决方案包括启用DMA和串口中断,并在中断服务函数中调用HAL库函数来管理和恢复状态。测试工程可在CSDN下载链接中获取。
摘要由CSDN通过智能技术生成

问题描述:

使用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

测试工程:

测试工程下载链接https://download.csdn.net/download/bggff/88792280

  • 9
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值