参考了各路大神的资料,蒙蔽了半天,终于学会了,记录一下,以后忘了可以回来复习参考。
一、首先在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 */
}
四、用户自定义中断回调函数
这里面是我自定义的功能,当时是为了跟wifi模块通信,发送AT指令,使用HAL_UART_Receive_IT(),缺乏灵活性,实际用起来很难操作,故而改用了IDLE来触发,终于实现。
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);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)