×
单片机 > 单片机程序设计 > 详情

STM32L1XX使用HAL_UART_Transmit_DMA发送串口数据

发布时间:2020-08-27 发布时间:
|

使用STM32CubeMX生成初始化代码。

问题:

HAL_UART_Transmit_DMA函数只能调用一次,第二次就返回状态HAL_UART_STATE_BUSY 0x02。


原因:

stm32l1xx_hal_uart.c开头有描述

        (##) DMA Configuration if you need to use DMA process (HAL_UART_Transmit_DMA()
             and HAL_UART_Receive_DMA() APIs):
            (+++) Declare a DMA handle structure for the Tx/Rx channel.
            (+++) Enable the DMAx interface clock.
            (+++) Configure the declared DMA handle structure with the required 
                  Tx/Rx parameters.                
            (+++) Configure the DMA Tx/Rx channel.
            (+++) Associate the initialized DMA handle to the UART DMA Tx/Rx handle.
            (+++) Configure the priority and enable the NVIC for the transfer complete 
                  interrupt on the DMA Tx/Rx channel.
            (+++) Configure the USARTx interrupt priority and enable the NVIC USART IRQ handle
                  (used for last byte sending completion detection in DMA non circular mode)


配置USARTx中断优先级,启用NVIC USART中断句柄(使用DMA非循环模式时,用来检测最后一个字节发送完毕)

  • /** 

  •   * @brief DMA UART transmit process complete callback  

  •   * @param hdma: DMA handle 

  •   * @retval None 

  •   */  

  • 01523 static void UART_DMATransmitCplt(DMA_HandleTypeDef *hdma)       

  • {  

  •   UART_HandleTypeDef* huart = ( UART_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;  

  •   huart->TxXferCount = 0;  

  •     

  •   /* Disable the DMA transfer for transmit request by setting the DMAT bit 

  •   in the UART CR3 register */  

  •   huart->Instance->CR3 &= (uint32_t)~((uint32_t)USART_CR3_DMAT);  

  •     

  •   /* Wait for UART TC Flag */  

  •   if(UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TC, RESET, HAL_UART_TXDMA_TIMEOUTVALUE) != HAL_OK)  

  •   {  

  •     /* Timeout Occured */   

  •     huart->State = HAL_UART_STATE_TIMEOUT;  

  •     HAL_UART_ErrorCallback(huart);  

  •   }  

  •   else  

  •   {  

  •     /* No Timeout */  

  •     /* Check if a receive process is ongoing or not */  

  •     if(huart->State == HAL_UART_STATE_BUSY_TX_RX)   

  •     {  

  •       huart->State = HAL_UART_STATE_BUSY_RX;  

  •     }  

  •     else  

  •     {  

  •       huart->State = HAL_UART_STATE_READY;  

  •     }  

  •     HAL_UART_TxCpltCallback(huart);  

  •   }  

  • }  



  • 『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

    热门文章 更多
    51单片机中断源的扩展方法