你这代码混装的啊,我都是只重写callback其他不动,你这破坏的HAL库结构,已经面目全非
https://www.armbbs.cn/forum.php?mod=viewthread&tid=108553&extra=
最新的HAL库已经给你写好了串口空闲中断的开启和接收的callback了:HAL_UARTEx_RxEventCallback
为了HAL_LOCK的影响,可以把DMA开启接收放while(1)里面处理,如果串口数据量多,要在串口里面开启
那么发送函数里面应该加上DMA是否发送完成,以及关闭相应的串口中断
[C] 纯文本查看 复制代码 /**
* @brief 串口DMA模式发送函数 pData会copy到pTxBuf
*
* @param phuartx 串口句柄
* @param pData 发送数据的缓存地址
* @param Size 发送数据的大小
*/
void BSP_UART_Transmit_DMA(BspUart_t *phuartx, uint8_t *pData, uint16_t Size)
{
while(phuartx->txStat == UART_TX_STATE_BUSY)
{
}
phuartx->txStat = UART_TX_STATE_BUSY;
memcpy(phuartx->pTxBuf, pData, Size);
IRQn_Type eIRQn = (IRQn_Type)__UART_IRQ(phuartx->huart);
HAL_NVIC_DisableIRQ(eIRQn);
HAL_UART_Transmit_DMA(phuartx->huart, phuartx->pTxBuf, Size);
HAL_NVIC_EnableIRQ(eIRQn);
}
[C] 纯文本查看 复制代码 /**
* @brief 串口发送完成中断回调函数
*
* @param huart
*/
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
BspUart_t *phuartx = UART_GetHandlePtr(huart);
phuartx->txStat = UART_TX_STATE_IDLE;
}
[C] 纯文本查看 复制代码 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
BspUart_t *phuartx = UART_GetHandlePtr(huart);
if((phuartx->rxCache == UART_CACHE_FIFO) && (phuartx->rxMqSize == 1))
{
osMessageQueuePut(phuartx->rxMqId, &phuartx->pRxBuf[1], 0U, 0U);
}
BSP_UART_ReceiveMode(phuartx, phuartx->rxMode);
phuartx->rxFlag = 2;
}
|