【C】嵌入式的中断,理解

server/2025/3/16 23:30:25/

🚀 嵌入式中断(Interrupt)概念解析

在嵌入式系统中,中断(Interrupt)是一种硬件或软件事件,它可以打断 CPU 的正常运行流程,立即执行特定的中断服务程序(ISR,Interrupt Service Routine),以快速响应某些紧急任务或外设事件。


🔹 为什么需要中断?

在嵌入式系统中,CPU 通常需要处理外部事件(例如按键输入、传感器数据、通信数据等)。有两种方式来检测这些事件:

  1. 轮询(Polling)

    • CPU 主动循环检查某个外设状态(如读取按键是否按下)。
    • 缺点:CPU 资源占用高,即使没有事件发生,也会不断执行检查,浪费功耗。
  2. 中断(Interrupt)

    • 事件发生时,外设主动通知 CPU,让 CPU 立即执行处理代码。
    • 优势:
      降低 CPU 资源消耗(无需不断轮询)
      实时性更高(事件发生时立即响应)

🔹 中断的基本流程

  1. 外设或软件触发中断

    • 例如,串口收到一帧数据、定时器超时、按钮被按下。
  2. CPU 保存当前执行状态

    • 保存 PC(程序计数器)、寄存器等状态,以便稍后返回继续执行。
  3. CPU 跳转到中断服务程序(ISR)

    • 执行对应的中断服务函数,处理事件(如读取传感器数据)。
  4. ISR 结束后,恢复 CPU 运行

    • CPU 恢复之前的状态,继续执行被中断的代码。

🔹 硬件中断 vs. 软件中断

类型触发方式应用场景
硬件中断外设(GPIO、定时器、串口)等触发传感器数据采集、定时任务
软件中断软件代码手动触发 trigger_interrupt()任务切换、异常处理

🔹 常见的中断类型

外部中断(GPIO、按键)

  • 通过 外部引脚 触发,如 按键按下、传感器信号变化。
  • 示例:STM32 的 EXTI(外部中断控制器)

定时器中断

  • 设定定时器定期触发,用于周期性任务,如 定时 LED 闪烁、定时任务调度
  • 示例:STM32 的 TIMx 计时器

串口中断(UART、SPI、I2C)

  • 当串口收到数据发送完成 时触发。
  • 示例:串口接收中断 USART_RX_IRQHandler()

DMA(直接内存访问)中断

  • 数据传输完成 时触发,如 ADC 采集完数据后通知 CPU 处理
  • 适用于 大数据量传输,减少 CPU 负担

🔹 中断代码示例

① GPIO 外部中断

📌 场景: 按键按下触发中断,点亮 LED

// 1. 初始化外部中断
void GPIO_EXTI_Init(void)
{EXTI->IMR |= (1 << 0);  // 使能外部中断 0 (GPIO0)EXTI->RTSR |= (1 << 0); // 触发方式:上升沿--【  指信号 从低电平(0)跳变到高电平(1) 的瞬间NVIC_EnableIRQ(EXTI0_IRQn); // 使能 NVIC 中断
}// 2. 外部中断服务函数
void EXTI0_IRQHandler(void)
{if (EXTI->PR & (1 << 0)) // 检测是否是 EXTI0 触发{LED_Toggle(); // 反转 LED 状态EXTI->PR |= (1 << 0); // 清除中断标志位}
}

🔹 流程:

  1. 按键按下,GPIO 产生电平变化(上升沿)。
  2. EXTI0_IRQHandler() 被 CPU 调用,执行 LED 反转 逻辑。
  3. 清除中断标志位,等待下一次中断触发。

② 定时器中断

📌 场景: 每 1 秒触发一次定时器中断,控制 LED 闪烁

// 1. 配置定时器
void Timer_Init(void)
{TIM2->PSC = 8000 - 1;   // 预分频,使 1ms 计数一次TIM2->ARR = 1000 - 1;   // 自动重装值,1s 触发一次TIM2->DIER |= (1 << 0); // 使能中断NVIC_EnableIRQ(TIM2_IRQn); // 使能 NVIC 中断TIM2->CR1 |= (1 << 0);  // 使能定时器
}// 2. 定时器中断服务函数
void TIM2_IRQHandler(void)
{if (TIM2->SR & (1 << 0)) // 检测中断标志{LED_Toggle(); // LED 反转TIM2->SR &= ~(1 << 0); // 清除中断标志}
}

🔹 流程:

  1. 定时器 TIM2 每隔 1 秒触发一次中断。
  2. TIM2_IRQHandler() 处理中断,执行 LED 反转操作。
  3. 清除中断标志,等待下一次定时触发。

