——从轮询按键到中断)
一、轮询方式读按键板子上有三个按键中间是复位左边是低功耗右边是给用户自己用的试验按键。原理图上开关断开时为高电平按下为低电平。按键接在 UART1_CTS_B 这个引脚上默认功能是串口流控要把它复用成 GPIO1_IO18。初始化和点灯一样分四步复用功能低四位写 0101 也就是 ALT5。SION 位为 0表示输入通路由复用功能决定。电气特性配驱动能力、上下拉、转换速率这些。做输入时最要紧的是上拉把 PUS 设成 22K 上拉、PKE 使能否则引脚悬空读数会乱跳。方向把 GDIR 的对应位清零设为输入。时钟打开 CCM_CCGR1GPIO1 整组引脚共用这个时钟门不打开寄存器读写全都无效。运行时直接读数据寄存器判断电平就行。二、轮询的问题在主循环里加一个延时模拟耗时业务会发现按键经常没反应因为 CPU 正忙着延时这期间按下的动作被错过了。这在实时性要求高的场景是致命的比如汽车刹车信号晚几十毫秒就是事故。轮询的本质缺陷是CPU 的时间被业务占满时就没人去看外设了。中断就是为了解决这个问题。三、中断是什么中断是指 CPU 能打断当前正在执行的工作转去处理更紧急的任务处理完再回到原来的位置继续执行。完整流程是中断源发出中断请求CPU 检查是否响应中断、该中断是否被屏蔽检查当前中断的优先级保护现场执行中断服务函数恢复现场。和函数调用的区别在于谁来触发。函数是代码主动调用中断是外设在任意时刻打断你。GPIO 引脚产生的中断属于外部中断。四、GIC 中断控制器GIC 是通用的中断控制器标准Cortex-A7 用的是 GIC V2.0。V2.0 最多可以为 8 个内核提供中断控制i.MX6ULL 只有一个核所以只有 processor 0。每个核可响应 1020 个中断源按编号分三类0 到 15 是 SGI软件中断往 GICD_SGIR 写数据触发多核之间通信常用。16 到 31 是 PPI私有中断每个核独有的。32 到 1019 是 SPI共享中断外设用。这里的 SPI 和 SPI 总线没关系别搞混。GIC 内部由两部分组成Distributor 分发器负责管理所有中断源的使能、优先级和分发CPU Interface 负责把中断送给具体的核。五、中断编号对应关系具体到 i.MX6ULL中断编号有三套必须搞清楚GIC 规范里的编号0 到 1019。参考手册 3.2 节 Cortex-A7 域的中断编号0 到 128。芯片头文件 MCIMX6Y2.h 里 IRQn_Type 枚举0 到 159。三者之间存在偏移写驱动时如果配错了中断号表现是中断永远进不来或者进错函数所以每次都要先确认当前用的是哪一套。六、协处理器 cp15Cortex-A7 有 cp0 到 cp15 共 16 个协处理器其中 cp15 负责存储相关的任务系统控制与配置、MMU 配置管理、Cache 配置管理、虚拟化与安全、系统性能监视。cp15 下有 c0 到 c15 一组寄存器用 MRC 读、MCR 写指令格式是 MRC 后面跟协处理器号、操作码、目标寄存器、CRn、CRm 和可选的 opc2。跟中断相关的几个寄存器一是 c1 的 SCTLR 系统控制寄存器。bit13 是 V 位0 表示普通异常向量表基地址 0x00000000可以用 VBAR 重映射1 表示高地址向量表基地址 0xFFFF0000不可重映射。bit12 是 I 位控制指令 Cache 的开关。二是 c12 的 VBAR 向量表基地址寄存器用来把异常向量表搬到自己的程序里裸机工程一般设成链接地址。三是 c15 的 CBAR 配置基地址寄存器保存 GIC 寄存器的物理基地址写 GIC 驱动时要先读它不能把地址写死。重点总结轮询的缺陷不是慢而是主循环忙的时候没人看外设实时性场景必须用中断。按键初始化四步复用、电气、方向、时钟做输入时上拉最关键。GIC 中断源分三类SGI 是 0 到 15PPI 是 16 到 31SPI 是 32 到 1019。GIC 编号、芯片中断号、IRQn_Type 是三套编号写之前先确认偏移关系。cp15 掌管系统控制、MMU、Cache 和向量表基址MRC 读 MCR 写。