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

STM32学习之ARM内核自带的中断

📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨
📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】
📢:文章若有幸对你有帮助,可点赞 👍 收藏 ⭐不迷路🙉
📢:内容若有错误,敬请留言 📝指正!原创文,转载注明出处

文章目录

      • 1. 系统异常(System Exceptions)
        • 1.1 复位(Reset)
        • 1.2 不可屏蔽中断(NMI,Non - Maskable Interrupt)
        • 1.3 硬件错误(HardFault)
        • 1.4 存储器管理错误(Memory Management Fault)
        • 1.5 总线错误(BusFault)
        • 1.6 使用错误(UsageFault)
      • 2. 中断控制器相关中断
        • 2.1 SysTick定时器中断
        • 2.2 PendSV(可挂起的系统服务)
        • 2.3 SVC(系统服务调用)
      • 3. 代码
      • 4. 总结


ARM内核自带了多个中断,不同的ARM内核版本(如Cortex - M0、Cortex - M3、Cortex - M4等)可能会在中断数量和类型上有所差异,但一些常见的中断类型基本是相似的。下面以Cortex - M系列内核为例,介绍一些ARM内核自带的重要中断:

1. 系统异常(System Exceptions)

1.1 复位(Reset)
  • 描述:复位异常是系统上电或者按下复位按钮后触发的第一个异常。当发生复位时,处理器会停止当前正在执行的任务,将所有寄存器和系统状态恢复到初始值,然后从复位向量处开始执行程序,通常是启动代码的入口点。
  • 优先级:最高优先级,不可屏蔽。
1.2 不可屏蔽中断(NMI,Non - Maskable Interrupt)
  • 描述:NMI是一种具有最高优先级的中断,用于处理一些非常紧急且不能被其他中断或异常所屏蔽的事件,例如硬件故障、电源故障等。一旦触发NMI,处理器会立即停止当前正在执行的任务,转去执行NMI的中断服务程序。
  • 优先级:固定为最高优先级,不可屏蔽。
1.3 硬件错误(HardFault)
  • 描述:当处理器遇到无法处理的硬件错误时,会触发HardFault异常。这些错误可能包括非法指令、内存访问错误(如访问未映射的内存地址)、总线错误等。HardFault异常处理程序通常需要进行错误诊断和恢复操作,以确保系统的稳定性。
  • 优先级:较高优先级,通常在系统异常中仅次于NMI。
1.4 存储器管理错误(Memory Management Fault)
  • 描述:该异常在访问内存违反了存储器管理单元(MMU)或者内存保护单元(MPU)的规则时触发,例如访问了受保护的内存区域、执行了未授权的内存操作等。通过处理该异常,可以及时发现和处理内存访问错误,提高系统的安全性。
  • 优先级:可配置。
1.5 总线错误(BusFault)
  • 描述:当处理器在访问总线(如内存总线、外设总线)时发生错误,如总线传输超时、总线冲突等,会触发BusFault异常。该异常处理程序可以对总线错误进行诊断和处理,确保系统的正常通信。
  • 优先级:可配置。
1.6 使用错误(UsageFault)
  • 描述:UsageFault异常在处理器遇到一些使用错误时触发,例如未定义的指令、协处理器访问错误、除零错误等。通过处理该异常,可以捕获程序中的一些逻辑错误,提高程序的健壮性。
  • 优先级:可配置。

2. 中断控制器相关中断

2.1 SysTick定时器中断
  • 描述:SysTick是一个24位的递减定时器,它是Cortex - M内核自带的一个系统定时器。SysTick定时器可以用于实现系统的定时功能,例如操作系统的任务调度、延时函数等。当SysTick定时器计数到0时,会触发SysTick中断。
  • 优先级:可配置。
2.2 PendSV(可挂起的系统服务)
  • 描述:PendSV主要用于操作系统的上下文切换。在多任务操作系统中,当需要进行任务切换时,可以通过设置PendSV异常挂起位来触发PendSV中断,在PendSV中断服务程序中完成任务上下文的保存和恢复操作。
  • 优先级:通常配置为最低优先级,以确保其他高优先级的中断可以优先处理。
2.3 SVC(系统服务调用)
  • 描述:SVC是一种软件触发的异常,用于实现用户程序与操作系统内核之间的系统调用。用户程序可以通过执行SVC指令来触发SVC异常,从而调用操作系统提供的服务,如内存分配、文件操作等。
  • 优先级:可配置。

3. 代码

