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

单片机--中断实验

一、处理器的处理模式:

举例:

cortex-M核的工作模式:
异常模式、线程模式

cortex-A核的工作模式

        ARM-V7架构设计的A核的工作模式:

        非特权模式:user模式

        特权模式:
非异常模式:sys模式
异常模式:IRQ(普通异常中断模式)、FIQ(快速中断异常模式)、SVC(超级管理异常模式)、ABT(终止访问模式)、UDF(未定义模式)

        

        ARM-V8架构设计的A核的工作模式:MON(安全监管模式)HYP(虚拟化技术模式)

二、异常处理流程

1、基本思路:

1、按下key1,打断while中的逻辑(while(1){执行获取空气温度湿度数值并打印在串口工具上})

2、cpu自动保存现场

3、key1对应的函数(如果按下按键,LED1点亮;如果按键抬起,LED1熄灭)

4、程序员手动恢复现场

2、异常源

异常源是指触发处理器执行异常事件对应的处理逻辑的集合

异常源下支持很多异常事件

异常模式

异常源

异常源下的异常事件举例

IRQ模式

一系列触发处理器进入IRQ模式的异常源

普通按键中断、硬件定时器中断....

FIQ模式

一系列触发处理器进入FIQ模式的异常源

内核中产生的中断、高优先级的中断.....

SVC模式

复位异常源

上电复位、按键复位

软中断异常源

swi执行软中断指令

ABT模式

数据中止访问异常源

非法访问/使用没有权限的数据

指令中止访问异常源

汇编指令格式错误、汇编指令访问的空间没有权限

UDF模式

未定义异常源

指令/变量未定义过

1、5种异常模式应对了7种异常源

2、每种异常模式下存在很多异常事件(异常源就是很多异常事件的集合)

3、SVC模式下复位异常源的优先级等级最高,处理器优先处理

2/1自动保存现场(CPU自动完成)

自动保存现场需要做4件事(4大步3小步):

1、将CPSR寄存器中的值保存到SPSR_<MODE>寄存器中

2、修改CPSR寄存器中的位:

        2.1修改CPSR的I位/F位(作用:选择是否屏蔽IRQ模式/FIQ模式)

        2.2修改CPSR的T位(作用:选择是否使用ARM汇编指令集/Thumb汇编指令集)

        2.3修改CPSR的M位(作用:进入到对应的异常模式下)

3、将函数返回地址保存到LR寄存器中

4、PC会指向异常向量表

2/2手动恢复现场(程序员手动完成)

将SPSR_<MODE>寄存器中的值恢复给CPSR寄存器。

将LR寄存器中的值赋给PC寄存器

2/3异常向量表

异常向量表:就是异常源的集合

当产生异常事件后,处理器会检测属于哪个异常源,异常源有各自的内存空间地址,由处理器寻址查找。

异常向量表占32个字节的内存空间,每种异常源分配4个字节的空间,还有4个字节空间作为保留。

引入异常向量表的原因:

由于异常触发后,最终需要执行异常处理函数;

函数,当开发板/系统上电复位后,函数的地址、参数的地址、变量的地址可能会发生改变;

cpu 无法知道变化后的地址;

需要固定一片内存空间地址,用于引导CPU找到最后的异常处理函数;

ARM 公司开发并生产内核,固定一片32个字节的地址空间,专门用于存放各个异常源的地址,即异常向量表

2/4 基本思路

1、按键中断触发   main函数(while(1){执行获取空气温度湿度数值并打印在串口工具上})

2、自动保护现场(异常向量表)
3、IRQ异常源对应的异常函数(按键/定时器/ 串口 中断异常处理函数接口)
4、接口对应的按键中断异常处理函数

2/5汇编代码模拟异常处理流程

