stm32 串口接收中断例程
时间: 2023-09-04 09:13:26 浏览: 47
下面是一个简单的 STM32 串口接收中断例程,使用的是 HAL 库:
```c
#include "stm32f1xx_hal.h"
#include <string.h>
UART_HandleTypeDef huart1;
char rx_buffer[50];
uint8_t rx_data;
int rx_count = 0;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if (rx_data == '\n') // 如果接收到换行符,则表示接收结束
{
rx_buffer[rx_count] = '\0'; // 末尾加上字符串结束符
rx_count = 0; // 接收计数器清零
// 处理接收到的数据
// ...
}
else // 如果没有接收完成,则继续接收下一个字符
{
rx_buffer[rx_count++] = rx_data;
}
HAL_UART_Receive_IT(&huart1, &rx_data, 1); // 重新开启接收中断
}
int main(void)
{
HAL_Init();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_USART1_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
huart1.Instance = USART1;
huart1.Init.BaudRate = 115200;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
HAL_UART_Init(&huart1);
HAL_UART_Receive_IT(&huart1, &rx_data, 1); // 开启接收中断
while (1)
{
// 主程序循环
}
}
```
在这个例程中,我们使用了 `HAL_UART_RxCpltCallback()` 回调函数来处理接收中断。当接收到一个字符时,我们判断是否为换行符,如果是,则表示接收结束,我们将接收到的数据进行处理。如果不是,则继续接收下一个字符,并将接收计数器加一。最后,我们重新开启接收中断。在 `main()` 函数中,我们调用了 `HAL_UART_Receive_IT()` 函数来开启接收中断。