当前位置: 首页 > article >正文

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


http://www.kler.cn/a/376506.html

相关文章:

  • 国产服务器部署1.获取银河麒麟V10服务器。首先挂gpt数据盘
  • 微信小程序海报
  • git 入门作业
  • 面试必会50题
  • linux-UART
  • LeetCode 3226.使两个整数相等的位更改次数:位运算(接近O(1)的做法)
  • 491.递增子序列
  • Android各种调试命令
  • 2、片元着色器之有向距离场(SDF)运算:并集、差集、交集
  • go语言中interface之间嵌入与struct之间的嵌入实现多态
  • aws boto3 下载文件
  • 螺旋式开发是不是就是敏捷开发?
  • Jenkins面试整理-如何在 Jenkins 中进行并行构建?
  • 手把手写Linux第一个小程序 - 进度条(5种版本)
  • OpenSSH用户枚举漏洞修复——ubuntu升级ssh版本
  • 线程函数和线程启动的几种不同形式
  • 掌握ElasticSearch(七):相关性评分
  • Axios-Mock-Adapter mock数据
  • 《卷积、卷积操作、卷积神经网络原理探索》
  • 3. 探索 Netty 的粘包与拆包解决方案
  • ARM base instruction -- mneg
  • 正点原子阿尔法ARM开发板-IMX6ULL(十一)——IIC协议和SPI协议--AP3216C环境光传感器和ICM20608六轴传感器
  • 在Zetero中调用腾讯云API的输入密钥的问题
  • 【Linux】信号三部曲——产生、保存、处理
  • ES跟Kafka集成
  • git 切换分支