.text        .global _start        _start:            @ 构建异常向量表b reset_handlerb undefined_handlerb swi_handlerb prefetch_handlerb data_handlerb .    @ 占4个字节空间操作b irq_handlerb fiq_handlerreset_handler:@ 为SVC模式下的SP寄存器给定一个内存空间地址ldr sp, =0x40000820@ 从SVC模式切换到User模式下,执行用户代码msr cpsr, #0xD0@ 用户代码,以下相当于main函数mov r0, #0x1mov r1, #0x2@ 软中断异常事件触发@ swi 2这条汇编指令执行完毕后,需要看到的效果@ 1、CPSR寄存器中的值是否被保存到SPSR寄存器中@ 2、CPSR寄存器中的值是否被改变(IFTM位)@ 3、LR寄存器中是否保存函数的返回地址@ 4、PC是否指向异常向量表中软中断异常源的地址swi 2add r2, r1, r0undefined_handler:swi_handler:@ 压栈保存现场,保存局部变量和函数返回地址stmfd sp!, {r0-r1, lr}@ 软中断异常源下第一个异常事件的处理函数mov r0, #0xffmov r1, #0xeeadd r2, r1, r0@ 出栈恢复现场,恢复局部变量和函数返回地址@ 还需要恢复SPSR寄存器中的值给到CPSR寄存器@ ^的作用:用于将SPSR寄存器中的值赋值给CPSR寄存器ldmfd sp!, {r0-r1, pc}^prefetch_handler:data_handler:irq_handler:fiq_handler:stop:            b stop        
.end        

当CPU执行逻辑,跳转到异常向量表。

CPU仅仅能识别异常向量表中,对应的异常源的固定地址,根据固定地址跳转。

三、分析按键电路图

key1-pc9

key2-pc8

key3-pc5

四、分析芯片手册

EXTI:外部中断和事件控制器

NVIC:嵌套向量中断控制器

嵌套:中断的嵌套,中断具备优先级等级,高优先级等级的中断信号可以打断低优先级的中断的信号。

向量:所有异常中断由异常向量表统一管理

使用cortex-M核(MCU),中断处理一般使用EXIT + NVIC 来实现

使用cortex-A核(MPU),中断处理一般使用EXTI +GIC(GICC+CPID) 来实现

了解

GIC(Generic Interrupt Controller,通用中断控制器)
GICC(Generic Interrupt Controller CPU Interface,通用中断控制器 CPU 接口):它是 GIC 架构中与 CPU 核直接交互的部分,负责将中断信号从 GIC 的分发器(GICD)传递到 CPU 核。
CPID(Component Part ID,组件部件 ID):它是 GIC(包括 GICC)内部的一个标识寄存器,用于标识硬件组件的版本和型号信息。
GICC 是 GIC 中连接 CPU 核的 "桥梁",而 CPID 是 GICC 硬件的 "身份标识",用于软件识别硬件版本。

4.1EXTI章节介绍

http://www.dtcms.com/a/391797.html

相关文章:

  • 嵌入式 - GPIO
  • 一款商用的基于SpringBoot+VUE的出货单智能比对系统
  • systemctl 在启动服务时的 常用参数
  • 【MySQL】SQL性能分析
  • 【软件测试Linux】详细Linux介绍和各种命令的场景应用
  • 【MySQL】使用C/C++链接mysql数据库
  • 【复现】【充换电站】考虑用户充电负荷-最优分时电价互动的光储充换电站优化模型
  • 多光谱相机按不同分类的几种类型
  • Linux中select、poll 和 epoll的作用
  • JavaScript原型链全面解析
  • mysql相关优化
  • electron-forge踩坑记录
  • 00-基于django+vue3+ts的前后端分离RBAC权限管理系统
  • Go语言-->切片
  • 《Java网络编程》第二章:Stream流
  • 速卖通“AI全站推”上新!跨境卖家如何利用 AI 做营销
  • Apple Developer Program注册被拒原因分析与技术性申诉指南
  • 卷积神经网络从入门到经典模型详解
  • C#超市商品管理系统入门级实现
  • 自注意力机制Self-Attention (二)
  • InternVLA-N1——规划-执行双系统下的VLN基础模型:具备学习型的潜在规划能力,可部署在轮式、四足、双足人形上
  • 睡眠PSG数据集技术
  • 【AI落地应用实战】利用亚马逊云科技 Step Functions 集成现有系统快速实现个性化邮件触达
  • 手机备忘录待办APP工具评测
  • 总线错误(Bus Error)是什么?
  • 《Java网络编程》第三章:Internet地址
  • 【软件项目验收:第三方软件测评报告合规性和有效性审核,辨别真假软件测评报告书】
  • 变邻域含变惯性权重策略的自适应离散粒子群算法
  • cocos通过碰撞collider进行道具获取 或者出发事件
  • 自动化测试可行性分析