STM32 hal库串口中断收发
时间: 2025-01-07 20:34:50 浏览: 11
### STM32 HAL库实现串口中断收发
#### 初始化配置
为了使用中断模式进行UART通信,在STM32CubeMX中需设置USART1的NVIC优先级并启用中断功能[^1]。完成硬件初始化后,可在`main.c`文件内的用户代码区加入必要的变量声明和函数定义。
```c
#define UART1_IRQ
// 测试字符串用于发送
uint8_t TdataIRQ[] = "welcome to uart irq!\r\n";
// 接收到的数据存储位置
uint8_t Rdata;
```
#### 发送与接收处理
对于基于HAL库的操作,通过调用特定API来启动异步传输过程:
- `HAL_UART_Transmit_IT()` 函数负责以中断方式发送指定长度的数据缓冲区内容;
- `HAL_UART_Receive_IT()` 则是用来开启接收操作,并等待外部设备传入的信息[^2]。
当采用如下形式调用上述两个接口时:
```c
HAL_UART_Transmit_IT(&huart2, (uint8_t*)TdataIRQ, sizeof(TdataIRQ));
HAL_UART_Receive_IT(&huart2, &Rdata, 1);
```
这里假设`huart2`代表已经正确配置好的UART句柄对象;第一个参数是指向待发送/读取内存地址指针;最后一个整数表示要交换字节数量。
#### 中断服务例程ISR
每当发生一次完整的字符输入事件或者输出完成后会触发相应的回调机制。因此还需要自定义这些事件处理器以便于进一步逻辑控制:
```c
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart){
if(huart->Instance== USART1){
// 当前实例匹配时执行额外指令集
GPIO_TogglePin(GPIOA,GPIO_PIN_5); // 假设PA5连接了一个LED指示灯
}
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
if(huart->Instance== USART1){
// 处理接收到的新数据...
}
}
```
以上片段展示了如何利用回调函数对接收到的消息做出响应以及在每次成功发送消息之后改变某个I/O端口状态作为反馈信号。
阅读全文