目的:
使用UART空闲中断接收不定长消息
前提:
stm32CubeMX工具配置uart,DMA,中断使能
相关代码:
在生成代码的基础上
使能UART_IT_IDLE中断
1.使能空闲中断
__HAL_UART_ENABLE_IT(&UART_HANDLE, UART_IT_IDLE);
2.打开DMA中断接收消息
UART_Receive_DMA(g_Buf, BUF_LEN);
中断处理函数中添加回调
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
IdleCallBack(&huart1); // 添加空闲中断处理函数
/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART1_IRQn 1 */
/* USER CODE END USART1_IRQn 1 */
}
回调处理函数
void IdleCallBack(UART_HandleTypeDef *huart)
{
if (huart != &UART_HANDLE) {
return;
}
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE)) { // 判断是否是空闲中断
__HAL_UART_CLEAR_IDLEFLAG(huart); //清空闲中断
int rxSize = BUF_LEN - hdma_usart1_rx.Instance->CNDTR; // 判断接收到的数据长度 CNDTR是dma中的剩余字节的个数
// do something
HAL_UART_DMAStop(huart);
UART_Receive_DMA(g_bleRecBuf, BLE_BUF_LEN); // 重启DMA数据接收
}
}
#endif