cortex-A7中断实验 --- STM32MP157

news2024/11/15 19:58:21

实验目的

1,实现KEY1/LEY2/KE3三个按键,中断触发打印一句话

2,实现KEY1/LEY2/KE3三个按键按下之后,灯的状态取反

一,异常源和异常模式

1,异常源:异常源引发处理器进入对应的异常模式

2,异常模式 === 异常源 === 

FIQ                         FIQ类型异常源

IRQ                        IRQ类型异常源

SVC                       reset(复位异常源)

                                swi(软中断指令)

ABORT                    data abort(取数据中止)

                                prefetch abort(取指令中止)

UNDEF                UNDEF未定义异常源

3,五种异常模式,对应7中异常源,根据不同的异常源,进入不同的异常模式,执行异常处理函数,异常源具有优先级,复位的优先级最高

二,异常处理流程

1,异常向量表

1:概念:异常向量表就是内存的一块寻址空间,共32个字节,分为8份,存放7中异常源,一份保留,地址是固定的,不可以随意修改。通过指定异常向量表的基地址和偏移地址,就可以找到相应的异常源,执行异常处理程序

2:为什么引入异常向量表:每个人编写的程序入口(函数名)不一致,但是可以通过地址指定异常处理异常程序的入口一致

 2,保存现场 (自动完成)

分为4大步,3小步:

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

2,修改CPSR寄存器的值

        1>修改CPSR寄存器中的T位(状态位),T=0,当前的状态为arm状态,指向arm指令集

        2>根据需要,禁止相应的 I / F中断位

        3>修改CPSR寄存器中第 [4:0] 位,为对应异常模式

3,保存函数的返回地址到LR寄存器中

4,修改PC指向异常向量表

3,恢复现场(手动完成)

分为两步

1,将LR寄存器中的值,恢复给PC

2,将SPER_<MODE>寄存器中的值,恢复给CPSR寄存器

4,软中断指令

指令码:SWI

指令格式:SWI 终端号(0 ~ 0xFFFFFF)

验证流程实例代码:

.text
.global _start
_start:
    @1.构建异常向量表
    b reset
    b undef_interrupt
    b software_interrupt
    b prefetch_dataabort
    b data_abort
    b .
    b irq
    b fiq

reset:
    @2.系统一上电,程序运行在SVC模式
        @1> 初始化SVC模式下,栈指针
    ldr sp,=0x40000800
    @3.从SVC模式切换到user模式
    msr cpsr,#0xD0
    @4.user模式下代码
        @1> 初始化user模式下,栈指针
    ldr sp,=0x40000700
    mov r0,#0x1
    mov r1,#0x2
    @4.执行软中断指令 ===> 保存现场(四大步三小步)
    swi 2
    add r0,r0,r1 @ r0 = 0x3
    b stop
    
    
undef_interrupt:
software_interrupt:
    @压栈保存现场    
    stmfd sp!,{r0-r12,lr}
    mov r0,#0x3
    mov r1,#0x4
    add r0,r0,r1 @ r0 = 0x7
    @出栈恢复现场    
    ldmfd sp!,{r0-r12,pc}^
    @^:将SPSR_<MODE>寄存器中的值,给到CPSR寄存器中
    
prefetch_dataabort:
data_abort:
irq:
fiq:
    
stop:
    b stop    
.end

三,分析电路图

中断触发方式:下降沿

网络编号 == 引脚号

KEY1 === PF9

KEY2 === PF7

KEY3 === PF8

1,分析框图

1,根据框图,需要分析RCC / GPIO / EXTI / GIC章节

2:RCC:使能GPIOF组寄存器(EXTI / GIC不属于核外寄存器,不需要使能,上电自动运行)

3:GPIO:设置引脚为输入模式

4:EXTI:设置中断触发方式(下降沿触发)

5:GIC:检测哪一个按键按下

中断触发流程:RCC使能 == GPIOF输入 == EXTI设置触发方式 == GIC检测按键 == A7核接收到中断信号,执行中断处理函数

四,分析RCC章节

1,确定总线连接

GPIO:AHB4

2,基地址

GICC === 0xA0022000

GICD === 0xA0021000

GPIOF === 0x50007000

EXTI === 0x5000D000

3,分析寄存器

1,分析RCC_MP_AHB4ENSETR寄存器

作用:使能GPIOF组寄存器

地址:0x50000000 + 0xA28 = 0x50000A28

伪代码:RCC_MP_AHB4ENSETR [5] = 1

