stm32l 系列串口高波特率的实现
在常规使用下一般我们可以使用hal函数中的HAL_UART_Receive_IT来做串口接收使用。
但是在速度大于或者等于1000000波特率的时候,经常串口接收就会出线串口错误。我们的485振动传感器需要高速传输实时数据的同时能够接收外部命令,
这个时候,就需要使用串口DMA接收以及空闲中断来实现。基本需要增加的流程代码如下:
/* USER CODE BEGIN USART1_Init 2 */
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE); //使能IDLE中断
//DMA接收函数,此句一定要加,不加接收不到第一次传进来的实数据,是空的,且此时接收到的数据长度为缓存器的数据长度
HAL_UART_Receive_DMA(&huart1,rx_buffer,RX_BUFFER_SIZE);
在串口中断处理中如下:
HAL_UART_IRQHandler(&huart1);
if(USART1 == huart1.Instance)
{
tmp_flag =__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE); //??IDLE???
if((tmp_flag != RESET))//idle?????
{
recv_end_flag = 1; //
__HAL_UART_CLEAR_IDLEFLAG(&huart1);//
// temp = UartHandle.Instance->SR;
// temp = UartHandle.Instance->DR; //
HAL_UART_DMAStop(&huart1); //
temp = __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);//
rx_len = RX_BUFFER_SIZE - temp; //
memcpy(process_buffer,rx_buffer,rx_len);
memset(rx_buffer,0,RX_BUFFER_SIZE);
extern QueueHandle_t xDMAQueue;
if(xDMAQueue) xQueueSendFromISR(xDMAQueue,(void*)&rx_len,0);
HAL_UART_Receive_DMA(&huart1,rx_buffer,RX_BUFFER_SIZE);//
}
}
通过以上方法,我司的485振动传感器可实现高速三轴原始数据实时采集。