-
2021-06-09 18:24:20
1、定时器控制寄存器(TCON)
TCON(88H) 地址 8FH 8EH 8DH 8CH 8BH 8AH 89H 88H 符号 TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 - TF1:定时器/计时器T1的溢出中断请求标志位。当计数器T1最高位产生溢出时,由硬件使TF1置1,并向CPU发出中断请求。CPU响应中断时,硬件将自动对TF1清0。
- TF0:定时器/计时器T0的溢出中断请求标志位。
- TR1:定时器1的运行控制位。TR1=1,启动定时器1;TR1=0,关闭定时器1。
- TR0:定时器0的运行控制位。
- IE1:外部中断1的中断请求标志。当检测当外部中断引脚1上存在有效的中断请求信号时,由硬件将IE1置1.当CPU响应中断请求时,由硬件使IE1清0。
- IE0:外部中断0的中断请求标志。
- IT1:外部中断1的中断触发方式控制位。IT1=1时,外部中断1为边缘触发方式,下降沿有效;IT1=0时,外部中断1为电平触发方式,低电平有效。
- IT0:外部中断0的中断触发方式控制位。
2、串行口控制寄存器(SCON)
SCON(98H) 地址 9FH 9EH 9DH 9CH 9BH 9AH 99H 98H 符号 TI RI - TI:串行口发送中断请求标志。CPU将一个数据写入发送缓冲器SBUF时,就启动发送。发送完一帧串行数据后,硬件置位TI。CPU相应中断时,不会自动清除TI,需在中断服务子程序由软件清零。
- RI:串行口接收中断请求标志。在串行口允许接收时,每接收完一个才行帧,硬件置位RI。CPU响应中断时不会自动清除RI,需软件清零。
3、中断允许寄存器(IE)
IE(0A8H) 地址 0AFH 0AEH 0ADH 0ACH 0ABH 0AAH 0A9H 0A8H 符号 EA 保留 ET2 ES ET1 EX1 ET0 EX0 - EA:中断允许总控制位。EA=1,启用所有中断;EA=0,屏蔽所有中断。
- ES:串行口中断允许位。ES=1,允许串行口中断;ES=0,禁止串行口中断。
- EX1:外部中断1中断允许位。EX1=1,允许外部中断1中断;EX1=0,禁止外部中断1中断。
- EX0:外部中断0中断允许位。EX0=1,允许外部中断0中断;EX0=0,禁止外部中断0中断。
- ET2:定时器/计数器T2的溢出中断允许位。ET2=1,允许T2中断;ET2=0,禁止T2中断。
- ET1:定时器/计数器T1的溢出中断允许位。
- ET0:定时器/计数器T0的溢出中断允许位。
4、中断优先级寄存器(IP)
80C51有两个中断优先级,即高优先级和低优先级。中断优先级寄存器IP中有各个中断的优先级控制位,控制位为1,相应的中断源则为高级中断,控制位为0,相应的中断源则为低级中断。IP的格式如下:
IP(0B8H) 地址 0BFH 0BEH 0BDH 0BCH 0BBH 0BAH 0B9H 0B8H 符号 保留 保留 PT2 PS PT1 PX1 PT0 PX0 PT2、PS、PT1、PX1、PT0、PX0分别是定时器/计时器2、串行口中断、定时器/计时器1、外部中断1、定时器/计时器0、外部中断0的优先级控制位。在同一优先级的中断请求遵循自然优先级。
中断源 中断源 中断标志 自然优先级 入口地址 外部中断0 IE0 最高 0003H 定时器/计时器0 TF0 第2 000BH 外部中断1 IE1 第3 0013H 定时器/计时器1 TF1 第4 001BH 串行口中断 RI或TI 第5 0023H 定时器/计时器2 TF2或EXF2 最低 002BH 更多相关内容 -
STMDMA中断状态寄存器PPT教案.pptx
2021-10-01 08:17:48STMDMA中断状态寄存器PPT教案.pptx -
zynq中断寄存器操作
2020-08-12 23:20:18zynq中断寄存器操作 概述: 1. Zynq的中断类型有: 软件中断(Software Generated Interrupt, SGI,中断号0-15)(16–26 reserved) 私有外设中断(Private Peripheral Interrupt, PPI,中断号27-31), 共享外设...zynq中断寄存器操作
概述:
1. Zynq的中断类型有:
软件中断(Software Generated Interrupt, SGI,中断号0-15)(16–26 reserved)
私有外设中断(Private Peripheral Interrupt, PPI,中断号27-31),
共享外设中断(Shared Peripheral Interrupt, SPI,中断号32-95).
2. 私有外设中断(PPI):每个CPU都有一组PPI,包括全局定时器、私有看门狗定时器、私有定时器和来自PL的FIQ/IRQ.
3. 软件中断(SGI)被路由到一个或者两个CPU上,通过写ICDSGIR寄存器产生SGI.
4. 共享外设中断(SPI)由PS和PL上的各种I/O控制器和存储器控制器产生,这些中断信号被路由的CPU.
5. 通用中断控制器(GIC)是核心资源,用于集中管理从PS和PL产生的中断信号的资源集合。控制器可以使能、关使能、屏蔽中断源和改变中断源的优先级,并且会将中断送到对应的CPU中,CPU通过私有总线访问这些寄存器。
6. 中断控制器(ICC,Interrupt Controller CPU)和中断控制器分配器(ICD, Interrupt Controller Distributor)是GIC寄存器子集。
7. (外部)中断请求(IRQ)、快速中断请求(FIQ)中断原理
当异常中断发生时,系统执行完当前指令后,将跳转到相应的异常中断处理处执行。当异常中断处理程序执行完成后,程序返回到发生中断指令的下一条指令处继续执行。在进入异常中断处理程序时,要保存被中断程序的执行线程。从中断处理程序退出时要恢复被中断程序的执行现场。中断寄存器概述
1. 中断分配器(ICD寄存器):
1) ICDDCR: (0xF8F01000) ICD分配控制寄存器,控制开启或者关闭中断配置。
2) ICDICFR: ICD配置寄存器。配置中断触发模式(高低电平),共6个寄存器,分别是ICDICFR 0-ICDICFR5(0xF8F01C00-0xF8F01C14),每个寄存器32位,占4个字节,每个寄存器的位意义不一样,每2位代表一个中断,32位x6/2=96,正好包括所有中断,
3) ICDIPR:(0xF8F01400-0xF8F0145C)ICD中断优先级寄存器,共24个寄存器,ICDIPR 0- ICDIPR 23,每个寄存器32位,占4个字节,每8位代表一个中断,32位x24/8=96,正好包括所有中断。
4) ICDIPTR: (0xF8F01800-0xF8F0185C)ICD CPU接口选择寄存器,配置CPU接口选择(cpu0/cpu1),包括24个寄存器,ICDIPTR 0- ICDIPTR 23,每个寄存器32位,占4个字节,每8位代表一个中断,32位x24/8=96,正好包括所有中断。
**5) ICDICER: 中断不使能寄存器,**3个寄存器,ICDICER 0- ICDICER 2(0xF8F01180-0xF8F01888),每个寄存器32位,占4个字节,每位代表一个中断,32位x3=96,正好包括所有中断。写1表示不使能(屏蔽)。
**6) ICDISER: 中断使能寄存器,**3个寄存器,ICDISER 0- ICDISER 2(0xF8F01100-0xF8F01108),每个寄存器32位,占4个字节,每位代表一个中断,32位x3=96,正好包括所有中断。写1表示使能。
7) ICDICPR: 清除中断等待寄存器。3个寄存器,ICDICPR 0- ICDICPR 2(0xF8F01280-0xF8F01288),每个寄存器32位,占4个字节,每位代表一个中断,32位x3=96,正好包括所有中断。写1表示清除中断等待状态。寄存器 地址 中断号
ICDICFR0 0xF8F01C00 #0-#15
ICDICFR1 0xF8F01C04 #27-#31(16-26保留)
ICDICFR2 0xF8F01C08 #32-#47(36保留)
ICDICFR3 0xF8F01C0C #48-#63
ICDICFR4 0xF8F01C10 #64-#79
ICDICFR5 0xF8F01C14 #80-#95(93/94/95保留)2. 中断控制器(ICC寄存器):
1) ICCPMR: (0xF8F00104)中断优先级屏蔽寄存器,设置CPU的中断优先级。(与ICD的中断优先级比较。比写到这个寄存器的优先级值大的,cpu可以处理) Xil_Out32(0xF8F00104,0xF0);设置cpu的中断优先级为F0。
2) ICCICR:(0xF8F00100)ICC CPU接口配置寄存器,配置CPU接口。使能某个中断,比如IRQ:Write_Reg(0xF8F00100,0x07)即使处理器能接收IRQ,使能中断信号连接到处理器。
GPIO中断源配置所有GPIO共享一个中断(#52,bank1),必须在软件上检查INT_MASK和INT_STAT的值判断是哪个GPIO引发了中断。
1. INT_MASK(0xE000A20C):中断屏蔽寄存器,只读,读取该寄存器的值可以显示哪些位被屏蔽和没有屏蔽(即使能)。
2. INT_ENT(0xE000A210–): 中断使能寄存器(4个bank,4个寄存器)。写1,对应的引脚中断功能开启,即使能。
3. INT_DIS(0xE000A214—):屏蔽寄存器(4个bank,4个寄存器)。写1,对应的引脚中断屏蔽。
4. INT_STAT(0xE000A18–):中断状态寄存器(4个bank,4个寄存器)。每一位代表对应的引脚上是否发生中断事件,中断发生时,该引脚的中断标志位为1。如果对该位写1,清除该引脚的中断标志,写0无操作。
5. INT_TYPE(0xE000A21C–):中断类型寄存器(4个bank,4个寄存器)。写1代表边沿触发中断,写0代表电平触发中断。
6. INT_POLARITY(0xE000A220–): 中断极性寄存器,控制中断的触发条件(4个bank,4个寄存器)。写1代表高电平或者上升沿触发,写0代表低电平或者下降沿触发。
7. INT_ANY(0xE000A224–): 中断边沿触发类型设置寄存器(4个bank,4个寄存器)。写1代表上升沿和下降沿同时触发,写0代表单边沿触发中断,只在INT_TYPE设置为边沿触发中断(写1)时有效。中断处理过程
为了使得上层应用程序与硬件中断跳转联系起来,需要编写一段中间的服务程序来进行连接,这样的服务程序被称为中断解析程序。 中断的流程(不包括寄存器的初始化和设置)
1. 定义中断向量表
//定义中断向量表结构体,Handler为函数,Data为函数Handler的参数
typedef struct {
Xil_ExceptionHandler Handler;
void *Data;
} XExc_VectorTableEntry;
2. //声明中断向量表
extern XExc_VectorTableEntry XExc_VectorTable[];
3. //安装中断处理函数 (中断解析程序)
XExc_VectorTable[5].Handler =(Xil_ExceptionHandler)InterruptHandler_IRQ;
XExc_VectorTable[5].Data = NULL;
4. //IRQ中断处理函数
void InterruptHandler_IRQ(void); 中断初始化及配置
1. ICD寄存器组(中断分配器)的初始化,共计7个。void Int_Init(void);
2. ICC寄存器组(中断控制器)的初始化并设置,共计2个,void CPU_Init(void);
3. 中断号(比如UART1 82号,GPIO#52)各个寄存器的初始化.
4. 打开IRQ总异常。Xil_ExceptionEnable(); 中断初始化及配置注意事项:
1. 初始化顺序,包括屏蔽、使能、清中断标志位等,尤其屏蔽和使能保持一致。
2. 电平触发、边沿触发要配置一致
3. 中断处理函数中,可以加个延时,防止电平和边沿的抖动,多次触发。
4. 中断处理函数中,注意清除相应中断的标志位,为下次中断做准备。
5. 打开IRQ中断的位置,最好在所有中断初始化完成后,防止开机中断。代码:=======================================================================================
#include <stdio.h>
#include <string.h>
#include "vectors.h"
#include "xil_exception.h"
#include "xil_io.h"//MIO Register
#define DIRM_1 0xE000A244
#define INT_EN_1 0xE000A250
#define INT_DIS_1 0xE000A254
#define INT_STAT_1 0xE000A258//READ:1-int has occurred WRITE:1-clear int status bit
#define INT_TYPE_1 0xE000A25C
#define INT_POLARITY_1 0xE000A260
#define INT_ANY_1 0xE000A264
//ICC
#define ICCICR 0xF8F00100//CPU Interface Control Register 配置CPU接口
#define ICCPMR 0xF8F00104//Interrupt priority mask Register 配置CPU中断优先级
//ICD
#define ICDDCR 0xF8F01000//Distributor Control Register 控制开启或关闭中断配置
#define ICDISER1 0xF8F01104//Interrupt Set-enable Register 使能ICD中断寄存器
#define ICDICER1 0xF8F01184//Interrupt clear-enable Register 不使能ICD中断寄存器
#define ICDIPR13 0xf8f01434//Interrupt priority Register ICD中断优先级
#define ICDIPTR13 0xF8F01834//Interrupt Processor Targets Register 配置CPU接口选择
#define ICDICFR3 0xF8F01C0C//Interrupt Configuration Register 配置ICD中断触发模式
#define ICDICPR1 0xf8f01284//Interrupt clear-pending Register 清除中断寄存器#define SPI_STATUS_0 0xF8F01D04//SPI Status Register 0
#define ICCIAR 0xF8F0010C//Interrupt Acknowledge Register
#define ICCEOIR 0xF8F00110//End Of Interrupt Register cpu结束响应,中断状态由active->inactive//定义中断向量表结构体,Handler为函数,Data为函数Handler的参数
typedef struct {
Xil_ExceptionHandler Handler;
void *Data;
} XExc_VectorTableEntry;
//申明中断向量表
extern XExc_VectorTableEntry XExc_VectorTable[];
void InterruptHandler_IRQ(void); //IRQ中断处理函数
void Int_Init(void); //GIC中断初始化, ICD寄存器组
void Gpio_Init(void);
void CPU_Init(void);
int main(void)
{XExc_VectorTable[5].Handler =(Xil_ExceptionHandler)InterruptHandler_IRQ;
XExc_VectorTable[5].Data = NULL;//initialize
Int_Init();
CPU_Init();
Gpio_Init();
xil_printf("begin\r\n");
Xil_ExceptionEnable();//这句放在这里,避免开机中断
while(1);
return 0;
}
void InterruptHandler_IRQ(void)
{
u32 i;
u32 IntID;
u32 IntIDFull;
xil_printf("come in 1\r\n");
for (i = 0; i < 50000000; ++i) {}//延时防抖动
//获取目前发生的中断号(#52)
IntIDFull = Xil_In32(ICCIAR);
IntID = IntIDFull & 0x3FF;
Xil_Out32(ICDICPR1, 0xFFFFFFFF);//ICD 中断清标志位
if(52 == IntID)
{
Xil_Out32(INT_DIS_1, 0x3FFFFF);//GPIO中断屏蔽
Xil_Out32(INT_STAT_1, 0x3FFFFF);//GPIO清除标志位xil_printf("come in 2\r\n");
Xil_Out32(INT_EN_1, 0x40000);//GPIO中断使能
}
Xil_Out32(ICCEOIR, IntIDFull);//cpu结束响应,中断 状态由active->inactive
}
//对#52号中断
void Int_Init(void)
{
Xil_Out32(ICDDCR, 0UL);//关闭中断配置
Xil_Out32(ICDICER1, 0x100000);//不使能 #52
// Xil_Out32(ICDICFR3, 0x100);//电平触发
Xil_Out32(ICDICFR3, 0x300);//边沿触发
Xil_Out32(ICDIPR13, 0xA0);//优先级A0
Xil_Out32(ICDIPTR13, 0x01);//处理器为CPU0
Xil_Out32(ICDICPR1, 0xFFFFFFFF);//ICD 所有中断清标志位
Xil_Out32(ICDISER1, 0x100000);//使能 #52
Xil_Out32(ICDDCR, 0x01);//中断分配器更新状态
}//GPIO MIO_50 MIO50(0x40000) 中断#52(0x100000)
void Gpio_Init(void)
{
// Xil_Out32(DIRM_1, 0x40000);//output modem 没影响
Xil_Out32(INT_DIS_1, 0x3FFFFF);//中断屏蔽 [21:0]// Xil_Out32(INT_TYPE_1, 0x000000);//电平触发
// Xil_Out32(INT_POLARITY_1, 0x3FFFFF);//高电平Xil_Out32(INT_TYPE_1, 0x3FFFFF);//边沿触发
Xil_Out32(INT_POLARITY_1, 0x3FFFFF);//上升沿
Xil_Out32(INT_ANY_1, 0x0);//单边沿Xil_Out32(INT_STAT_1, 0x3FFFFF);//GPIO清除标志位
Xil_Out32(INT_EN_1, 0x40000);//中断使能
}
void CPU_Init(void)
{
//中断优先级都是A0,优先级高于F0,CPU可接受这些中断
Xil_Out32(ICCPMR,0xF0);
//处理器能接收IRQ,使能中断信号连接到处理器
Xil_Out32(ICCICR,0x07);
}
注: XExc_VectorTable向量表中的注册向量为IRQ中断,CPU处理GPIO中断的都是IRQ中断,即XIL_EXCEPTION_ID_IRQ_INT
所以这里XExc_VectorTable[5]中的向量表标号为5;
-
嵌入式系统/ARM技术中的ARM程序状态寄存器
2020-11-13 04:19:29ARM体系结构包含1个当前程序状态寄存器(CPSR)和5个各份的程序状态寄存器(SPSRs)。使用MSR和MRS指令来设置和读取这些寄存器。 当前程序状态寄存器(CPSR),持有关于当前处理器状态的信息。其他5个各份的程序... -
【嵌入式开发】ARM 关闭中断 ( CPRS 中断控制位 | 中断使能寄存器 | 中断屏蔽寄存器 | 关闭中断 | 汇编代码...
2018-05-13 22:52:172. CPRS 寄存器中的中断控制位 (1) CPRS 寄存器位 3. (1) CPRS 寄存器位 一. 中断控制 ( 基于 S3C6410 开发板 ) 本节 基于 S3C 6410 开发板, 不同的开发板 以及 不同 的芯片 中断控制机制是.....本博客的参考文章及相关资料下载 :
- 1.本博客代码及参考手册下载 : https://download.csdn.net/download/han1202012/10412045
一. 中断控制 ( 基于 S3C6410 开发板 )
本节 基于 S3C 6410 开发板, 不同的开发板 以及 不同 的芯片 中断控制机制是不同的 ;
1. 关闭中断的两个步骤
(1) 关闭中断步骤
关闭中断步骤 :
- 1.步骤 1 ( 程序状态字寄存器设置 ) : 设置 程序状态字寄存器 ( CPSR ) 中对应的与 中断 相关的位;
- 2.步骤 2 ( 中断屏蔽寄存器设置 ) : 设置 中断屏蔽寄存器, 该寄存器的 使用方法在开发板芯片资料中有详细介绍;
2. CPRS 寄存器中的中断控制位
(1) CPRS 寄存器简介
程序状态字寄存器 :
- 1.寄存器内容 : 该寄存器 中 包含 ① 状态码标志位, ② 中断标志位, ③ 当前处理器工作模式 和 其它一些 ④ 状态 与 ⑤ 控制信息 ;
- 2.CPSR 寄存器 : 全称 Current Program Status Register ( 当前程序状态字寄存器 ), 保存的是当前的程序状态 ;
- 3.SPSR 寄存器 : 全称 Saved Program Status Register ( 程序状态保存寄存器 ), 每个异常都有对应的独立的 SPSR 寄存器, 当异常发生的时候, 先将 CPSR 寄存器中的值 保存到 SPSR 寄存器中, 以便 异常处理完毕后 再回到原来断点处 继续运行 ;
- 4.SPSR 寄存器分布 : 用户模式 和 系统模式 没有 对应的 SPSR 寄存器, 只有 5 种 异常模式才有对应的 SPSR 寄存器 ;
- ( 1 ) SPSR 寄存器读写 : 在 用户模式 或 系统模式 读写 SPSR 指令 会出现不可预测的错误或行为 ;
(2) CPRS 寄存器 中断控制 相关 位
CPRS 寄存器中断控制相关位 :
- 1.普通中断控制位 : I 位, 第 [ 7 ] 位, 如果设置了该位 可以 关闭 普通中断 ;
- 2.快速中断控制位 : F 位, 第 [ 6 ] 位, 如果设置了该位, 可以 关闭 快速中断 ;
3. 中断使能寄存器
参考手册 : S3C6410X.pdf ( 基于 6410 开发板 )
- 1.手册对应章节 : 12.6.5 章节 VECTORED INTERRUPT CONTROLLERS;
- 2.S3C6410芯片手册下载地址 :https://download.csdn.net/download/han1202012/10412045
(1) 中断使能寄存器简介
中断使能寄存器 ( VICINTENABLE ) :
- 1.分为两个寄存器 : 中断使能寄存器 分 两个寄存器 控制所有的中断打开功能;
- ( 1 ) 寄存器1 VIC0INTENABLE : 其地址是 0x71200010 ;
- ( 2 ) 寄存器2 VIC1INTENABLE : 其地址是 0x71300010 ;
- 2.寄存器位 : 这两个寄存器中, 每一位都对应着一种中断源;
- 3.中断关闭情况 : 在 重启的时候, 所有的中断都要被禁用 ;
- 4.寄存器功能 : 激活中断的请求线路, 允许中断信号能到达 处理器 ; 查看对应位的设置, 可以获取某种类型的中断是否可以到达 处理器 ;
- ( 1 ) 读取到 0 值 : 如果读取到的值 为 0, 那么 中断不可用;
- ( 1 ) 读取到 1 值 : 如果读取到的值 为 1, 那么 中断可用;
- 5.设置寄存器值 : 这两个寄存器 只能设置中断可以使用, 无法设置 屏蔽 中断, 如果设置 1 那么激活中断, 设置 0 没有任何效果, 如果要屏蔽中断, 那么需要使用 中断屏蔽寄存器 VICINTENCLEAR;
- ( 1 ) 设置 0 值 : 设置 0 值 没有任何效果;
- ( 2 ) 设置 1 值 : 设置 1 值 激活中断功能;
(2) 中断屏蔽寄存器简介
中断屏蔽寄存器 ( VICINTENCLEAR ) 简介 :
- 1.分为两个寄存器 : 中断 屏蔽 寄存器 分 两个寄存器 控制所有的中断 屏蔽 的功能;
- ( 1 ) 寄存器1 VIC0INTENABLE : 其地址是 0x71200010 ;
- ( 2 ) 寄存器2 VIC1INTENABLE : 其地址是 0x71300010 ;
- 2.寄存器位 : 这两个寄存器中, 每一位都对应着一种中断源;
- 3.功能概述 : 清除 中断屏蔽寄存器 ( VICINTENABLE ) 中 对应的位就可以屏蔽对应的中断 ;
- ( 1 ) 设置 0 值 : 没有任何效果 ;
- ( 2 ) 设置 1 值 : 屏蔽对应的中断源 ;
二. 关闭中断 代码示例
参考手册 : S3C6410X.pdf ( 基于 6410 开发板 )
- 1.手册对应章节 : 12.6.5 章节 VECTORED INTERRUPT CONTROLLERS;
- 2.S3C6410芯片手册下载地址 :https://download.csdn.net/download/han1202012/10412045
1. 汇编代码编写
(1) 设置 CPRS 程序状态字寄存器
CPRS 设置 值 分析 : 该寄存器需要考虑两个方面, ① 设置处理器的 SVC 工作模式, ② 关闭中断 ;
- 1.SVC 模式设置 : SVC 模式需要将 CPRS 的 M [ 4 : 0 ] 位 设置为 指定的 0b10011 值;
- 2.普通中断设置 : 关闭 普通中断, 需要将 CPRS 的 I [ 7 ] 位 设置为 1;
- 3.快速中断设置 : 关闭 快速中断, 需要将 CPRS 的 F [ 6 ] 位 设置为 1;
- 4.最后向 CPRS 寄存器设置的值 : 最终值为 0b11010011, 其中 0 ~ 5 位 的 0b10011 设置的是 SVC 工作模式, 0b11000000 设置 I 和 F 位 为 1, 这样同时设置了 处理器的 SVC 工作模式 和 关闭了 普通中断 和 快速中断 ;
(2) 设置 CPRS 程序状态字寄存器 代码逻辑分析
代码 逻辑 分析 : 之前 设置 处理器工作模式时 有涉及到 CPRS 寄存器设置, 在这里将关闭中断的操作也一并设置了;
- 1.设置 CPRS 寄存器 时机 : 进行 处理器工作模式 设置 是在 开发板上电后, 对应的 reset 异常向量处;
- 2.设置 指令标号 : 设置一个指令标号, 在标号下定义一组汇编指令, 当需要执行这一组指令的时候, 在跳转到该标号即可;
- ( 1 ) 定义标号 :
set_svc :
, 在标号下定义一组汇编指令;
- ( 1 ) 定义标号 :
- 3.导出 CPSR 寄存器值 : 使用 MRS 指令, 即
mrs r0 cpsr
将 CPSR 寄存器中的值导出到 R0 寄存器中; - 4.将 R0 中的 M 位 清 0 : 在 R0 中将从 CPSR 中导出的寄存器值 对应的 0 ~ 4 位 清0, 使用
bic r0, r0, #0x1f
, 将 R0 寄存器的值 与 #0x1f 进行 与操作, 即 后5 位都设置成0, 然后将 与 操作的结果保存到 R0 寄存器中 ; - 5.将 R0 中的 M 位 设置 模式代码 : 在下图中, svc 的模式代码时 0b10011 ( 二进制 ), 即 0x13 ( 十六进制 ), 同时关闭 普通中断 和 快速中断, 最终设置值为 0b11010011, 即 0xd3, 使用
orr r0, r0, #0xd3
语句设置, 将 R0 寄存器中的值 与 0x13 进行 或操作, 将 或操作的结果 存放到 R0 寄存器中;
- 6.将值写回 CPSR 寄存器 : 使用 MSR 指令
msr cpsr, r0
, 将处理完的 CPSR 寄存器值 设置给 CPSR 寄存器;
(3) 设置 中断屏蔽寄存器 代码逻辑分析
设置 中断屏蔽 寄存器 汇编代码分析 :
- 1.设置 中断屏蔽 寄存器 时机 : 进行 关闭中断 设置 是在 开发板上电后, 对应的 reset 异常向量处, 因此 在 reset 处 执行相关的 关闭 中断 的代码 ;
- 2.设置 指令标号 : 设置一个指令标号, 在标号下定义一组汇编指令, 当需要执行这一组指令的时候, 在跳转到该标号即可, 代码
disable_interrupt :
, 然后 在 reset 处, 跳转到 该标号处执行 ,bl disable_interrupt
; - 3.准备 所有位都是 1 数据 :
mvn r1, #0x0
, 将 0 按位取反 设置到 r1 通用寄存器中;
- ( 1 ) 取反指令 : MVN 指令, 语法
MVN{条件}{S} <dest>, <op 1>
, 将 操作数 1 的值先按位取反, 在将值设置到 dest 寄存器中 ; - ( 2 ) 指令说明 : dest 必须是寄存器, 操作数 1 ( op 1 ) 可以是 寄存器, 被移位的寄存器 或 立即数 ;
- ( 1 ) 取反指令 : MVN 指令, 语法
- 4.设置第一个 中断屏蔽 寄存器 : ① 先将 寄存器 地址装载到 通用寄存器中, 代码
ldr r0, =0x71200014
, ② 再将 全 1 的值设置到 寄存器中, 该寄存器的内存地址已经装载到了 R0 通用寄存器中, 代码str r1,[r0]
;
- ( 1 ) ldr 指令语法 :
LDR{条件} Rd, <地址>
, 将内存中的数据装载到 寄存器 中, Rd 必须是通用寄存器, - ( 2 ) str 指令语法 :
STR{条件} Rd, <地址>
, 将寄存器中的数据 装载 到内存中; 将 Rd 寄存器的内容 装载到地址中; - ( 3 ) ldr 指令注意点 : 区分
ldr r0, =0x71200014
和ldr r0, 0x71200014
, 前者是将 0x71200014 数值装载到寄存器中, 后者是将 0x71200014 地址中的内容装载到 r0 寄存器中 ;
- ( 1 ) ldr 指令语法 :
- 5.设置第二个 中断屏蔽寄存器 : ① 先将 寄存器 地址装载到 通用寄存器中, 代码
ldr r0, =0x71300014
, ② 再将 全 1 的值设置到 寄存器中, 该寄存器的内存地址已经装载到了 R0 通用寄存器中, 代码str r1,[r0]
;
- ( 1 ) ldr 指令语法 :
LDR{条件} Rd, <地址>
, 将内存中的数据装载到 寄存器 中, Rd 必须是通用寄存器, - ( 2 ) str 指令语法 :
STR{条件} Rd, <地址>
, 将寄存器中的数据 装载 到内存中; 将 Rd 寄存器的内容 装载到地址中; - ( 3 ) ldr 指令注意点 : 区分
ldr r0, =0x71200014
和ldr r0, 0x71200014
, 前者是将 0x71300014 数值装载到寄存器中, 后者是将 0x71300014 地址中的内容装载到 r0 寄存器中 ;
- ( 1 ) ldr 指令语法 :
(4) 完整汇编代码示例
汇编代码示例 : Bootloader 流程 : ① 初始化异常向量表 , ② 设置 svc 模式 , ③ 关闭看门狗, ④ 关闭中断 ;
@**************************** @File:start.S @ @BootLoader 初始化代码 @**************************** .text @ 宏 指明代码段 .global _start @ 伪指令声明全局开始符号 _start: @ 程序入口标志 b reset @ reset 复位异常 ldr pc, _undefined_instruction @ 未定义异常, 将 _undefined_instruction 值装载到 pc 指针中 ldr pc, _software_interrupt @ 软中断异常 ldr pc, _prefetch_abort @ 预取指令异常 ldr pc, _data_abort @ 数据读取异常 ldr pc, _not_used @ 占用 0x00000014 地址 ldr pc, _irq @ 普通中断异常 ldr pc, _fiq @ 软中断异常 _undefined_instruction: .word undefined_instruction @ _undefined_instruction 标号存放了一个值, 该值是 32 位地址 undefined_instruction, undefined_instruction 是一个地址 _software_interrupt: .word software_interrupt @ 软中断异常 _prefetch_abort: .word prefetch_abort @ 预取指令异常 处理 _data_abort: .word data_abort @ 数据读取异常 _not_used: .word not_used @ 空位处理 _irq: .word irq @ 普通中断处理 _fiq: .word fiq @ 快速中断处理 undefined_instruction: @ undefined_instruction 地址存放要执行的内容 nop software_interrupt: @ software_interrupt 地址存放要执行的内容 nop prefetch_abort: @ prefetch_abort 地址存放要执行的内容 nop data_abort: @ data_abort 地址存放要执行的内容 nop not_used: @ not_used 地址存放要执行的内容 nop irq: @ irq 地址存放要执行的内容 nop fiq: @ fiq 地址存放要执行的内容 nop reset: @ reset 地址存放要执行的内容 bl set_svc @ 跳转到 set_svc 标号处执行 bl disable_watchdog @ 跳转到 disable_watchdog 标号执行, 关闭看门狗 bl disable_interrupt @ 跳转到 disable_interrupt 标号执行, 关闭中断 set_svc: mrs r0, cpsr @ 将 CPSR 寄存器中的值 导出到 R0 寄存器中 bic r0, r0, #0x1f @ 将 R0 寄存器中的值 与 #0x1f 立即数 进行与操作, 并将结果保存到 R0 寄存器中, 实际是将寄存器的 0 ~ 4 位 置 0 orr r0, r0, #0xd3 @ 将 R0 寄存器中的值 与 #0xd3 立即数 进行或操作, 并将结果保存到 R0 寄存器中, 实际是设置 0 ~ 4 位 寄存器值 的处理器工作模式代码 msr cpsr, r0 @ 将 R0 寄存器中的值 保存到 CPSR 寄存器中 #define pWTCON 0x7e004000 @ 定义看门狗控制寄存器 地址 ( 6410开发板 ) disable_watchdog: ldr r0, =pWTCON @ 先将控制寄存器地址保存到通用寄存器中 mov r1, #0x0 @ 准备一个 0 值, 看门狗控制寄存器都设置为0 , 即看门狗也关闭了 str r1, [r0] @ 将 0 值 设置到 看门狗控制寄存器中 disable_interrupt: mvn r1,#0x0 @ 将 0x0 按位取反, 获取 全 1 的数据, 设置到 R1 寄存器中 ldr r0,=0x71200014 @ 设置第一个中断屏蔽寄存器, 先将 寄存器 地址装载到 通用寄存器 R0 中 str r1,[r0] @ 再将 全 1 的值设置到 寄存器中, 该寄存器的内存地址已经装载到了 R0 通用寄存器中 ldr r0,=0x71300014 @ 设置第二个中断屏蔽寄存器, 先将 寄存器 地址装载到 通用寄存器 R0 中 str r1,[r0] @ 再将 全 1 的值设置到 寄存器中, 该寄存器的内存地址已经装载到了 R0 通用寄存器中
2. 链接器脚本
gboot.lds 链接器脚本 代码解析 :
- 1.指明输出格式 ( 处理器架构 ) : 使用
OUTPUT_ARCH(架构名称)
指明输出格式, 即处理器的架构, 这里是 arm 架构的,OUTPUT_ARCH(arm)
; - 2.指明输出程序的入口 : 设置编译输出的程序入口位置, 语法为
ENTRY(入口位置)
, 在上面的 Start.S 中设置的程序入口是_start
, 代码为ENTRY(_start)
; - 3.设置代码段 : 使用
.text :
设置代码段; - 4.设置数据段 : 使用
.data :
设置数据段; - 5.设置 BSS 段 : 使用
.bss :
设置 BSS 段;
- ( 1 ) 记录 BSS 段的起始地址 :
bss_start = .;
; - ( 2 ) 记录 BSS 段的结束地址 :
bss_end = .;
;
- ( 1 ) 记录 BSS 段的起始地址 :
- 6.对齐 : 每个段都需要设置内存的对齐格式, 使用
. = ALIGN(4);
设置四字节对齐即可; - 7.代码示例 :
OUTPUT_ARCH(arm) /*指明处理器结构*/ ENTRY(_start) /*指明程序入口 在 _start 标号处*/ SECTIONS { . = 0x50008000; /*整个程序链接的起始位置, 根据开发板确定, 不同开发板地址不一致*/ . = ALIGN(4); /*对齐处理, 每段开始之前进行 4 字节对齐*/ .text : /*代码段*/ { start.o (.text) /*start.S 转化来的代码段*/ *(.text) /*其它代码段*/ } . = ALIGN(4); /*对齐处理, 每段开始之前进行 4 字节对齐*/ .data : /*数据段*/ { *(.data) } . = ALIGN(4); /*对齐处理, 每段开始之前进行 4 字节对齐*/ bss_start = .; /*记录 bss 段起始位置*/ .bss : /*bss 段*/ { *(.bss) } bss_end = .; /*记录 bss 段结束位置*/ }
3. Makefile 编译脚本
makefile 文件编写 :
- 1.通用规则 ( 汇编文件编译规则 ) : 汇编文件 编译 成同名的 .o 文件, 文件名称相同, 后缀不同,
%.o : %.S
, 产生过程是arm-linux-gcc -g -c $^
, 其中^
标识是所有的依赖文件, 在该规则下 start.S 会被变异成 start.o ; - 2.通用规则 ( C 文件编译规则 ) : C 代码编译成同名的 .o 文件,
%.o : %.c
, 产生过程是arm-linux-gcc -g -c $^
; - 3.设置最终目标 : 使用
all:
设置最终编译目标;
- ( 1 ) 依赖文件 : 产生最终目标需要依赖 start.o 文件, 使用
all: start.o
表示最终目标需要依赖该文件; - ( 2 ) 链接过程 :
arm-linux-ld -Tgboot.lds -o gboot.elf $^
, 需要使用链接器脚本进行连接, ①链接工具是 arm-linux-ld 工具, ②使用-Tgboot.lds
设置链接器脚本 是刚写的 gboot.lds 链接器脚本, ③输出文件是 gboot.elf 这是个中间文件, ④ 依赖文件是$^
代表所有的依赖; - ( 3 ) 转换成可执行二进制文件 :
arm-linux-objcopy -O binary gboot.elf gboot.bin
, 使用-O binary
设置输出二进制文件, 依赖文件是gboot.elf
, 输出的可执行二进制文件 即 结果是gboot.bin
;
- ( 1 ) 依赖文件 : 产生最终目标需要依赖 start.o 文件, 使用
- 4.makefile 文件内容 :
all: start.o #依赖于 start.o arm-linux-ld -Tgboot.lds -o gboot.elf $^ #使用链接器脚本, 将 start.o 转为 gboot.elf arm-linux-objcopy -O binary gboot.elf gboot.bin #将 gboot.elf 转化为可以直接在板子上执行的 gboot.bin 文件 %.o : %.S #通用规则, 如 start.o 是由 start.S 编译来的, -c 是只编译不链接 arm-linux-gcc -g -c $^ %.o : %.c #通用规则, 如 start.o 是由 start.c 编译来的, -c 是只编译不链接 arm-linux-gcc -g -c $^ .PHONY: clean clean: #清除编译信息 rm *.o *.elf *.bin
4. 编译输出可执行文件
编译过程 :
- 1.文件准备 : 将 汇编代码 ( start.S ) 链接器脚本 ( gboot.lds ) makefile 文件 拷贝到编译目录 ;
- 2.执行编译命令 :
make
; - 3.编译结果 : 可以看到 生成了 编译目标文件 start.o, 链接文件 gboot.elf, 可执行的二进制文件 gboot.bin ;
本博客的参考文章及相关资料下载 :
- 1.本博客代码及参考手册下载 : https://download.csdn.net/download/han1202012/10412045
-
CC2530关于端口中断常用的寄存器
2022-02-10 17:31:13CC2530中断寄存器和用法的一些简单说明 PICTL——端口输入信号 P0IFG ——P0端口状态标志寄存器 P1IFG ——P1端口状态标志寄存器 P2IFG ——P2端口状态标志寄存器 P0IEN——P0端口中断使能 P1IEN——P1端口中断使能 ...文章目录
PICTL——端口输入信号
P0IFG ——P0端口状态标志寄存器
P1IFG ——P1端口状态标志寄存器
P2IFG ——P2端口状态标志寄存器
P0IEN——P0端口中断使能
P1IEN——P1端口中断使能
P2IEN——P2端口中断使能
IEN0 ——中断使能寄存器0
IEN1 ——中断使能寄存器1
IEN2 ——中断使能寄存器2
中断优先级
用到中断嵌套时最好先提高所需中断的优先级在操作。
IP1、IP2 ——中断优先级1寄存器、中断优先级2寄存器
中断概括表
其他相关寄存器点我跳转。
-
STM32使用中断屏蔽寄存器BASEPRI保护临界段+中断分组+抢占/响应优先级概念
2019-05-30 10:33:08如果某些代码段不允许被中断打断,那么这段代码就必须用关中断的方式给保护起来,在UCOS中可以看到,一般保护方式有3种: (1)关闭中断(总中断或者指定的几个中断),执行临界段,开启中断...(2)把中断状态压栈... -
嵌入式系统/ARM技术中的ARM中断及相关寄存器
2020-11-13 02:23:59要正确应用ARM处理器必须首先对它的系统寄存器进行正确配置,下面简要介绍一下ARM寄存器,包括一些中断寄存器设置如中断状态(0x8000.0240,0x8000.1240,0x8000.2240)和中断屏蔽寄存器(0x8000.0280,0x8000.... -
关于ARM的工作模式、中断源、中断优先级和标志寄存器的解释
2021-10-29 17:49:31介绍了ARM的工作模式、中断源、中断优先级和标志寄存器 -
嵌入式系统/ARM技术中的ARM状态寄存器访问指令
2020-11-13 03:19:53ARM中有两条指令用于在状态寄存器和通用寄存器之间传送数据。 状态寄存器中有些位是当前没有使用的,但在ARM将来版本中有可能使用这些位,因此用户程序不要使用这些位。 程序不能通过直接修改CPSR中T的控制位... -
ARM Cortex-M3与Cortex-M4中断相关寄存器
2020-10-27 15:26:30中断控制和状态寄存器(ICSR)、向量表偏移寄存器(VTOR) 中断和复位控制寄存器(AIRCR)、系统处理优先级寄存器(SCB->SHP[0-11]) 系统处理控制和状态寄存器(SCB->SHCSR) PRIMASK、FAULTMASK BAS... -
[ARM异常]-ARM Core中与中断相关的寄存器
2020-08-10 17:19:45} 2、SCR_EL3, Secure Configuration Register 只有SCR_EL3,没有SCR_EL1和SCR_EL2 只有EL3才能读写此寄存器. NS 标记processor element的secure/non-secure的安全位 IRQ、FIQ标志中断是routing到EL3是routing到ELx... -
51单片机中断相关寄存器
2018-12-31 15:52:58中断允许寄存器IE EA——全局中断 ES——串口中断 ET2——定时器2中断 EX1——外部中断1 ET1——定时器1 中断 EX0——外部中断0 中断优先级寄存器IP PS——串口 PT——计时器 PX——外部中断 置0... -
状态寄存器
2021-06-07 00:21:09状态寄存器又称cpsr,是cpu运算器的一部分。主要存放两类信息: 1、存放当前指令执行结果的各种状态或条件码,结果是否为负、是否为0、是否进位、是否溢出; 2、存放控制信息,有终端标志位、跟踪标志位。 cpsr... -
1.5.2异常与中断_CPU模式(Mode)_状态(State)与寄存器
2020-06-22 01:23:40寄存器(CPSR/SPSR) 下面是CPSR/SPSR寄存器(当前的程序状态寄存器Current Program Status Register和保存的程序状态寄存器Saved Program Status Register),其中SPSR保存的是被中断的模式下,CPSR的寄存器。... -
中断寄存器记录
2020-08-27 20:23:06⑴中断请求寄存器IRR 8259A有8条外部中断请求输入信号线IR0-IR7,每一条请求线上有一个相应的触发器来保存请求信号,它们形成了中断请求寄存器IRR(Interrupt Request Register)。 ⑵中断屏蔽寄存器IMR I.MR... -
stm32学习笔记——NVIC中断相关寄存器
2021-10-15 11:11:31CM3 内核支持 256 个中断,其中包含了 16 个内核中断和 240 个外部中断,并且具有 256 级的可编程中断设置。 但 STM32 并没有使用 CM3 内核的全部东西,而是只用了它的一部分。 STM32 有 84 个中断,包括 16 个... -
外部中断使用指南(寄存器设置)
2021-05-23 08:28:58实验板子:tiny210(芯片:s5pv210)实验目的:通过外部中断操作两个按键实现对LED灯的亮灭控制步骤:①初始化GPIO端口,使GPIO为外部中断状态;(寄存器:GPxxCON)例:②配置外部中断触发模式,上升沿触发,下降沿触发... -
书小宅之嵌入式——常用寄存器的含义
2019-06-19 14:15:32RIS:中断状态寄存器。该寄存器显示系统控制原始中断的状态。如果中断屏蔽控制 (IMC) 寄存器相应的位被置位,就会产生一个中断发送到中断控制器。向屏蔽中断状态和清除 (MISC) 寄存器相应的位写 1 可以清除中断状态位... -
程序状态寄存器PSR
2019-07-19 17:05:20当前程序状态寄存器(CPSR)在所有处理器模式下都是可访问的,它包括条件标志位,中断标志位,当前处理器模式控制以及其他状态和控制位。每种异常模式都有一个保存程序状态寄存器(SPSR),当异常发生时用于保存CPSR的值... -
简单解释程序计数器、指令寄存器、通用寄存器、状态寄存器、程序状态字
2021-04-19 15:10:03当执行一条指令时,首先需要根据PC中存放的指令地址,将指令由内存取到指令寄存器中,此过程称,为“取指令”。与此同时,PC中的地址或自动加1或由转移指针给出下一条指令的地址。此后经过分析指令,执行指令。完成... -
【STM32】DMA详解
2020-10-10 10:26:15DMA寄存器9.1 DMA 低中断状态寄存器 (DMA_LISR)9.2 DMA 高中断状态寄存器 (DMA_HISR)9.3 DMA 低中断标志清零寄存器 (DMA_LIFCR)9.4 DMA 高中断标志清零寄存器 (DMA_HIFCR)9.5 DMA 数据流 x 配置寄存器 (DMA_SxCR) ... -
ARM微控制器-MCU基础及CPU运行过程(堆栈/中断/寄存器操作)
2021-01-29 13:23:11分析其中的CPU:(ALU、寄存器组、控制单元是必要的,其他非必要) 一个完整的CPU: 将ALU拿出来: 分析其中的Quiz: ① A + B = C 操作数:A B;运算:+;运算结果:C; 标志位:比如说用10+9=19,19... -
W5500中断寄存器的理解
2020-08-07 02:41:09W5500中文手册V1.0 写的不够清楚,该文是本人结合中英文手册及自己理解,整理出有关中断部分的理解,如有不正确的请指正。 -
【stm32f103】stm32 外部中断(寄存器版)
2017-09-16 21:23:55【stm32f103】stm32 外部中断(寄存器版) 中断分类 STM32的EXTI控制器支持19 个外 -
(指南者)(二)寄存器、定时器和中断
2021-11-15 12:53:47(指南者)(二)寄存器、定时器和中断寄存器定时器时钟定时器寄存器0110代码例程定时器中断中断定时器中断代码例程代码例程时间计算定时器流水灯实现定时器按键实现 寄存器 在单片机中,具有很多用来储存数据的单元... -
中断控制寄存器
2012-08-01 15:31:00用S3C2410的中断方式来控制I/O端口或部件操作时,除了要对I/O端口或者部件的相应寄存器进行初始化设置外,还需对中断控制器的5个控制寄存器进行初始化设置。这5个寄存器是:中断模式寄存器、屏蔽寄存器、优先级... -
创龙TMS320C6748开发板———中断介绍(1)中断及中断相关寄存器
2017-01-13 21:26:33一、中断模块寄存器介绍 本节我们主要介绍C6748的中断模块。 中断是硬件系统的基本功能,DSP通过中断实现和其他芯片的实时交互。中断是指DSP在执行程序的过程中,当出现异常情况或特殊请求时,DSP停止... -
看门狗(APB watchdog)简介,各个寄存器简介,把看门狗挂到APB总线上,看门狗的验证测试(1)
2021-08-24 08:16:27看门狗简介: 在系统运行时,可能会在外界的干扰下,出现程序跑飞的情况,看门狗的出现就是为了解决...APB watchdog 这个IP,由ARM提供,watchdog 模块基于32位重装载寄存器的向下计数器,可以通过设置计数器值,产生常