五,分析GPIO章节

1,分析GPIOx_MODER寄存器

作用:设置GPIO引脚模式为输入模式(输入,输出,复用,模拟)

地址:0x50007000 + 0x00 = 0x50007000

伪代码:GPIOF_MODER [19:18] = 10 === KEY1

GPIOF_MODER [17:16] = 10 === KEY2

GPIOF_MODER [15:14] = 10 === KEY3

六,分析EXTI章节

1,概述

 2,内部框图

3,中断框图

 

3,分析寄存器

1,EXTI_EXTICRn寄存器(n=1~4)

EXTI external interrupt selection register === 外部中断选择寄存器

作用:设置GPIO引脚信号与EXTI进行连接 === 将外部按键信号经过GPIO控制器,转发到EXTI控制器

伪代码:EXTI_EXTICR3[15:8] = 0x05 ----> 设置KEY1按键与EXTI9进行连接

EXTI_EXTICR2[31:24] = 0x05 ----> 设置KEY2按键与EXTI7进行连接

EXTI_EXTICR3[7:0] = 0x05 ----> 设置KEY1按键与EXTI8进行连接

2,分析EXTI_FTSR1寄存器

作用:设置中断信号为下降沿触发方式

伪代码:EXTI_FTSR1[9] = 1 ----> 设置KEY1按键为下降沿触发方式

EXTI_FTSR1[7] = 1 ----> 设置KEY2按键为下降沿触发方式

EXTI_FTSR1[8] = 1 ----> 设置KEY3按键为下降沿触发方式

3,分析EXTI_IMR1寄存器

作用:设置中断不屏蔽 === EXTI层中断转发到GIC层

伪代码:EXTI_IMR1[9] = 1 ----> 设置KEY1按键中断不屏蔽

EXTI_IMR1[7] = 1 ----> 设置KEY2按键中断不屏蔽

EXTI_IMR1[8] = 1 ----> 设置KEY3按键中断不屏蔽

4,分析EXTI_FPR1寄存器

作用:清除EXTI层中断挂起标志位

rc_w1作用:读0:表示中断没有触发

读1:表示中断触发

写0:不清除EXTI层中断挂起标志位

写1:清除EXTI层中断挂起标志位

伪代码:EXTI_FPR1[9] = 1 ----> 清除key1按键EXTI层中断挂起标志位

EXTI_FPR1[7] = 1 ----> 清除key2按键EXTI层中断挂起标志位

EXTI_FPR11[8] = 1 ----> 清除key3按键EXTI层中断挂起标志位

七,分析GICD章节

1,中断号管理

SGI:Software generated interrupts ==> 软件产生中断(软中断)

PPI:Private peripheral interrupts ==> 私有外设中断

SPI:Shared peripheral interrupts ==> 共享外设中断

1,GIC层共有288个中断号(0 ~ 287)

2,16个PPIS(ID:16 ~ 31),16个SGIS(ID:0 ~ 15),256个SPIS(ID:32 ~ 287)

按键中断号: 97 === EXTI7

98 === EXTI8

99 === EXTI9

2,分析寄存器

1,GICD_CTLR寄存器

作用:设置GICD组0使能

伪代码:GICD_CTLR [0] = 1

2,分析GICD_ISENABLERx寄存器

作用:设置GICD层中断使能

伪代码:EXTI9 ----> 中断号99 ----> GICD_ISENABLER3[3] = 1

EXTI7 ----> 中断号97 ----> GICD_ISENABLER3[1] = 1

EXTI8 ----> 中断号98 ----> GICD_ISENABLER3[2] = 1

3,分析GICD_IPRIORITYRx寄存器

作用:设置GICD层中断优先级寄存器,GICD层优先级需要比GICC层优先级高,才能转发到GICC层(值的范围 0 ~ 2^5 -1,数字越小,优先级越高)

伪代码:中断号99 ---->GICD_IPRIORITYR24[31:27] = 0b00000

中断号97 ---->GICD_IPRIORITYR24[15:11] = 0b00000

中断号98 ---->GICD_IPRIORITYR24[23:19] = 0b00000 (值自定义)

4,GICD_ITARGETSRx寄存器

作用:设置GICD层中断目标分配给CPU0

0b00---不分配

0b01---分配给CPU0

0b10---分配给CPU1

0b11---分配给CPU0 和 CPU1

伪代码:GICD_ITARGETSR24[25:24] = 0b01