🔹 中断的高级用法

1️⃣ 中断嵌套

  • 高优先级中断可以打断低优先级的中断。
  • 例如:定时器中断(低优先级) 执行时,外部 GPIO 按键(高优先级) 依然能触发并中断。

2️⃣ 低功耗模式下的中断唤醒

  • 嵌入式设备在低功耗模式下(如 STOPSLEEP),CPU 处于休眠状态。
  • 外部中断(如 GPIO、串口)可以唤醒系统,减少功耗。
// 进入低功耗模式
__WFI();  // 等待中断,CPU 休眠

📌 场景: 设备长时间待机,按键唤醒系统。


🔹 小结

概念说明
中断事件发生时 CPU 立即响应,执行 ISR 处理
轮询CPU 不断检查外设状态,效率低
外部中断例如 按键、GPIO 触发
定时器中断例如 1 秒触发一次定时任务
串口中断UART、SPI、I2C 数据接收
DMA 中断数据传输完成通知 CPU
中断嵌套高优先级中断可抢占低优先级

📌 嵌入式开发中,中断是 提高系统实时性和效率的重要手段 🎯


http://www.ppmy.cn/server/175555.html

相关文章

TTP/HTTPS、TCP/IP 协议、RPC、Socket 通信机制

1. TTP/HTTPS TTP (HTTP) 和 HTTPS&#xff08;Hypertext Transfer Protocol Secure&#xff09;是基于 TCP/IP 协议的应用层协议&#xff0c;主要用于客户端和服务器之间的数据传输。 HTTP&#xff08;超文本传输协议&#xff09;&#xff1a;这是用于 web 页面和服务器之间…

三角函数:从宇宙法则到AI革命的数学密钥

——跨越三千年的数学语言与现代科技全景透视 一、数学本质&#xff1a;宇宙的波动密码 1.1 拓扑学视角下的三角函数 三角函数本质是单位圆上点的坐标参数化&#xff0c;其数学表达可抽象为&#xff1a; { x cos ⁡ θ ℜ ( e i θ ) y sin ⁡ θ ℑ ( e i θ ) \begin…

MKS HA-MFV:半导体制造中的高精度流量验证技术解析

引言 在半导体先进制程&#xff08;如3nm节点&#xff09;中&#xff0c;工艺气体流量的精准控制直接决定刻蚀、沉积等关键步骤的均匀性和良率。MKS Instruments推出的 HA-MFV&#xff08;High Accuracy Mass Flow Verifier&#xff09; 通过创新设计解决了传统流量验证技术的…

C++程序设计语言笔记——抽象机制:构造、清理、拷贝和移动

0 应该将构造函数、赋值操作以及析构函数设计为一组匹配的操作。 在C中&#xff0c;构造函数、赋值操作符和析构函数共同管理对象的资源生命周期。为确保资源安全且一致地处理&#xff0c;需将它们作为一组匹配的操作设计。以下是关键要点&#xff1a; 为何需要协同设计&…

C# NX二次开发:在多个体的模型中如何实现拉伸操作布尔减

大家好&#xff0c;今天接着上一篇拉伸文章去讲。 UF_MODL_create_extruded1 (view source) uf_list_p_tobjectsInputList of objects to be extruded.char *taper_angleInputTaper angle (in degrees).char *limit [ 2 ]InputLimit of extrusion. This is declared as: char …

C 语 言 --- 二 维 数 组 的 应 用

C 语 言 --- 二 维 数 组 的 应 用 第 一 题 - - - 冒 泡 排 序冒 泡 排 序冒 泡 排 序 的 原 理 第 二 题 - - - 回 型 矩 阵特 点 第 三 题 - - - 蛇 形 矩 阵总结 &#x1f4bb;作者简介&#xff1a;曾 与 你 一 样 迷 茫&#xff0c;现 以 经 验 助 你 入 门 C 语 言 &…

RK3588 openssl-3.4.1 编译安装

安装依赖 sudo apt update && sudo apt install build-essential perl libtext-template-perl -y 下载并解压源码 wget https://www.openssl.org/source/openssl-3.4.1.tar.gz tar -xzf openssl-3.4.1.tar.gz && cd openssl-3.4.1 配置编译选项 ./config --…

Node.js 技术原理分析系列5——理解 Node.js 中的 ABI 稳定

Node.js 是一个开源的、跨平台的JavaScript运行时环境&#xff0c;它允许开发者在服务器端运行JavaScript代码。Node.js 是基于Chrome V8引擎构建的&#xff0c;专为高性能、高并发的网络应用而设计&#xff0c;广泛应用于构建服务器端应用程序、网络应用、命令行工具等。 本系…