项目场景:
HAL库使用USART时,更便捷的使用IDLE中断标志位接收不定长数据。
基础库实现方法
中断函数添加如下:
if (__HAL_UART_GET_FLAG(&huart2,USART_ISR_ORE))
{
__HAL_UART_CLEAR_OREFLAG(&huart2);
Usrt2_Rx_Flag = 0;
Usrt2_Rx_Cnt = 0;
}
if (__HAL_UART_GET_FLAG(&huart2,UART_FLAG_IDLE))
{
__HAL_UART_CLEAR_IDLEFLAG(&huart2);
Usrt2_Rx_Flag = 1;
Usrt2_Rx_Cnt = 0;
}
if (__HAL_UART_GET_FLAG(&huart2,UART_FLAG_RXNE))
{
__HAL_UART_CLEAR_FLAG(&huart2,UART_FLAG_RXNE);
Usrt2_Rx_Data[Usrt2_Rx_Cnt] = USART2->RDR;
if (Usrt2_Rx_Cnt < 10) Usrt2_Rx_Cnt++;
else
{
Usrt2_Rx_Cnt = 0;
Usrt2_Rx_Flag = 1;
}
}
HAL库实现方法
通过添加回调函数实现,中断函数添加如下:
if (__HAL_UART_GET_FLAG(&huart2,UART_FLAG_IDLE))
{
__HAL_UART_CLEAR_IDLEFLAG(&huart2);
USAR_UART_IDLECallback(&huart2);
Usrt2_Rx_Flag = 1;
Usrt2_Rx_Cnt = 0;
}
添加接收完成回调函数:
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
if (huart->Instance == USART1) {
RS485_Recive(); // 协议解析
}
if (huart->Instance == USART2) {
UART2_Recive(); // 协议解析
}
}
添加空闲中断回调函数:
void USAR_UART_IDLECallback(UART_HandleTypeDef *huart)
{
if (huart->Instance == USART1) {
HAL_UART_DMAStop(&huart1); //停止本次DMA传输
// memset(Usrt2_Rx_Data,0,10); //清零接收缓冲区
HAL_UART_Receive_DMA(&huart1, Usrt1.R_Data, 8); //重启开始DMA传输 每次8字节数据
}
if (huart->Instance == USART2) {
HAL_UART_DMAStop(&huart2); //停止本次DMA传输
// memset(Usrt2_Rx_Data,0,10); //清零接收缓冲区
HAL_UART_Receive_DMA(&huart2, Usrt2_Rx_Data, 10); //重启开始DMA传输 每次10字节数据
}
}