1. CubeMXp配置
1.首先根据本专题栏0节完成CubeMX的基本配置。理论部分可以参考正点原子HAL库版本视频。
2.根据自己的引脚打开相应的串口
3.选择同步或者异步通信。
4.设置对应的波特率、收发模式等。同时打开中断(NVIC)和DMA。
5.完成设置点击生成代码。
6.生成代码后开始修改代码
6.1 打开DMA接收中断同时在中断函数中写入自己要实现的功能,此处我用的是判断IDLE进行判断
/* USART2 init function */
void MX_USART2_UART_Init(void)
{
/* USER CODE BEGIN USART2_Init 0 */
/* USER CODE END USART2_Init 0 */
/* USER CODE BEGIN USART2_Init 1 */
/* USER CODE END USART2_Init 1 */
huart2.Instance = USART2;
huart2.Init.BaudRate = 115200;
huart2.Init.WordLength = UART_WORDLENGTH_8B;
huart2.Init.StopBits = UART_STOPBITS_1;
huart2.Init.Parity = UART_PARITY_NONE;
huart2.Init.Mode = UART_MODE_TX_RX;
huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart2.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart2) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN USART2_Init 2 */ //此处是需要自己加入的,初始化函数,根据不同的串口写入huartn
__HAL_UART_ENABLE_IT(&huart2, UART_IT_RXNE);
__HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE); //使能IDLE中断
HAL_UART_Receive_DMA(&huart2, rx_buffer_huart2, 200); //打开DMA中断
/* USER CODE END USART2_Init 2 */
}
void USART2_IRQHandler(void)
{
/* USER CODE BEGIN USART2_IRQn 0 */
if (__HAL_UART_GET_FLAG(&huart2, UART_FLAG_IDLE) != RESET) { //idle标志被置位
__HAL_UART_CLEAR_IDLEFLAG(&huart2);//清除标志位
HAL_UART_DMAStop(&huart2);
recv_end_flag_huart2=1; //接收完成标志位 状态设置为1,在MAIN函数while函数中写入功能函数
HAL_UART_Receive_DMA(&huart2, rx_buffer_huart2, 200);
}
/* USER CODE END USART2_IRQn 0 */
HAL_UART_IRQHandler(&huart2);
/* USER CODE BEGIN USART2_IRQn 1 */
HAL_UART_Receive_DMA(&huart2, rx_buffer_huart2, BUFFER_SIZE); //重新打开DMA接收
/* USER CODE END USART2_IRQn 1 */
}
个人总结
- 还有不同的实现,大家根据功能进行选择