参考了各路大神的资料,蒙蔽了半天,终于学会了,记录一下,以后忘了可以回来复习参考。
一、首先在stm32cube中配置打开对应uart串口的中断
二、工程main函数调用
__HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);//hal库宏定义,使能串口空闲中断
HAL_UART_Receive_DMA(&huart1,data,sizeof(data));//使用dma绑定uart串口将接收的数据直接存到data缓冲区
三、在stm32cube生成的中断服务函数USART1_IRQHandler中。清除中断标志位后调用自己写的回调函数。
extern void HAL_UART_IdleCallback(UART_HandleTypeDef *huart)。//函数名字可以自定义
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE)!=0X00U){//判断IDLE标志位是否被置起
__HAL_UART_CLEAR_IDLEFLAG(&huart1);
HAL_UART_IdleCallback(&huart1);
}
/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART1_IRQn 1 */
/* USER CODE END USART1_IRQn 1 */
}
四、用户自定义中断回调函数文章来源:https://www.toymoban.com/news/detail-522097.html
这里面是我自定义的功能,当时是为了跟wifi模块通信,发送AT指令,使用HAL_UART_Receive_IT(),缺乏灵活性,实际用起来很难操作,故而改用了IDLE来触发,终于实现。文章来源地址https://www.toymoban.com/news/detail-522097.html
void HAL_UART_IdleCallback(UART_HandleTypeDef *huart){
if(huart==&huart1){
HAL_UART_DMAStop(huart);
HAL_UART_Transmit(&huart3,data,strlen((char *)data),10);
memset(data,0,sizeof(data));
HAL_UART_Receive_DMA(huart,data,32);
}else if(huart==&huart3){
HAL_UART_DMAStop(huart);
HAL_UART_Transmit(&huart1,esp,strlen((char *)esp),10);
memset(esp,0,sizeof(esp));
HAL_UART_Receive_DMA(huart,esp,32);
}
}
到了这里,关于STM32 UART串口通信IDLE空闲中断的使用步骤的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!