// 不可屏蔽中断(NMI)处理函数
void NMI_Handler(void)
{// 处理紧急且不能被屏蔽的事件,如硬件故障、电源故障等// 这里可以添加具体的错误处理代码,例如记录错误日志、触发报警等while (1){// 可以添加一些调试信息,如点亮LED表示发生NMIHAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);}
}// 硬件错误(HardFault)处理函数
void HardFault_Handler(void)
{// 处理硬件错误,如非法指令、内存访问错误等// 可以添加错误诊断和恢复操作,例如记录错误状态、重启系统等while (1){// 点亮另一个LED表示发生HardFaultHAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);}
}// 存储器管理错误(Memory Management Fault)处理函数
void MemManage_Handler(void)
{// 处理存储器管理错误,如访问受保护的内存区域等// 可以添加错误处理代码,如记录错误地址、关闭相关外设等while (1){// 点亮特定LED表示发生存储器管理错误HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);}
}// 总线错误(BusFault)处理函数
void BusFault_Handler(void)
{// 处理总线错误,如总线传输超时、总线冲突等// 可以添加错误诊断和恢复操作,如重新初始化总线、记录错误信息等while (1){// 点亮LED表示发生总线错误HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_SET);}
}// 使用错误(UsageFault)处理函数
void UsageFault_Handler(void)
{// 处理使用错误,如未定义的指令、协处理器访问错误等// 可以添加错误处理代码,如检查指令地址、重新初始化相关模块等while (1){// 点亮LED表示发生使用错误HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);}
}// SysTick定时器中断处理函数
void SysTick_Handler(void)
{HAL_IncTick();  // 更新系统滴答计数器// 可以添加定时任务代码,例如每1ms执行一次的任务// 例如:// static uint32_t counter = 0;// counter++;// if (counter % 1000 == 0) {//     HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);// }
}// PendSV(可挂起的系统服务)处理函数
// 在操作系统中用于上下文切换
// 这里只是简单示例,实际应用中会更复杂
void PendSV_Handler(void)
{// 可以添加上下文切换代码,如保存和恢复任务上下文// 例如:// save_context();// switch_to_next_task();// restore_context();
}// SVC(系统服务调用)处理函数
void SVC_Handler(void)
{// 处理系统服务调用,如内存分配、文件操作等// 可以根据不同的系统调用号执行相应的操作// 例如:// uint32_t svc_number = __get_MSP() + 26;// switch (svc_number) {//     case 0://         // 执行内存分配操作//         break;//     case 1://         // 执行文件打开操作//         break;//     default://         break;// }
}

4. 总结

以下是将上述ARM内核自带中断总结成的表格:

中断名称描述优先级
复位(Reset)系统上电或复位按钮按下后触发,使处理器恢复初始状态并从复位向量处开始执行程序最高优先级,不可屏蔽
不可屏蔽中断(NMI)用于处理紧急且不能被屏蔽的事件,如硬件故障、电源故障等固定为最高优先级,不可屏蔽
硬件错误(HardFault)处理器遇到无法处理的硬件错误时触发,如非法指令、内存访问错误等较高优先级,仅次于NMI
存储器管理错误(Memory Management Fault)访问内存违反MMU或MPU规则时触发,如访问受保护内存区域等可配置
总线错误(BusFault)处理器访问总线时发生错误,如总线传输超时、冲突等可配置
使用错误(UsageFault)处理器遇到使用错误时触发,如未定义指令、除零错误等可配置
SysTick定时器中断SysTick定时器计数到0时触发,用于系统定时功能,如任务调度、延时函数等可配置
PendSV(可挂起的系统服务)主要用于操作系统的上下文切换通常配置为最低优先级
SVC(系统服务调用)用户程序通过执行SVC指令触发,用于实现与操作系统内核之间的系统调用可配置

相关文章:

STM32学习之ARM内核自带的中断

📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨ 📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 📢:文章若有幸对你有帮助,可点赞 👍…...

【Windows】Win2008服务器SQL服务监控重启脚本

以下是一个用于监控并自动重启 SQL Server 服务的批处理脚本,适用于 Windows Server 2008 和 SQL Server 2012(默认实例): echo off setlocal enabledelayedexpansion:: 配置参数 set SERVICE_NAMEMSSQLSERVER set LOG_FILEC:\SQ…...

大型语言模型中的工具调用(Function Calling)技术详解

一、引言 随着大型语言模型(LLM)能力的飞速发展,它们在自然语言理解、文本生成、对话交互等方面展现出了令人惊叹的表现。然而,LLM 本身并不具备执行外部操作的能力,比如访问网页、调用第三方 API、执行精确数学运算等…...

Vue3.5 企业级管理系统实战(十四):动态主题切换

动态主题切换是针对用户体验的常见的功能之一,我们可以自己实现如暗黑模式、明亮模式的切换,也可以利用 Element Plus 默认支持的强大动态主题方案实现。这里我们探讨的是后者通过 CSS 变量设置的方案。 1 组件准备 1.1 修改 Navbar 组件 在 src/layo…...

