码迷,mamicode.com
首页 > 其他好文 > 详细

STM32L1XX使用HAL_UART_Transmit_DMA发送串口数据

时间:2015-07-30 13:35:07      阅读:542      评论:0      收藏:0      [点我收藏+]

标签:

使用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非循环模式时,用来检测最后一个字节发送完毕)

技术分享


默认 USART1的全局中断未Checked。


或者:

在发送结束的回调函数中,恢复uart的Ready状态。

void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart)
{
//回调函数
huart->State=HAL_UART_STATE_READY; 


}

下面附的是mbed-os的代码,它的UART_DMATransmitCplt函数直接复位Uart的状态了。


/**
  * @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
    {
      <span style="color:#cc0000;">huart->State = HAL_UART_STATE_READY;</span>
    }
    HAL_UART_TxCpltCallback(huart);
  }
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

STM32L1XX使用HAL_UART_Transmit_DMA发送串口数据

标签:

原文地址:http://blog.csdn.net/fengyu09/article/details/47147615

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!