GICD_ITARGETSR24[9:8] = 0b01

GICD_ITARGETSR24[17:16] = 0b01

5,分析GICD_ICPENDRx寄存器

作用:清除GICD层中断挂起标志位

挂起:暂时被淘汰出内存

伪代码:中断号99 ----> GICD_ICPENDR3[3] = 1 ----> 清除key1按键GICD层中断挂起标志位

中断号97 -----> GICD_ICPENDR3[1] = 1 ----> 清除key2按键GICD层中断挂起标志位

中断号98  ----> GICD_ICPENDR3[2] = 1 ----> 清除key3按键GICD层中断挂起标志位

八,分析GICC章节

1,分析GICC_CTLR寄存器

作用:设置GICC层组0使能

伪代码:GICC_CTLR [0] = 1

2,分析GICC_PMR寄存器

作用:设置GICC层的优先级

伪代码:GICC_PMR [7:3] = 0b11111(自定义)

3,分析GICC_IAR寄存器

作用:获取中断号

伪代码: num = GICC_IAR

4,分析GICC_EOIR寄存器

作用:清除获取到的中断号

        GICC_EOIR = num

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/934349.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Springboot profile多环境配置

1. 前言 profile用于多环境的激活和配置&#xff0c;用来切换生产&#xff0c;测试&#xff0c;本地等多套不通环境的配置。如果每次去更改配置就非常麻烦&#xff0c;profile就是用来切换多环境配置的。 2. 配置方法 三种方式。 2.1 多profile文件方式 在resource目录下新…

DIL Voterank

这也是一篇对于voterank的改编&#xff0c;属于改进算法&#xff0c;功能是识别复杂网络中的一系列最有影响的点。本篇论文主要在应用在无向&#xff0c;无权值的图。同时对于有向的或者有权值的图&#xff0c;我们可以使用WVoterank,或者Voterank Plus这在之前也实现过了&…

2.Redis 通用命令

Redis 中最核心的两个命令&#xff1a; set 作用&#xff1a;设置 key 对应的 value 值并存储进去。若key已包含一个值&#xff0c;则无论其类型如何&#xff0c;都会覆盖该值。在SET操作成功时&#xff0c;将丢弃与密钥相关联的任何先前生存时间。 对于上述这里的 key和val…

计算机竞赛 基于情感分析的网络舆情热点分析系统

文章目录 0 前言1 课题背景2 数据处理3 文本情感分析3.1 情感分析-词库搭建3.2 文本情感分析实现3.3 建立情感倾向性分析模型 4 数据可视化工具4.1 django框架介绍4.2 ECharts 5 Django使用echarts进行可视化展示5.1 修改setting.py连接mysql数据库5.2 导入数据5.3 使用echarts…

代码浏览器和分析器:Source Insight 4.0 Crack

Source Insight 是一个强大的面向项目的编程编辑器、代码浏览器和分析器&#xff0c;可帮助您在工作和计划​​时理解代码。Source Insight 内置了针对 C/C、C#、Java、Objective-C 等的动态分析。 了解代码 快速学习现有代码库&#xff0c;并加快新项目的进度。通过查看函数和…

1688API技术解析,实现获得1688商品详情

要实现获得1688商品详情&#xff0c;你需要使用1688 API。1688 API是阿里巴巴旗下的开放平台&#xff0c;它提供了一套丰富的接口&#xff0c;可以让开发者通过编程的方式获取到1688网站上的商品信息。 首先&#xff0c;你需要在阿里开放平台注册一个账号&#xff0c;并创建一…

R语言绘图相关函数(含实例)

目录 plot:可用于创建多种类型的图形 dev.new():新建画板 hist&#xff1a;绘制直方图 dotchart&#xff1a;绘制点图的函数 pie:绘制饼图 pair&#xff1a;绘制散点图矩阵 boxplot&#xff1a;绘制箱线图 scatterplot3D&#xff1a; 绘制三维散点图 par&#xff1a;修…

【UE5】虚幻5教程-如何解决场景远处植被没有阴影

没有阴影的远处植被 下面是解决的方法。 首先打开项目设置 项目设置 点击左侧的渲染 渲染 在框内输入“距离”&#xff0c;并选择生成距离场。 光源内添加“定向光源”&#xff0c;如果已有可以忽略。 点击“directional light"并在下方找到"距离场阴影&qu…

4G显存即可使用SDXL:离线、开源、免费#Fooocus初体验

