CUBEMX配置RXNE+IDLE中断收发数据
1、使能串口异步通信并配置波特率、数据位、停止位、校验位、串口发送和接收等参数
2、打开串口中断
3、更改优先级分组和串口抢占优先级、响应优先级(如果觉得不需要也可以不修改)
4、生成工程后定义相关变量
volatile uint8_t rx_len=0;
uint8_t rx_flish=0;
uint8_t rx_temp[1];
uint8_t rx_buff[100];
5、在主函数中添加开启串口中断的函数
__HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);
HAL_UART_Receive_IT(&huart1,rx_temp,sizeof(rx_temp));
6、编写中断回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1)
{
rx_buff[rx_len++]=rx_temp[0];
HAL_UART_Receive_IT(&huart1,rx_temp,sizeof(rx_temp));
}
}
void USER_UART_IDLECallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1)
{
if(RESET != __HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE))
{
__HAL_UART_CLEAR_IDLEFLAG(&huart1);
HAL_UART_Transmit(&huart1,rx_buff,rx_len,100);
rx_len=0;
}
}
}
7、在串口中断中添加IDLE中断函数
打开stm32f4xxit.c找到相关函数并完成添加,记得要先使用extern关键字在该.c文件里声明 因为这个IDLE回调函数是我们自己写的,HAL里并没有这个函数
void USER_UART_IDLECallback(UART_HandleTypeDef *huart);
void USART1_IRQHandler(void)
{
HAL_UART_IRQHandler(&huart1);
USER_UART_IDLECallback(&huart1);
}
8、实现效果
|