目录

单片机-中断实验

单片机–中断实验

一、处理器的处理模式:

举例:

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、程序员手动恢复现场

https://i-blog.csdnimg.cn/direct/4974d48f79934dd1a8c80150f5359a6e.png

2、异常源

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

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

异常模式异常源异常源下的异常事件举例
IRQ模式一系列触发处理器进入IRQ模式的异常源普通按键中断、硬件定时器中断….
FIQ模式一系列触发处理器进入FIQ模式的异常源内核中产生的中断、高优先级的中断…..
SVC模式复位异常源上电复位、按键复位
软中断异常源swi执行软中断指令
ABT模式数据中止访问异常源非法访问/使用没有权限的数据
指令中止访问异常源汇编指令格式错误、汇编指令访问的空间没有权限
UDF模式未定义异常源指令/变量未定义过

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

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

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

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

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

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

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_寄存器中的值恢复给CPSR寄存器。

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

2/3异常向量表

https://i-blog.csdnimg.cn/direct/6f0bb0af34b04b179355740d1005abb8.png

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

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

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

引入异常向量表的原因:

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

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

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

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

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

2/4 基本思路

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

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

https://i-blog.csdnimg.cn/direct/bf3d76e67cf441b4a047d1b5196464af.png

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


.text        

.global _start        
    
    _start:            
        @ 构建异常向量表
        b reset_handler
        b undefined_handler
        b swi_handler
        b prefetch_handler
        b data_handler
        b .    @ 占4个字节空间操作
        b irq_handler
        b fiq_handler

reset_handler:
    @ 为SVC模式下的SP寄存器给定一个内存空间地址
    ldr sp, =0x40000820
    
    @ 从SVC模式切换到User模式下,执行用户代码
    msr cpsr, #0xD0
    
    @ 用户代码,以下相当于main函数
    mov r0, #0x1
    mov r1, #0x2
    
    @ 软中断异常事件触发
    @ swi 2这条汇编指令执行完毕后,需要看到的效果
    @ 1、CPSR寄存器中的值是否被保存到SPSR寄存器中
    @ 2、CPSR寄存器中的值是否被改变(IFTM位)
    @ 3、LR寄存器中是否保存函数的返回地址
    @ 4、PC是否指向异常向量表中软中断异常源的地址
    swi 2
    
    add r2, r1, r0
    

undefined_handler:

swi_handler:
    @ 压栈保存现场,保存局部变量和函数返回地址
    stmfd sp!, {r0-r1, lr}
    
    @ 软中断异常源下第一个异常事件的处理函数
    mov r0, #0xff
    mov r1, #0xee
    add r2, r1, r0
    
    @ 出栈恢复现场,恢复局部变量和函数返回地址
    @ 还需要恢复SPSR寄存器中的值给到CPSR寄存器
    @ ^的作用:用于将SPSR寄存器中的值赋值给CPSR寄存器
    ldmfd sp!, {r0-r1, pc}^
    
prefetch_handler:

data_handler:

irq_handler:

fiq_handler:
    
    
    stop:            
        
        b stop        
.end        
    

https://i-blog.csdnimg.cn/direct/aed16b6ae11f43f3a3e16010873959da.png

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

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

三、分析按键电路图

key1-pc9

key2-pc8

key3-pc5

https://i-blog.csdnimg.cn/direct/1059f5c5564a4c439357cab77c86ec19.png

https://i-blog.csdnimg.cn/direct/33229adc61684c459e4b062b68f134f5.png

四、分析芯片手册

https://i-blog.csdnimg.cn/direct/62311a6f92d84b72b9eb5737b7fec5fb.png

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章节介绍