基于HAL库的stm32 中断接收串口
时间: 2023-09-04 09:16:44 浏览: 93
stm32hal库uart中断接收修改步骤.rar_HAL串口接收_grew5j1_stm32hal_stm32hal库_stm
在基于HAL库的STM32中,接收串口数据可以通过USART的中断方式实现。以下是一个接收串口数据并打印的示例代码:
```c
#include "stm32f4xx_hal.h"
#include <stdio.h>
UART_HandleTypeDef huart2; // 定义串口句柄
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
if (huart->Instance == USART2) { // 判断是哪个串口
uint8_t data = huart->pRxBuffPtr[-1]; // 获取接收到的数据
printf("Received data: %c\r\n", data); // 打印接收到的数据
HAL_UART_Receive_IT(&huart2, &data, 1); // 继续接收数据
}
}
int main(void) {
HAL_Init(); // 初始化HAL库
__HAL_RCC_USART2_CLK_ENABLE(); // 使能USART2的时钟
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE(); // 使能GPIOA的时钟
GPIO_InitStruct.Pin = GPIO_PIN_2 | GPIO_PIN_3; // USART2的TX和RX引脚
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF7_USART2;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
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;
HAL_UART_Init(&huart2); // 初始化串口
uint8_t data;
HAL_UART_Receive_IT(&huart2, &data, 1); // 开始接收数据
while (1) {
// 主程序循环
}
}
```
在上面的代码中,我们定义了一个UART_HandleTypeDef类型的句柄,用于管理串口接口。在main函数中,我们首先初始化了HAL库,然后启用了USART2的时钟。接着,我们初始化了GPIO引脚和串口句柄,并设置了串口的一些参数(如波特率、字长等)。最后,我们开启了接收中断,并在接收到数据后打印出来,然后继续接收数据。
需要注意的是,在HAL库中,串口接收中断的回调函数为`HAL_UART_RxCpltCallback`,需要在函数名前加上`__weak`关键字,否则会出现重定义错误。另外,在接收中断回调函数中,需要判断是哪个串口触发了中断,然后获取接收到的数据,并继续调用`HAL_UART_Receive_IT`函数开启下一次接收。
阅读全文