单片机--中断实验
一、处理器的处理模式:
举例:
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 硬件的 "身份标识",用于软件识别硬件版本。