硬件开发2-ARM裸机开发3-IMX6ULL - 引入中断

ARM裸机开发:中断与GIC详解

一、铺垫引入中断 → 按键

 1、概要:

            实现按键控制发光二极管和蜂鸣器

             输入类型的外设:按键(key)

2、参考手册内容完成配置过程

(1)key 按键原理图

(2)core 内核中命名 -- UART1 CTS

(3)复用功能设置

(4)电气特性配置

        一般顺序:12 - -> 13 - -> 14-15

        阻值不明确时通常选择10K,如若没有选择阻值相近于10k的(所以选择22k的[11])

1)上拉电阻

2)速率

3)综合

(5)引脚方向配置

    GPIO1->GDIR &= ~(1 << 18);        //仅需要将GPIO的第18号引脚 置1

3、代码实现

4、实验现象

        能够实现按下按键是,蜂鸣器响应,led亮。但是会出现按下按有时无法立刻响应,是由于现有模式是轮询模式,cpu无法在按键按下时就立刻进行响应,也许在你按下按键时刻,cpu正在别的地方检测,所以会出现延时性。

        由此引出,引入中断。当按下按键时刻,能够立刻响应。中断:cpu在轮询中有更为紧要的事情打断,保护现场,去执行中断任务,当执行完毕后,回到现场,恢复形成继续进行刚刚被打断前的任务。

二、中断的引入

1、概念

        中断:CPU能打断当前正在进行的工作,去处理更为紧急的任务,并且在处理完中断任务后,能回到原先的地方继续工作

2、流程

        (1)中断源发出中断请求。

        (2)CPU检查是否响应中断以及该终端是否被屏蔽。

        (3)检查当前产生的中断的中断优先级。

        (4)保护现场

        (5)执行中断服务函数

        (6)恢复现场

3、流程图

        由下图可知:想要实现中断还需要GIC控制器作为中间桥梁进行传递(秘书处)

 (1)中断基本流程

  (2) 三类分发器 SGI、PPI、SPI

4、中断控制器GIC

(1)概念

        ARM处理器中管理中断的硬件模块,负责接收外设中断请求(IRQ),根据优先级、目标核和安全属性分发到CPU核心;

(2)类型

        SGI(Software Generated Interrupt):核间通信中断(ID0-15),通过写寄存器,触发由软件触发引起的中断,通过向寄存器GICD_SGIR 写入数据来触发,系统会使用 SGI 中断来完成多核之间的通信

        PPI(Private Peripheral Interrupt):核私有中断(ID16-31),如定时器中断,我们说了 GIC 是支持多核的,每个核肯定有自己独有的中断。这些独有的中断肯定是要指定的核心处理,因此这些中断就叫做私有中断

        SPI(Shared Peripheral Interrupt):共享外设中断(ID32-1019),如GPIO、UART中断,(注意!不是 SPI 总线那个中断),这类中断泛指所有的

(3)功能

     中断触发、优先级仲裁、CPU响应、中断完成

5、协处理器:cp0 - cp15

        内核中的用到的ARM Cortex-A7内核GIC(通用中断控制器)的关键寄存器

  1. C_IAR

    • 全称:Interrupt Acknowledge Register(中断应答寄存器)
    • 功能:读取时返回当前最高优先级的中断ID,表示处理器已接受该中断
    • 访问权限:只读(__IM
    • 偏移地址:0x200C
  2. C_EOIR

    • 全称:End Of Interrupt Register(中断结束寄存器)
    • 功能:写入中断ID以通知GIC中断处理完成
    • 访问权限:只写(__OM
    • 偏移地址:0x2010
  3. 无法直接知道基地址引入协处理器
  4. GIC的地址保存在协处理器的cp15中

(1)协处理器概念

(2)核心指令

  • cond:省略表示无条件执行。
  • p15:指定协处理器 CP15(系统控制协处理器)。
  • opc1:操作码1,此处为 0(CP15 规定 opc1 必须为 0,否则结果不可预测)。
  • Rt:目标寄存器,示例中为 r0(ARM 核心寄存器)。
  • CRn:协处理器主寄存器编号,示例中为 c0
  • CRm:附加寄存器或操作数,示例中为 c0(若无需附加信息,通常设为 c0)。
  • opc2:次要操作码,示例中为 0(用于区分同一编号寄存器的不同功能)

示例:

eg:MRC p15, 0, r0, c0, c0, 0

// 指令从 CP15 的 c0 寄存器(主标识符寄存器)读取数据到 ARM 的 r0 寄存器。c0 是只读寄存器         

(3)异常向量表基地址的配置实现过程

6、详细蓝图

7、代码实现

interrupt.c interrupt.h

start.S

在使用 **i.MX6ULL** 芯片进行开发时,裸机编程并不是强制性的要求,但它是理解芯片底层机制和提升嵌入式开发能力的重要途径。对于希望深入掌握 Linux 驱动开发、系统移植以及底层调试的开发者来说,裸机开发提供了宝贵的基础知识积累[^1]。 ### 为什么裸机开发不是必须的? i.MX6ULL 是一款功能强大的应用处理器,支持完整的 Linux 操作系统运行。在实际项目中,很多开发者会直接使用 NXP 提供的 SDK 或者 Yocto 构建的 Linux 系统来进行开发,调用标准 API 和驱动接口完成应用程序或驱动程序的编写。这种方式可以显著提高开发效率,缩短产品上市时间[^2]。 ### 为什么建议学习裸机开发? 尽管裸机开发不是强制性的,但其优势在于: - **更深入理解硬件架构**:通过直接操作寄存器来配置外设(如 GPIO、定时器、中断控制器等),有助于理解 i.MX6ULL 的内部结构和工作原理。 - **增强调试能力**:裸机环境下没有操作系统抽象层,开发者需要自行处理内存管理、异常处理等问题,这提升了对底层问题的分析与解决能力。 - **为后续开发打基础**:裸机开发经验是学习 U-Boot 移植、Linux 内核启动流程、设备树配置及驱动开发的良好铺垫[^1]。 - **提升 C 语言和汇编能力**:裸机开发过程中频繁使用到指针、结构体、内存映射等高级 C 特性,同时也会涉及 ARM 汇编代码,这对编程能力是一种很好的锻炼[^3]。 ### 是否可以跳过裸机开发? 如果目标只是快速上手 Linux 应用开发或使用现成的驱动模块,那么可以直接从 Linux 用户空间编程入手,配合设备树配置和驱动加载进行开发。然而,一旦遇到性能优化、定制化需求或底层 Bug 调试时,缺乏裸机经验可能会成为瓶颈。 --- ### 示例:C语言实现LED控制(裸机环境) 以下是一个简单的 LED 控制示例,在裸机环境中通过设置 GPIO 寄存器点亮 LED: ```c // 假设 LED 连接到 GPIO1_3 引脚 #define GPIO1_BASE 0x209C000 #define GPIO1_DR (*(volatile unsigned int *)(GPIO1_BASE + 0x00)) #define GPIO1_GDIR (*(volatile unsigned int *)(GPIO1_BASE + 0x04)) void delay(volatile unsigned int count) { while(count--) { asm("nop"); } } int main(void) { // 设置 GPIO1_3 为输出 GPIO1_GDIR |= (1 << 3); while(1) { GPIO1_DR &= ~(1 << 3); // 点亮 LED delay(1000000); GPIO1_DR |= (1 << 3); // 关闭 LED delay(1000000); } } ``` 这段代码展示了如何在裸机环境下直接操作寄存器,控制 GPIO 输出电平变化。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值