解决Ubuntu20.04安装ROS2的问题(操作记录)

一、ROS 系统安装版本选择 每版的Ubuntu系统版本都有与之对应ROS版本,每一版ROS都有其对应版本的Ubuntu版本,切记不可随便装。ROS 和Ubuntu之间的版本对应关系如下:( 可以从这个网站查看ROS2的各个发行版本的介绍信息。&#xff…...

C# 设置Excel中文本的对齐方式、换行、和旋转

在 Excel 中,对齐、换行和旋转是用于设置单元格内容显示方式的功能。合理的设置这些文本选项可以帮助用户更好地组织和展示 Excel 表格中的数据,使表格更加清晰、易读,提高数据的可视化效果。本文将介绍如何在.NET 程序中通过C# 设置Excel单元…...

Python 的 re.split()

文章目录 栗子:关键点:进阶用法:对比普通 split():典型应用场景: 如何使用 Python 的 re.split() 方法通过正则表达式分割字符串。 栗子: import re s "apple123banana456orange" print(re.sp…...

大数据(6)【Kettle入门指南】从零开始掌握ETL工具:基础操作与实战案例解析

目录 为什么需要Kettle?‌一、Kettle基础概念与核心功能‌1.1 什么是Kettle?‌‌1.2 核心组件‌1.3 优势亮点‌ 二、Kettle安装与快速上手‌‌2.1 环境准备‌‌2.2 启动Spoon‌ ‌‌三、实战案例:从CSV到MySQL的数据迁移与清洗‌‌3.1 创建转…...

5.DJI-PSDK:Psdk开发负载与Msdk的应用app进行交互:

DJI-PSDK:Psdk开发负载与Msdk的应用app进行交互: 负载设备和无人机使用数据传输模块,在控制命令传输通道上以透传的方式在PSDK和MSDK间传输控制指令。在高速数据传输通道上以透传的方式在PSDK和MSDK间传输数据信息以及用户自定义的数据。使用数据传输功能,不仅可以设置不同…...

RPA VS AI Agent

图片来源网络 RPA(机器人流程自动化)和AI Agent(人工智能代理)在自动化和智能化领域各自扮演着重要角色,但它们之间存在显著的区别。以下是对两者区别的详细分析: 一、定义与核心功能 RPA(机…...

第三节:React 基础篇-React组件通信方案

React 组件通信方案详解及使用场景 以下是 React 组件通信的常用方法及其适用场景,以层级结构呈现: 一、父子组件通信 1. Props 传递 • 实现方式: • 父组件通过 props 向子组件传递数据。 • 子组件通过回调函数 (onEvent) 通知父组件更…...

uniapp大文件分包

1. 在pages.json中配置 "subPackages":[{"root":pagesUser,"pages":[{"path":mine/xxx,"style":xxx },{"path":mine/xxx,"style":xxx}]},{"root":pagesIndex,"pages":[{"p…...

Spark-core编程

sortByKey 函数说明 join 函数说明 leftOuterJoin 函数说明 cogroup 函数说明 RDD行动算子: 行动算子就是会触发action的算子,触发action的含义就是真正的计算数据。 reduce 函数说明 collect 函数说明 foreach 函数说明 count 函数说明 first …...

2025年的Android NDK 快速开发入门

十年前写过一篇介绍NDK开发的文章《Android实战技巧之二十三:Android Studio的NDK开发》,今天看来已经发生了很多变化,NDK开发变得更加容易了。下面就写一篇当下NDK开发快速入门。 **原生开发套件 (NDK) **是一套工具,使开发者能…...

基于springboot的“嗨玩旅游网站”的设计与实现(源码+数据库+文档+PPT)

基于springboot的“嗨玩旅游网站”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:springboot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 局部E-R图 系统首页界面 系统注册…...

React 之 Redux 第三十一节 useDispatch() 和 useSelector()使用以及详细案例

使用 Redux 实现购物车案例 由于 redux 5.0 已经将 createStore 废弃,我们需要先将 reduxjs/toolkit 安装一下; yarn add reduxjs/toolkit// 或者 npm install reduxjs/toolkit使用 vite 创建 React 项目时候 配置路径别名 : // 第一种写法…...

6.1es新特性解构赋值

解构赋值是 ES6(ECMAScript 2015)引入的语法,通过模式匹配从数组或对象中提取值并赋值给变量。: 功能实现 数组解构:按位置匹配值,如 let [a, b] [1, 2]。对象解构:按属性名匹配值,…...

4月12日随笔

今天大风天气的第一天,周六,早上九点半起来听了排球技术台培训。结果一天都没顾得上看教学视频。黄老师说有排球基础的可以试试当主裁,那一定要争取一下! 上午看了两集小排球,然后开始了解一些中介相关信息。因为下午…...

MCP遇见Web3:从边缘计算到去中心化的无限想象

MCP遇见Web3:从边缘计算到去中心化的无限想象 在数字化转型的浪潮中,边缘计算(MCP,Micro Control Protocol)和Web3技术分别在计算效率与去中心化架构上发挥着各自的优势。当两者融合,会碰撞出哪些火花?作为一名技术极客,我最近开始深度研究MCP与Web3工具的集成,试图探…...

Llama 4全面评测:官方数据亮眼,社区测试显不足之处

引言 2025年4月,Meta正式发布了全新的Llama 4系列模型,这标志着Llama生态系统进入了一个全新的时代。Llama 4不仅是Meta首个原生多模态模型,还采用了混合专家(MoE)架构,并提供了前所未有的上下文长度支持。本文将详细介绍Llama 4…...

【C++】函数直接返回bool值和返回bool变量差异

函数直接返回bool值和返回bool变量差异 背景 在工作中遇到一个比较诡异的问题,场景是给业务方提供的SDK有一个获取状态的函数GetStatus,函数的返回值类型是bool,在测试过程中发现,SDK返回的是false,但是业务方拿到的…...

游戏盾IP可以被破解吗

游戏盾IP(如上海云盾SDK、腾讯云游戏盾)是专为游戏行业设计的高防服务,旨在抵御DDoS攻击、CC攻击等威胁。其安全性取决于​​技术架构、防护能力​​以及​​运维策略​​。虽然理论上没有绝对“无法破解”的系统,但游戏盾IP在合理…...

第1节:计算机视觉发展简史

计算机视觉与图像分类概述:计算机视觉发展简史 计算机视觉(Computer Vision)作为人工智能领域的重要分支,是一门研究如何使机器"看"的科学,更具体地说,是指用摄影机和计算机代替人眼对目标进行识…...

ARM内核与寄存器

ARM内核与寄存器详解 目录 ARM架构概述ARM处理器模式 Cortex-M3内核的处理器模式Cortex-A系列处理器模式 ARM寄存器集 通用寄存器程序计数器(PC)链接寄存器(LR)堆栈指针(SP)状态寄存器(CPSR/SPSR) 协处理器寄存器NEON和VFP寄存器寄存器使用规范常见ARM指令与寄存器操作 ARM架…...

Hibernate:让对象与数据库无缝对话的全自动ORM框架

一、为什么需要全自动ORM? 在手动编写SQL的时代,开发者需要在Java代码和数据库表之间来回切换: // Java对象 public class User {private Long id;private String name;// getters and setters }// SQL语句 SELECT * FROM user WHERE id ?…...

TDengine 语言连接器(C/C++)

简介 C/C 开发人员可以使用 TDengine 的客户端驱动,即 C/C 连接器(以下都用 TDengine 客户端驱动表示),开发自己的应用来连接 TDengine 集群完成数据存储、查询以及其他功能。TDengine 客户端驱动的 API 类似于 MySQL 的 C API。…...

英伟达Llama-3.1-Nemotron-Ultra-253B-v1语言模型论文快读:FFN Fusion

FFN Fusion: Rethinking Sequential Computation in Large Language Models 代表模型:Llama-3.1-Nemotron-Ultra-253B-v1 1. 摘要 本文介绍了一种名为 FFN Fusion 的架构优化技术,旨在通过识别和利用自然并行化机会来减少大型语言模型(LLM…...

云曦月末断网考核复现

Web 先看一个BUUCTF中的文件一个上传题 [BUUCTF] 2020新生赛 Upload 打开后是一个文件上传页面 随便上传一个txt一句话木马后出现js弹窗,提示只能上传图片格式文件 说明有前端验证。我的做法是把一句话改为.jpg格式, 然后上传 访问发现虽然上传成功了…...

Flutter常用组件实践

Flutter常用组件实践 1、MaterialApp 和 Center(组件居中)2、Scaffold3、Container(容器)4、BoxDecoration(装饰器)5、Column(纵向布局)及Icon(图标)6、Column/Row(横向/横向布局)+CloseButton/BackButton/IconButton(简单按钮)7、Expanded和Flexible8、Stack和Po…...

MySQL MVCC 机制详解

MySQL MVCC 机制详解 1. MVCC 基本概念 MVCC 是一种并发控制的方法,主要用于数据库管理系统,允许多个事务同时读取数据库中的同一个数据项,而不需要加锁,从而提高了数据库的并发性能。 ┌──────────────────…...