(六)arm裸机开发---GPIO按键中断

本节介绍GPIO中断实验,主要介绍中断向量表,中断控制器,通用的中断服务函数。从中断向量表开始一步一步往下编写程序,最后实现按键输入中断,中断响应是蜂鸣器响。本节的重点在于通用的中断函数的编写,和通用的GPIO的编写。

一.概念

1.中断向量表

      中断向量表就是一个数组,其中存着进入中断的入口地址。就是一堆中断的入口地址。
imx6ull的中断向量表长这个样子。在这里插入图片描述
所有的外部中断都属于IRQ中断。

2.中断向量表偏移

      就是指出中断向量表的位置。向 VBAR 寄存器写入新的中断向量表首地址即可。

3.通用中断控制器(GIC)

      是imx6ull的中断控制管理机构。中断控制器(GIC)接收到中断信号就会报给arm内核。
      GIC中有三种中断源,分别是:SPI(多核共享中断)PPI(单核私有中断)SGI(软件中断)。我们使用的都是SPI,imx6ull定义了128个中断,我们使用的中断SPI是从32开始的。

4.CP15协处理器

CP15协处理器通常用于存储,但是也用于中断。在中断中我们使用C0,C1,C12,C15。

      通过 c0 寄存器可以获取到处理器内核信息;通过 c1 寄存器可以使能或禁止 MMU、 I/D Cache 等;通过 c12 寄存器可以设置中断向量偏移;通过 c15 寄存器可以获取 GIC 基地址。
CP15协处理器的访问格式:读是MRC,写是MCR。例如:

MCR{
   
   cond} p15, <opc1>, <Rt>, <CRn>, <CRm>, <opc2>

4.1 读取C0

假如我们要将 CP15 中 C0 寄存器的值读取到 R0 寄存器中

MRC p15, 0, r0, c0, c0, 0

4.2 设置C1

1 /* 关闭 I,DCache 和 MMU 采取读-改-写的方式。*/
2 mrc p15, 0, r0, c1, c0, 0 /* 读取 CP15 的 C1 寄存器到 R0 中 */
3 bic r0, r0, #(0x1 << 12) /* 清除 C1 的 I 位,关闭 I Cache */
4 bic r0, r0, #(0x1 << 2) /* 清除 C1 的 C 位,关闭 D Cache */
5 bic r0, r0, #0x2 /* 清除 C1 的 A 位,关闭对齐检查 */
6 bic r0, r0, #(0x1 << 11) /* 清除 C1 的 Z 位,关闭分支预测 */
7 bic r0, r0, #0x1 /* 清除 C1 的 M 位,关闭 MMU */
8 mcr p15, 0, r0, c1, c0, 0 /* 将 r0 的值写入到 CP15 的 C1 中 */

4.3 设置C12为VBAR

我们将C12设置为VBAR寄存器就可以通过设置C12来设置向量中断表偏移。

ldr r0, =0X87800000 ; r0=0X87800000
MCR p15, 0, r0, c12, c0, 0 ;将 r0 里面的数据写入到 c12 中,即 c12=0X87800000

4.4 C15获取GIC基地址

MRC p15, 4, r1, c15, c0, 0 ;获取 GIC 基地址
ADD r1, r1, #0X2000 ;GIC 基地址加 0X2000 得到 CPU 接口端寄存器起始地址
LDR r0, [r1, #0XC] ;读取 CPU 接口端起始地址+0XC 处的寄存器值,也就是寄存器;GIC_IAR 的值

5. 中断使能

中断使能包括俩部分:IRQ中断使能,和SPI中断使能。
IRQ中断使能的命令是:cpsid i 禁止 IRQ 中断。cpsie i 使能 IRQ 中断。
SPI中断使能是通过GICD_ISENABLER1~GICD_ISENABLER15来设置的。

6. 中断优先级

优先级设置主要有三部分:
①、设置寄存器 GICC_PMR,配置优先级个数,比如 I.MX6U 支持 32 级优先级。(GICC_PMR)
②、设置抢占优先级和子优先级位数,一般为了简单起见,会将所有的位数都设置为抢占优先级。(GICC_BPR)
③、设置指定中断 ID 的优先级,也就是设置外设优先级。(GICC_BPR)

7.中断处理函数

      中断处理函数就是响应中断的函数。

二、实现中断

1.中断向量表的实现

汇编

.global _start

_start:
    ldr pc, =Reset_Hander           //复位中断
    ldr pc, =Undefined_Hander       //未定义指令中断
    ldr pc, =SVC_Hander             //软中断
    ldr pc, =PreFetchAbort_Hander   //指令预取中止中断
    ldr pc, =DataAbort_Hander       //数据访问中止中断
    ldr pc, =NotUsed_Hander         //未使用
    ldr pc, =IRQ_Hander             //IRQ 中断
    ldr pc, =FIQ_Hander             //FIQ 中断


Reset_Hander :
    /*复位中断函数 */


    /*1.关闭I,D Cache和MMU */
    cpsid i                     /*关闭IRQ */
    mrc p15, 0, r0, c1, c0, 0   /* 读取 CP15 的 C1 寄存器到 R0 中 */
    bic r0, r0, #(0x1 << 12)    /* 清除 C1 的 I 位,关闭 I Cache */
    bic r0, r0, #(0x1 << 11)    /* 清除 C1 的 Z 位,关闭分支预测 */
    bic r0, r0, #(0x1 << 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值