0%

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闪烁频率

声明变量

1
2
3
4
5
6
7
/* 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函数接收下一字节数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/* 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

1
2
3
4
5
6
7
8
9
10
11
12
13
/* 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 */