Midjourney CEO | David Holz, 2019 &#xff1a; 用户可以忘记所有这些复杂的技术参数&#xff0c;只享受人与计算机之间的交互&#xff0c;“探索新的思维媒介&#xff0c;扩展人类的想象力” Fooocus 用开源和离线的方式挑战 Midjourney。Fooocus 是一款开源的图像生成项目…

Linux操作系统--网络配置(1)

1.网络连接测试 我们在linux操作系统上进行环境搭建的时候,配置网络信息是一个基本且必不可少的操作。那么下面我们来学习一下Linux中相关的网络操作。 (1).查看主机windows操作系统中的IP地址。使用指令ipconfig可以实现在windows操作系统中网络信息的查看,如下所示: (2)…

android系统启动流程之init启动分析

先根据上图来描述下安卓整个系统的启动流程&#xff1a; 当上电时&#xff0c;系统先执行BootRom, 加载引导程序执行。 然后进入bootloader&#xff0c;在安卓系统中基本上这个bootloader是uboot, 通过uboot引导启动内核&#xff0c;此时运行在kernel空间&#xff0c;这时的i…

探索数据的维度:多元线性回归在实际应用中的威力

文章目录 &#x1f340;引言&#x1f340;什么是多元线性回归&#xff1f;&#x1f340;多元线性回归的应用&#x1f340;构建多元线性回归模型的步骤&#x1f340;R-squared&#xff08;R平方&#xff09;&#x1f340;多元线性回归案例---波士顿房价 &#x1f340;引言 当谈…

开源软件与知识产权:需要注意什么?

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

【Kaggle】使用Kaggle快速下载GitHub等国外网站的文件|GitHub下载加速

痛点 很多时候直接从GitHub或者其他国外网站下载文件速度会很慢 所以这里就提供一个利用Kaggle加速GitHub下载文件的方法 解决方法 Kaggle是什么&#xff1f; 感兴趣的可以看一下这个&#xff0c;不看也不影响 怎么做 首先登录kaggle&#xff0c;新建一个notebook 复制下…

软件工程(十三) 设计模式之结构型设计模式(一)

前面我们记录了创建型设计模式,知道了通过各种模式去创建和管理我们的对象。但是除了对象的创建,我们还有一些结构型的模式。 1、适配器模式(Adapter) 简要说明 将一个类的接口转换为用户希望得到的另一个接口。它使原本不相同的接口得以协同工作。 速记关键字 转换接…

【Go 基础篇】Go语言中的自定义错误处理

错误是程序开发过程中不可避免的一部分&#xff0c;而Go语言以其简洁和高效的特性闻名。在Go中&#xff0c;自定义错误&#xff08;Custom Errors&#xff09;是一种强大的方式&#xff0c;可以为特定应用场景创建清晰的错误类型&#xff0c;以便更好地处理和调试问题。本文将详…

ModaHub魔搭社区:WinPlan经营大脑管理中心

角色权限 展示设置的角色,及对应的成员及权限点。角色、成员、权限点可自由配置;管理员的角色不可删除、权限点默认全部不可更改。 WinPlan决策系统 算力 阿里云 腾讯云 AWS亚马逊 框架 业务数据基座 WinPlan垂直大模型 模型 分

必抓!程序员必备的关键算法:探索编程世界的珍宝

嗨&#xff0c;亲爱的编程同道们&#xff01;在这个码农的世界里&#xff0c;算法就像我们的剑与盾&#xff0c;为我们打开问题的大门。不论你是新手刚踏入编程领域&#xff0c;还是老手早已颇有心得&#xff0c;总有那几种算法是我们绝对不能错过的&#xff0c;它们是你编程路…

华为手机实用功能介绍

一、内置app介绍 分四块介绍&#xff0c;包括出门款、规划款、工作款和生活款。 出门款&#xff1a;红色框框部分&#xff0c;照镜子化妆/看天气 规划款&#xff1a;黄色框框部分&#xff0c;日程表/计划表/番茄时间/计时 工作款&#xff1a;蓝色框框部分&#xff0c;便笺/录…

R语言响应面(RSM)、线性模型lm分析生产过程影响因素可视化

全文链接&#xff1a;https://tecdat.cn/?p33499 响应面&#xff08;Response Surface Methodology&#xff0c;RSM&#xff09;分析是一种常用的统计方法&#xff0c;用于研究和优化生产过程中的影响因素。通过建立数学模型来描述因素与响应之间的关系&#xff0c;RSM可以帮助…