如何使用HAL库,实现不定长UART数据包的DMA接收
本帖最后由 songshiqun2010 于 2019-6-13 13:28 编辑uint8_t txbuf="helloworld\r\n";
uint8_t rxbuf="";
ART_HandleTypeDef huart1;
HAL_UART_Receive_DMA(&huart1,rxbuf,sizeof(rxbuf));
函数原型如下:
/**
* @briefReceives an amount of data in non blocking mode.
* @paramhuart: pointer to a UART_HandleTypeDef structure that contains
* the configuration information for the specified UART module.
* @parampData: Pointer to data buffer
* @paramSize: Amount of data to be received
* @note When the UART parity is enabled (PCE = 1) the data received contain the parity bit.
* @retval HAL status
*/
HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
{
uint32_t *tmp;
uint32_t tmp1 = 0;
tmp1 = huart->State;
if((tmp1 == HAL_UART_STATE_READY) || (tmp1 == HAL_UART_STATE_BUSY_TX))
{
if((pData == NULL ) || (Size == 0))
{
return HAL_ERROR;
}
/* Process Locked */
__HAL_LOCK(huart);
huart->pRxBuffPtr = pData;
huart->RxXferSize = Size;
huart->ErrorCode = HAL_UART_ERROR_NONE;
/* Check if a transmit process is ongoing or not */
if(huart->State == HAL_UART_STATE_BUSY_TX)
{
huart->State = HAL_UART_STATE_BUSY_TX_RX;
}
else
{
huart->State = HAL_UART_STATE_BUSY_RX;
}
/* Set the UART DMA transfer complete callback */
huart->hdmarx->XferCpltCallback = UART_DMAReceiveCplt;
/* Set the UART DMA Half transfer complete callback */
huart->hdmarx->XferHalfCpltCallback = UART_DMARxHalfCplt;
/* Set the DMA error callback */
huart->hdmarx->XferErrorCallback = UART_DMAError;
/* Enable the DMA Stream */
tmp = (uint32_t*)&pData;
HAL_DMA_Start_IT(huart->hdmarx, (uint32_t)&huart->Instance->DR, *(uint32_t*)tmp, Size);
/* Enable the DMA transfer for the receiver request by setting the DMAR bit
in the UART CR3 register */
huart->Instance->CR3 |= USART_CR3_DMAR;
/* Process Unlocked */
__HAL_UNLOCK(huart);
return HAL_OK;
}
else
{
return HAL_BUSY;
}
}
传送门 HAL UART DMA 环形缓冲接收不定长数据包
如果串口接收频率不高,不是可以使用串口自带的空中断,如果连续接收的,那就DMA收定长的数据,然后做好协议,拼接。
楼下有高见吗 楼上说的对。如果不是ADC之类的自动转换后的连续收发,没必要用DMA中断的UART,用自带的中断就足够了。
用缓存存储数据,整合后发送或者处理。 谢谢分享
页:
[1]