HAL库 - 中断

使用中断方式接收数据

HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
参数huart:串口句柄的指针,比如&huart1
参数pData:接收数据缓冲区
参数Size:要接收数据的量

回调函数

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
参数huart:串口句柄的指针,比如&huart1

示例:串口接收数据控制LED闪烁频率

声明变量

1234567
/* Private variables ---------------------------------------------------------*/UART_HandleTypeDef huart1;//串口的句柄 /* USER CODE BEGIN PV */static uint32_t blinkInterval = 1000;//闪灯频率变量static uint8_t dataRcvd;//声明接收数据变量/* USER CODE END PV */

回调函数,进行数据处理,并再次调用HAL_UART_Receive_IT函数接收下一字节数据。

123456789101112131415161718192021
/* USER CODE BEGIN 0 */void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){	if(huart == &huart1)//确认接收数据的串口时huart1	{		if(dataRcvd == '1')		{			blinkInterval = 1000;		}		if(dataRcvd == '2')		{			blinkInterval = 300;		}		if(dataRcvd == '3')		{			blinkInterval = 50;		}		HAL_UART_Receive_IT(&huart1, &dataRcvd, 1);//为下一次接收准备	}}/* USER CODE END 0 */

main

12345678910111213
/* USER CODE BEGIN WHILE */	HAL_UART_Receive_IT(&huart1, &dataRcvd, 1);//开启USART1的中断接收模式,串口1接收到1字节的数据时,保存在dataRcvd变量中  while (1)  {		HAL_GPIO_WritePin(GPIOE,GPIO_PIN_2,GPIO_PIN_RESET);		HAL_Delay(blinkInterval);		HAL_GPIO_WritePin(GPIOE,GPIO_PIN_2,GPIO_PIN_SET);		HAL_Delay(blinkInterval);    /* USER CODE END WHILE */     /* USER CODE BEGIN 3 */  }  /* USER CODE END 3 */
🔍 ×