|
下图1,2,3是发送函数,发送完成和接收
单独设置DMA串口接收不定长数据,没问题;设置DMA发送和DMA空闲接收就会导致发送正常,但是接收数据为0. 我还修改了一个发送时单独停掉接收DMA,因为发送和接收都停止了 就会导致数据发不出去了。有没有经历过这种情况的大佬们指点一下,谢谢!
HAL_StatusTypeDef HAL_UART_DMA_StopRx(UART_HandleTypeDef *huart)
{
/* The Lock is not implemented on this API to allow the user application
to call the HAL UART API under callbacks HAL_UART_TxCpltCallback() / HAL_UART_RxCpltCallback():
when calling HAL_DMA_Abort() API the DMA TX/RX Transfer complete interrupt is generated
and the correspond call back is executed HAL_UART_TxCpltCallback() / HAL_UART_RxCpltCallback()
*/
#if 0
/* Disable the UART Tx/Rx DMA requests */
huart->Instance->CR3 &= ~USART_CR3_DMAR;
/* Abort the UART DMA rx Stream */
if(huart->hdmarx != NULL)
{
HAL_DMA_Abort(huart->hdmarx);
}
if(huart->gState == HAL_UART_STATE_BUSY_TX_RX)
huart->gState = HAL_UART_STATE_BUSY_TX;
else
huart->gState = HAL_UART_STATE_READY;
return HAL_OK;
#endif
/* Stop UART DMA Rx request if ongoing */
uint32_t dmarequest = 0x00U;
dmarequest = HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR);
if ((huart->RxState == HAL_UART_STATE_BUSY_RX) && dmarequest)
{
ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR);
/* Abort the UART DMA Rx stream */
if (huart->hdmarx != NULL)
{
HAL_DMA_Abort(huart->hdmarx);
}
ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_TXEIE | USART_CR1_TCIE));
/* At end of Tx process, restore huart->gState to Ready */
huart->gState = HAL_UART_STATE_READY;
}
return HAL_OK;
}
|
|