如何为STM32的串口编写中断程序

时间:2024-11-06 08:21:40

引言

为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的串口编写中断程序。确保你已经正确配置了串口参数和中断,并且在中断服务函数中正确处理接收到的数据。这样,每当串口接收到数据时,你的程序都能够响应中断并执行相应的操作。