如何为STM32的串口编写中断程序
引言
为STM32的串口(USART/UART)编写中断程序涉及到配置串口参数、设置中断和编写中断服务函数(ISR)。以下是一般步骤和示例代码:
1. 初始化串口
首先,需要初始化串口外设,包括设置波特率、字长、停止位、校验位等参数。
UART_HandleTypeDef huart1;
void MX_USART1_UART_Init(void)
{
huart1.Instance = USART1;
huart1.Init.BaudRate = 9600;
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;
if (HAL_UART_Init(&huart1) != HAL_OK)
{
Error_Handler();
}
}
2. 配置中断
配置NVIC以使能串口中断,并设置中断优先级。
void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(uartHandle->Instance == USART1)
{
/* USART1 clock enable */
__HAL_RCC_USART1_CLK_ENABLE();
/* USART1 GPIO Configuration */
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10; // PA9: USART1_TX, PA10: USART1_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_USART1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* USART1 interrupt Init */
HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(USART1_IRQn);
}
}
3. 编写中断服务函数
在中断服务函数中,你需要处理接收到的数据或传输新的数据。STM32 HAL库提供了`HAL_UART_IRQHandler`函数,它应该在ISR中被调用。
void USART1_IRQHandler(void)
{
HAL_UART_IRQHandler(&huart1);
}
4. 接收中断回调函数
在接收到数据后,HAL库提供了一个回调函数`HAL_UART_RxCpltCallback`,你可以在这里处理接收到的数据。
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1)
{
// 处理接收到的数据
char received_char = huart->Instance->DR; // 读取数据寄存器以清除中断标志
// 可以在这里添加代码来处理字符,例如将其存储在缓冲区或直接处理
}
}
5. 启动接收中断
最后,使用HAL库函数启动接收中断。
// 接收单个字节
HAL_UART_Receive_IT(&huart1, &received_char, 1);
// 或者接收多个字节到缓冲区
uint8_t rxBuffer[10];
HAL_UART_Receive_IT(&huart1, rxBuffer, sizeof(rxBuffer));
以上步骤和代码示例提供了一个基本的框架,用于为STM32的串口编写中断程序。确保你已经正确配置了串口参数和中断,并且在中断服务函数中正确处理接收到的数据。这样,每当串口接收到数据时,你的程序都能够响应中断并执行相应的操作。