登录/注册

STM32如何写多个中断

更多

在 STM32 中编写多个中断服务函数的步骤如下(以 HAL 库和 STM32CubeMX 为例):


1. 配置外设和中断

使用 STM32CubeMX 或代码手动配置外设并启用中断:

// 示例:USART1 接收中断 + TIM2 定时器中断
void MX_USART1_UART_Init(void) {
  huart1.Instance = USART1;
  // ... 其他配置
  HAL_UART_Init(&huart1);
  HAL_UART_Receive_IT(&huart1, rx_buffer, 1); // 启用接收中断
}

void MX_TIM2_Init(void) {
  htim2.Instance = TIM2;
  // ... 其他配置
  HAL_TIM_Base_Init(&htim2);
  HAL_TIM_Base_Start_IT(&htim2); // 启用定时器更新中断
}

2. 设置 NVIC(中断优先级)

main() 初始化阶段配置 NVIC:

// 设置 USART1 中断优先级
HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);  // 参数:中断号,抢占优先级,子优先级
HAL_NVIC_EnableIRQ(USART1_IRQn);         // 使能中断

// 设置 TIM2 中断优先级
HAL_NVIC_SetPriority(TIM2_IRQn, 1, 0);   // 优先级数值越小,优先级越高
HAL_NVIC_EnableIRQ(TIM2_IRQn);

3. 编写中断服务函数

每个中断有独立的处理函数,函数名需与 启动文件 中定义的向量表名一致:

(1) USART1 接收中断

// USART1 全局中断服务函数(函数名固定)
void USART1_IRQHandler(void) {
  HAL_UART_IRQHandler(&huart1); // HAL 库中断处理
}

// 回调函数(数据接收完成时自动调用)
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
  if (huart->Instance == USART1) {
    // 处理接收到的数据(rx_buffer[0])
    HAL_UART_Receive_IT(&huart1, rx_buffer, 1); // 重新启用接收
  }
}

(2) TIM2 定时器中断

// TIM2 全局中断服务函数
void TIM2_IRQHandler(void) {
  HAL_TIM_IRQHandler(&htim2); // HAL 库中断处理
}

// 定时器更新中断回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
  if (htim->Instance == TIM2) {
    // 定时器中断处理逻辑(如 LED 翻转)
    HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
  }
}

关键点说明

  1. 中断函数名固定
    函数名(如 USART1_IRQHandler)必须与启动文件(startup_stm32fxxx.s)中的中断向量名一致。
  2. NVIC 优先级分组
    使用 HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_X) 设置优先级分组(通常在 main() 开头调用)。
  3. 中断标志清除
    HAL 库的 HAL_XXX_IRQHandler() 会自动清除中断标志。手动处理时需调用 __HAL_UART_CLEAR_FLAG() 等函数清除标志位。
  4. 避免阻塞操作
    中断服务函数中避免使用 HAL_Delay() 或长时间循环。

示例启动文件(片段)

; startup_stm32f103xe.s(部分中断向量)
  .word  TIM2_IRQHandler     ; TIM2 中断入口
  .word  USART1_IRQHandler   ; USART1 中断入口
  ...

; 弱定义默认处理函数
  .weak  TIM2_IRQHandler
  .thumb_set TIM2_IRQHandler,Default_Handler

? 提示

  • 使用 STM32CubeMX 可自动生成中断配置代码。
  • 查询中断号:在 HAL 库头文件 stm32fxxx.h 中搜索 IRQn_Type

如何在PORTC上设置多个中断

我正在尝试在 PORTC 上设置多个中断,例如。PTC10、PTC12、PTC13 但不能正常工作。我正在使用以下方法安装 ISR。 但是在使用 PORTD--> PTD31

2023-03-28 06:15:25

STM32入门学习笔记之中断架构(上)

Cortex-M3内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且具有256级的可编程

2023-02-16 09:57:05

STM32多个中断是否可以同时处于Active状态?

了 main(void)。问题1:多个中断是否可以同时处于Active状态,或者严格来说一次只有一个处于active状态,而其他的都处于pending状态?(考虑所有情况,包括低优先级中断在执行过程中被高

2022-12-07 06:46:36

stm32的NVIC中断

NVIC中断优先级分组CM3内核支持256个中断,其中包含了16个内核中断以及240个外部

资料下载 李敏 2022-01-14 15:23:52

ES7P003使用多个中断时报错及解决办法

问题描述:当使用idesigner对ES7P003编程时候,有时可能会使用多个中断,但是新手在使用多个中断的时候,idesigner会出现编译报错的情况,如下图所示:解决办法:1.配置字中开启

资料下载 佚名 2021-12-09 14:06:11

STM32外部中断实验-EXTI

STM32 外部中断简介STM32 的每个 IO 都可以作为外部中断的

资料下载 鼠爱米 2021-11-29 16:06:09

STM32公用中断源时的中断分配

以STM32l0xx为例多外部中断共用中断源时,要通过判断中断请求状态来

资料下载 佚名 2021-11-24 16:51:10

51单片机有几个中断?单片机的中断号对应的中断类型说明

51单片机通常有5个中断,当中断发生时,程序会跳到相应的中断服务程序去执行。为了区别不同的

资料下载 刘埃生 2019-08-06 17:34:00

如何写个中断函数

目录1、中断2、复位3、通用I/O及其中断:I/O寄存器I/O中断寄存器默认状态如何写

2021-11-29 07:30:15

使用多个中断的 RX 系列微控制器

本应用笔记介绍了使用多个中断的 RX 系列微控制器。该文件包括规格书、运行确认条件、硬件和软件以及示例程序。 规格 在处理 IRQ1 中断时,会发生 IRQ3

2021-06-21 12:03:17

FreeRTOS中如何写硬件中断程序啊?

FreeRTOS中如何写硬件中断程序啊?比如说按键中断,怎么写?能给个具

2020-07-31 08:00:35

多个中断的问题如何解决

大家好,我有一个关于使用多个中断的问题。我使用PIC18F46K20、带有一些传统外围库的XC8编译器和PICkit3作为调试器。我使用的一个中断是基于ADC的

2020-05-07 09:24:13

怎么处理MCP23S17上的多个中断

我不清楚MCP23 S17如何处理几乎彼此一致的多个中断条件。当一个中断被服务,并且INTF寄存器和GPIO寄存器在ISR中被读取时,如果另一个中断

2020-03-16 10:49:29

如何写51单片机矩阵多个按键同时按下的程序?

矩阵扫描键盘已经写完了,单个按键按下没问题,如何写两个、多个按键同时按下的程序

2019-10-17 19:51:55

如何写adxl345单双击中断程序?

adxl345如何写单双击中断程序,我写了一个无法进入中断,求教!

2019-09-19 00:44:45
7天热门专题 换一换
相关标签