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

📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨

📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852

📢:文章若有幸对你有帮助,可点赞 👍 收藏 ⭐不迷路🙉

📢:内容若有错误,敬请留言 📝指正!原创文,转载注明出处

文章目录

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

c 复制代码
// 不可屏蔽中断(NMI)处理函数
void NMI_Handler(void)
{
    // 处理紧急且不能被屏蔽的事件,如硬件故障、电源故障等
    // 这里可以添加具体的错误处理代码,例如记录错误日志、触发报警等
    while (1)
    {
        // 可以添加一些调试信息,如点亮LED表示发生NMI
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);
    }
}

// 硬件错误(HardFault)处理函数
void HardFault_Handler(void)
{
    // 处理硬件错误,如非法指令、内存访问错误等
    // 可以添加错误诊断和恢复操作,例如记录错误状态、重启系统等
    while (1)
    {
        // 点亮另一个LED表示发生HardFault
        HAL_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指令触发,用于实现与操作系统内核之间的系统调用 可配置
相关推荐
lalapanda39 分钟前
UE学习记录part16
学习
@PHARAOH41 分钟前
WHAT - React 进一步学习推荐
前端·学习·react.js
kovlistudio43 分钟前
红宝书第四十讲:React 核心概念:组件化 & 虚拟 DOM 简单教程
开发语言·前端·javascript·学习·react.js·前端框架
螺旋小蜗44 分钟前
Maven工具学习使用(十二)——extension和depency的区别
学习·extension·depency
却道天凉_好个秋44 分钟前
音视频学习(三十四):H264中的宏块
学习·音视频·宏块
却道天凉_好个秋1 小时前
音视频学习(三十三):GOP详解
学习·音视频·gop
键盘敲没电1 小时前
【iOS】UIPageViewController学习
学习·ios·cocoa
cwtlw2 小时前
PhotoShop学习09
笔记·学习·其他·photoshop
一棵开花的树,枝芽无限靠近你2 小时前
【CodeMirror】系列(二)官网示例(六)自动补全、边栏
前端·笔记·学习·编辑器·codemirror
pumpkin845143 小时前
学习笔记四——Rust 函数通俗入门
笔记·学习·rust