您的位置:首页 > 其它

STM32L1XX使用HAL_UART_Transmit_DMA发送串口数据

2015-07-30 11:50 573 查看
使用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
{
huart->State = HAL_UART_STATE_READY;
}
HAL_UART_TxCpltCallback(huart);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: