-
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 更多相关内容 -
嵌入式系统/ARM技术中的ARM中断及相关寄存器
2020-11-13 02:23:59要正确应用ARM处理器必须首先对它的系统寄存器进行正确配置,下面简要介绍一下ARM寄存器,包括一些中断寄存器设置如中断状态(0x8000.0240,0x8000.1240,0x8000.2240)和中断屏蔽寄存器(0x8000.0280,0x8000.... -
【嵌入式开发】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
-
寄存器 中断
2020-08-25 11:05:08ISER[8]: ISER 全称是: Interrupt Set-Enable Registers,这是一个中断使能寄存器组。 有用的就是三个(ISER[0~2]]),总共可以表示 96 个中断。而 STM32F4 只用了其中的前 82 个。 ISER[0]的 bit0~31 分别对应...STM32F40xx/STM32F41xx 的 92 个中断里面, 包括 10 个内核中断和 82 个可屏蔽中断,具
有 16 级可编程的中断优先级, 而我们常用的就是这 82 个可屏蔽中断。ISER[8]: ISER 全称是: Interrupt Set-Enable Registers,这是一个中断使能寄存器组。
有用的就是三个(ISER[0~2]]),总共可以表示 96 个中断。而 STM32F4 只用了其中的前 82 个。 ISER[0]的 bit0~31 分别对应中断
0~31; ISER[1]的 bit0~32 对应中断 32~63; ISER[2]的 bit0~17 对应中断 64~81;
ICER[8]:全称是: Interrupt Clear-Enable Registers,是一个中断除能寄存器组。该寄存器组
与 ISER 的作用恰好相反,是用来清除某个中断的使能的。其对应位的功能,也和 ICER 一样。
这里要专门设置一个 ICER 来清除中断位,而不是向 ISER 写 0 来清除,是因为 NVIC 的这些寄
存器都是写 1 有效的,写 0 是无效的。
ISPR[8]:全称是: Interrupt Set-Pending Registers,是一个中断挂起控制寄存器组。每个位
对应的中断和 ISER 是一样的。通过置 1,可以将正在进行的中断挂起,而执行同级或更高级别
的中断。写 0 是无效的。
ICPR[8]:全称是: Interrupt Clear-Pending Registers,是一个中断解挂控制寄存器组。其作
用与 ISPR 相反,对应位也和 ISER 是一样的。通过设置 1,可以将挂起的中断接挂。写 0 无效。
IABR[8]:全称是: Interrupt Active Bit Registers,是一个中断激活标志位寄存器组。对应位
所代表的中断和 ISER 一样,如果为 1,则表示该位所对应的中断正在被执行。这是一个只读寄
存器,通过它可以知道当前在执行的中断是哪一个。在中断执行完了由硬件自动清零。
IP[240]:全称是: Interrupt Priority Registers,是一个中断优先级控制的寄存器组。这个寄
存器组相当重要! STM32F4 的中断分组与这个寄存器组密切相关。 IP 寄存器组由 240 个 8bit
的寄存器组成,每个可屏蔽中断占用 8bit,这样总共可以表示 240 个可屏蔽中断。 而 STM32F4
只用到了其中的 82 个。 IP[81]~IP[0]分别对应中断 81~0。 而每个可屏蔽中断占用的 8bit 并没有
全部使用,而是 只用了高 4 位。这 4 位,又分为抢占优先级和子优先级。抢占优先级在前,子
优先级在后。而这两个优先级各占几个位又要根据 SCB->AIRCR 中的中断分组设置来决定。优先级分组及设置
STM32F4 将中断分为 5 个组,组 0~4。该分组
的设置是由 SCB->AIRCR 寄存器的 bit10~8 来定义的。具体的分配关系如表 5.2.6.1 所示:
组 AIRCR [10: 8] [ 7: 4]分配情况 分配结果
0 111 0: 4 0 位抢占优先级, 4 位响应优先级
1 110 1: 3 1 位抢占优先级, 3 位响应优先级
2 101 2: 2 2 位抢占优先级, 2 位响应优先级
3 100 3: 1 3 位抢占优先级, 1 位响应优先级
4 011 4: 0 4 位抢占优先级, 0 位响应优先级例如组设置为 3,那么此时所有的 82 个中断,每个中断的中断优先寄存器的高四位中的最高 3 位是抢占优先级,低 1 位是响应优先级
每个中断, 你可以设置抢占优先级为 0~7,响应优先级为 1 或 0。
数值越小所代表的优先级就越高
只有抢占不同才可以打断。
假定设置中断优先级组为 2,然后设置中断 3(RTC_WKUP 中断)的抢占优先级为 2,响应优先级为 1。中断 6(外部中断 0)的抢占优先级为 3,响应优先级为 0。中断 7(外部中断 1)的抢占优先级为 2,响应优先级为 0。那么这 3 个中断的优先级顺序为:中断 7>中断 3>中断 6。
上面 中断 3 和中断 7 都可以打断中断 6 的中断。而中断 7 和中断 3 却不可以相互打断!MY_NVIC_Init函数
//设置 NVIC 分组
//NVIC_Group: NVIC 分组 0~4 总共 5 组
void MY_NVIC_PriorityGroupConfig(u8 NVIC_Group)
//设置 NVIC
//NVIC_PreemptionPriority: 抢占优先级
//NVIC_SubPriority : 响应优先级
//NVIC_Channel : 中断编号
//NVIC_Group : 中断分组 0~4
//注意优先级不能超过设定的组的范围!否则会有意想不到的错误
//组划分:
//组 0: 0 位抢占优先级, 4 位响应优先级
//组 1: 1 位抢占优先级, 3 位响应优先级
//组 2: 2 位抢占优先级, 2 位响应优先级
//组 3: 3 位抢占优先级, 1 位响应优先级
//组 4: 4 位抢占优先级, 0 位响应优先级
//NVIC_SubPriority 和 NVIC_PreemptionPriority 的原则是, 数值越小, 越优先
void MY_NVIC_Init(u8 NVIC_PreemptionPriority, u8 NVIC_SubPriority, u8 NVIC_Channel,u8 NVIC_Group)外部中断的设置,配置相关寄存器
STM32F4 的 23 个外部中断为:
线 0~15:对应外部 IO 口的输入中断。
线 16:连接到 PVD 输出。
线 17:连接到 RTC 闹钟事件。
线 18:连接到 USB OTG FS 唤醒事件。
线 19:连接到以太网唤醒事件。
线 20:连接到 USB OTG HS 唤醒事件。
线 21:连接到 RTC 入侵和时间戳事件。
线 22:连接到 RTC 唤醒事件。IMR:中断屏蔽寄存器。这是一个 32 寄存器。但是只有前 23 位有效。当位 x 设置为 1 时,
则开启这个线上的中断,否则关闭该线上的中断。
EMR:事件屏蔽寄存器,同 IMR,只是该寄存器是针对事件的屏蔽和开启。
RTSR:上升沿触发选择寄存器。该寄存器同 IMR,也是一个 32 为的寄存器,只有前 23
位有效。位 x 对应线 x 上的上升沿触发,如果设置为 1,则是允许上升沿触发中断/事件。否则,
不允许。
FTSR:下降沿触发选择寄存器。同 RTSR,不过这个寄存器是设置下降沿的。下降沿和上
升沿可以被同时设置,这样就变成了任意电平触发了。
SWIER:软件中断事件寄存器。通过向该寄存器的位 x 写入 1,在未设置 IMR 和 EMR 的
时候,将设置 PR 中相应位挂起。如果设置了 IMR 和 EMR 时将产生一次中断。被设置的 SWIER
位,将会在 PR 中的对应位清除后清除。
PR:挂起寄存器。当外部中断线上发生了选择的边沿事件,该寄存器的对应位会被置为 1。
0,表示对应线上没有发生触发请求。通过向该寄存器的对应位写入 1 可以清除该位。在中断服
务函数里面经常会要向该寄存器的对应位写 1 来清除中断请求。GPIOA~GPIOI的[15: 0]分别对应中断线 15~0。这样每个中断线对应了最多 9 个 IO 口
EXTICR[0]~ EXTICR[3]对应EXTICR1~ EXTICR 4
Ex_NVIC_Config//外部中断配置函数
//只针对 GPIOA~I;不包括 PVD,RTC,USB_OTG,USB_HS,以太网唤醒等
//参数:
//GPIOx:0~8,代表 GPIOA~I
//BITx:需要使能的位;
//TRIM:触发模式,1,下升沿;2,上降沿;3,任意电平触发
//该函数一次只能配置 1 个 IO 口,多个 IO 口,需多次调用
//该函数会自动开启对应中断,以及屏蔽线
/*首先得开启 SYSCFG 的时钟,然后根据 GPIOx 的位得到中断寄存器组的编号,即 EXTICR 的编号,在 EXTICR 里面配置中断线应该配置到 GPIOx 的哪个位。然后使能该位的中断,最后配置触发方式。这样就完成了外部中断的配置了。
*/
void Ex_NVIC_Config(u8 GPIOx,u8 BITx,u8 TRIM) -
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寄存器
中断概括表
其他相关寄存器点我跳转。
-
串口空闲中断 STM32F407 寄存器操作
2019-02-19 13:02:18串口空闲中断 STM32F407 寄存器操作 -
stm32中断设置(寄存器讲解)
2020-03-16 16:44:0951的内部中断是定时器中断,串口中断,外部中断是外部中断0和1. 而stm32的中断就比51多太多了,引脚多,内部资源多,所以拥有19个外部中断(包含16个GPIO中断和3个外部特定中断) 和40余个内部中断(包括定时器中断... -
STC学习:中断相关寄存器
2021-08-19 09:53:42中断允许寄存器IE、IE2和INT_CLKO ...EA的作用是使中断允许形成多级控制。即各中断源首先受EA控制;其次还受各中断源自己的中断允许控制位控制。 ELVD:低压检测中断允许位,ELVD=1,允许低压检测中断, -
51单片机与中断相关的寄存器
2020-05-22 15:52:5151单片机与中断相关的寄存器简介中断控制寄存器IE中断优先级控制...当EA = 1,使能中断;当EA = 0,禁止所有中断 6~5 —— —— 4 ES 当ES = 1,使能串行中断;当ES = 1,禁止串行中断; 3 ET1 当ET1 = 1,使能定 -
STM32的EXTI外部中断(直接操作寄存器)
2017-11-28 17:54:11STM32的EXTI外部中断(直接操作寄存器),亲测可用,内有详细代码注释和说明讲解,很好的学习资料。 -
stm32学习笔记——NVIC中断相关寄存器
2021-10-15 11:11:31CM3 内核支持 256 个中断,其中包含了 16 个内核中断和 240 个外部中断,并且具有 256 级的可编程中断设置。 但 STM32 并没有使用 CM3 内核的全部东西,而是只用了它的一部分。 STM32 有 84 个中断,包括 16 个... -
DSP中断实现方式以及寄存器访问
2018-11-14 14:25:43DSP中断实现方式以及寄存器访问,在C语言如何访问寄存器,如何实现三级中断 -
zynq中断寄存器操作
2020-08-12 23:20:18zynq中断寄存器操作 概述: 1. Zynq的中断类型有: 软件中断(Software Generated Interrupt, SGI,中断号0-15)(16–26 reserved) 私有外设中断(Private Peripheral Interrupt, PPI,中断号27-31), 共享外设... -
外部中断使用指南(寄存器设置)
2021-05-23 08:28:58实验板子:tiny210(芯片:s5pv210)实验目的:通过外部中断操作两个按键实现对LED灯的亮灭控制步骤:①初始化GPIO端口,使GPIO为外部中断状态;(寄存器:GPxxCON)例:②配置外部中断触发模式,上升沿触发,下降沿触发... -
用于中断屏蔽的寄存器
2019-02-28 11:21:46PRIMASK 和 FAULTMASK 寄存器 暂时屏蔽所有的中断, PRIMASK 用于禁止除NMI和HardFalut外的所有异常和中断。 NVIC_SETPRIMASK(); //关闭总中断 NVIC_RESETPRIMASK(); //开放总中断 3.0版本的库之后 __set_... -
关于C51的IE(中断使能寄存器)的初级认识
2016-07-28 22:21:52对于C51中的IE的初级认识 -
硬件中断错误寄存器介绍
2020-07-12 18:03:11硬件中断错误寄存器介绍 -
浅谈S3C2440的中断寄存器及中断过程
2021-01-19 18:41:511 S3C2440的中断寄存器 中断分两大类:外部中断和内部中断。 1.1 外部中断寄存器 24个外部中断占用GPF0-GPF7(EINT0-EINT7),GPG0-GPG15(EINT8-EINT23)。用这些脚做中断输入,则必须配置引脚为中断,... -
CC2530的中断使用方法及相关寄存器介绍
2020-12-07 19:16:46其中部分内容为本人自我认知,仅供参考,如有不足... //禁止main中断 } 总结 主要对中断寄存器以及中断服务函数的了解,整篇代码大部分都是围绕定义来进行的。 牢记寄存器的内容,从基本上中断就可以轻松驾驭了!!! -
28335设计参考手册之中断、寄存器等
2018-09-21 10:54:0928335设计参考手册之中断、寄存器等,此为官网下载版本,有需要的也可以直接去官网下载。 -
中断寄存器记录
2020-08-27 20:23:06⑴中断请求寄存器IRR 8259A有8条外部中断请求输入信号线IR0-IR7,每一条请求线上有一个相应的触发器来保存请求信号,它们形成了中断请求寄存器IRR(Interrupt Request Register)。 ⑵中断屏蔽寄存器IMR I.MR... -
中断寄存器操作
2018-07-17 21:55:535种中断寄存器:source pending register(中断源状态寄存器), interrupt mode register(中断模式寄存器), mask register(失能寄存器), priority register(优先级寄存器), and interrupt pending register... -
中断向量控制器和中断处理的主要寄存器2
2017-12-23 17:45:09中断向量控制器和中断处理的主要寄存器 --参考朱有鹏ARM裸机 1、异常处理的2个阶段 可以将异常处理分为2个阶段来理解,第一阶段是异常向量表跳转 第二阶段就是进入了真正的异常处理程序irq_handler之后的部分。 ... -
中断及中断寄存器,描述的比较详细
2016-11-25 12:45:001.中断分两大类:内部中断和外部中断。2.外部中断。24个外部中断占用GPF0-GPF7(EINT0-EINT7),GPG0-GPG...寄存器:EXTINT0-EXTINT2:三个寄存器设定EINT0-EINT23的触发方式。EINTFLT0-EINTFLT3:控制滤波时钟和滤... -
(指南者)(二)寄存器、定时器和中断
2021-11-15 12:53:47(指南者)(二)寄存器、定时器和中断寄存器定时器时钟定时器寄存器0110代码例程定时器中断中断定时器中断代码例程代码例程时间计算定时器流水灯实现定时器按键实现 寄存器 在单片机中,具有很多用来储存数据的单元... -
STM32的外部中断(寄存器控制)——个人笔记
2020-09-23 15:07:11配置EXTI的中断屏蔽寄存器(EXTI_IMR); 配置具体触发引脚(SYSCFG_EXTICR); 配置中断允许(ISER);(当然也可以配置优先级分组,我这里不需要,因此省略) 首先看EXTI的中断/事件框图: 要想触发中断,首先... -
ARM Cortex-M3与Cortex-M4中断相关寄存器
2020-10-27 15:26:30中断使能寄存器 设置中断挂起和清除中断挂起 中断活跃状态寄存器 中断优先级寄存器 软件触发中断寄存器 中断控制器类型寄存器 SCB寄存器 中断控制和状态寄存器(ICSR)、向量表偏移... -
51单片机中断相关寄存器
2018-12-31 15:52:58中断允许寄存器IE EA——全局中断 ES——串口中断 ET2——定时器2中断 EX1——外部中断1 ET1——定时器1 中断 EX0——外部中断0 中断优先级寄存器IP PS——串口 PT——计时器 PX——外部中断 置0... -
DSP28335 中断机制、寄存器赋值及GPIO各寄存器
2019-07-07 15:50:09中断机制 28335中断分3个层级:CPU级——PIE级——外设级 CPU级 包括 NMI(不可屏蔽中断) 16个可屏蔽中断:INT1–INT14;...IER (中断使能,置1了才去处理该通道中的中断) INTM (中断总阀,置1开启才...