STM32 DMA + 空闲中断 接收数据遇到的问题

#HAL库 DMA + 空闲中断 接收遇到的问题

我遇到的问题

DMA接收缓存里包含之前已接收到的数据,正常情况下 每次进入空闲中断处理函数后应该获取DMA接收缓存里的数据,这个数据应该是最新的数据,即使包含之前的数据,也是因为第二次接收的数据比之前的数据短造成的。

问题分析

1、这是我的空闲中断接收处理函数:

void My_Usart5Receive_IDLE(void)
{
uint16_t tmplen = 0;
if((__HAL_UART_GET_FLAG(&huart5,UART_FLAG_IDLE) != RESET))
{
__HAL_UART_CLEAR_IDLEFLAG(&huart5);
HAL_UART_DMAStop(&huart5);//
tmplen = huart5.hdmarx->Instance->CNDTR;//
_g_USART5.rx_len = RECEIVE_LEN - tmplen;
_g_USART5.receive_flag = 1;
CycBuffer_AddData(_g_USART5.RX_Buf,_g_USART5.rx_len,&g_cycbuffer5,CYC_BUFFER_LEN);
HAL_UART_Receive_DMA(&huart5, _g_USART5.RX_Buf, RECEIVE_LEN);
}
}

2、停止DMA接收函数:
HAL_StatusTypeDef HAL_UART_DMAStop(UART_HandleTypeDef huart)
{
uint32_t dmarequest = 0x00U;
/
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()
*/

/* Stop UART DMA Tx request if ongoing */
dmarequest = HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT);
if (((huart->gState == HAL_UART_STATE_BUSY_TX)) && dmarequest)
{
CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAT);

/* Abort the UART DMA Tx channel */
if (huart->hdmatx != NULL)
{
  HAL_DMA_Abort(huart->hdmatx);
}
UART_EndTxTransfer(huart);

}

/* Stop UART DMA Rx request if ongoing */
dmarequest = HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR);
if (((huart->RxState == HAL_UART_STATE_BUSY_RX)) && dmarequest)
{
CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR);

/* Abort the UART DMA Rx channel */
if (huart->hdmarx != NULL)
{
  HAL_DMA_Abort(huart->hdmarx);
}
UART_EndRxTransfer(huart);

}

return HAL_OK;
}

要重新启动DMA接收必须先停止,而这个库函数停止的条件是:huart->RxState == HAL_UART_STATE_BUSY_RX;但是在HAL_UART_Transmit这个发送函数在发送结束后会把huart->RxState置成HAL_UART_STATE_READY;故导致DMA不能正常停止,也就不能重新启动DMA。。。。。

我的处理方法就是再加一个条件:||(huart->RxState == HAL_UART_STATE_READY)

如有错误,或更好的方法欢迎指正。

ps:
之前学习或工作上遇到问题都是在百度搜索,解决了好多。一直都是从网上索取,从来没有贡献啥在网络上,感谢那些朋友!以后也养成好习惯,将解决问题的心得分享

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值