按键中断实验是什么

前面的按键实验是通过死循环一直读取按钮电平值来判断是否有按下按钮,接下来将使用另外一个更优雅的方式实验按键按下功能-中断。
cpu在正常处理指令的时候会遇到外设打断当前执行逻辑,我们称为异常中断。一系列中断处理集中在一起管理,我们称为异常中断向量表。
中断向量表coretex-a系列的中断向量表就是存放在程序起始位置(链接起始地址)的一组由4字节组成的一组数据,coretex-a 32位处理器每一条指令长度就是4个字节,所以本质上这个中断向量表是一组固定地址的指令。coretext-a系统cpu总共支持8个中断:
这8个中断里面需要特别注意也是需要开发的主要是复位中断与irq中断。复位中断在上电或者按下reset按钮后硬件加载程序同时pc寄存器位置重置为0x0或者链接起始地址时触发,irq中断则是外设触发。每一个中断发生时pc寄存器会被设置成一个固定的地址,而这个地址则对应中断向量表中一条指令。
中断向量表添加到汇编最开始的位置:
/* 从链接起始地址开始,8条4字节的指令组成了arm的中断向量表 *//* 中断向量表放在最开始的位置,每一条指令对应了具体的中断处理 *//* 当发生对应中断时,硬件会把对应的地址设置到pc寄存器,从而执行对应的中断服务函数 */ldr pc, =reset_handler /* 0x00: 复位中断 */ldr pc, =undefine_instruction_handler /* 0x04: 未定义中断指令 */ldr pc, =software_interrupt_handler /* 0x08: 软中断, svc特权模式 */ldr pc, =prefetch_abort_handler /* 0x0c: 指令预取中止中断 */ldr pc, =data_abort_handler /* 0x10: 数据访问中止中断 */ldr pc, =not_used_handler /* 0x14: 未使用的中断 */ldr pc, =irq_handler /* 0x18: 外部设备中断 */ldr pc, =fiq_handler /* 0x1c: 快速中断 */复位中断服务函数上电后第一个要触发的则是复位中断,通过向量表中定义的指令可以将程序切换到reset_handler处开始执行
关闭irq关闭i,d cache,以及mmu设置中断的起始地址,即设置成链接起始地址(因为程序是从链接起始地址开始运行的)设置irq,svc以及sys模式下c语言的运行环境(c语言的sp指针栈顶)打开irq调转到c语言的main函数开始运行cpsid i /* 关闭irq, 此时irq还没有配置完成,所以关闭*//* 在设备上电启动时,执行的代码访问的外设都是实际地址, mmu与cache此时的意义不大, 这个时候为了防止cache与mmu可能导致的问题会先将mmu与cache关闭 *//* cp15: sctlr *//* 关闭 i-cache, d-cache, mmu */mrc p15, 0, r0, c1, c0, 0 /* 将sctlr寄存器读取到r0寄存器 */bic r0, r0, #(1 << 0) /* 关闭mmu */bic r0, r0, #(1 << 1) /* 关闭对齐 */bic r0, r0, #(1 << 11) /* 关闭分支预测 */bic r0, r0, #(1 << 12) /* 关闭i-cache */bic r0, r0, #(1 <= number_of_int_vectors) return; interrupt_irq_count++; interrupt_irq_data iid = _irqinterrupttables[irqnum]; iid.handler(irqnum, iid.context); interrupt_irq_count--;}外设中断驱动gpio复用以及配置电气属性配置gpio的输入与输出初始化gpio中断void gpio_init_interrupt(gpio_type *base, int pin, gpio_interrupt_mode mode){ /// 首先将gpio的edge_sel寄存器对应pin位清0,如果为1则会使icr寄存器的配置无效 base->edge_sel &= ~(1 << pin); /// 对应icr的索引(按2位为一个单元) int icroffset = pin; /// 具体的icr寄存器地址 __io uint32_t *p_icr = null; if (pin icr1); } else { p_icr = &(base->icr2); icroffset -= 16; } switch (mode) { case gpio_interrupt_mode_no_interrupt: break; case gpio_interrupt_mode_low: *p_icr &= ~(3 << (2 * icroffset)); break; case gpio_interrupt_mode_high: *p_icr &= ~(3 << (2 * icroffset)); *p_icr |= 1 << (2 * icroffset); break; case gpio_interrupt_mode_rising_edge: *p_icr &= ~(3 << (2 * icroffset)); *p_icr |= 2 << (2 * icroffset); break; case gpio_interrupt_mode_falling_edge: *p_icr &= ~(3 << (2 * icroffset)); *p_icr |= 3 << (2 * icroffset); break; case gpio_interrupt_mode_rising_and_ralling_edge: *p_icr &= ~(3
魅族por6 puls低配版试玩王者荣耀大乔,撸一圈不卡顿!
LED圈新添13份半年度业绩预告单
历史上最大规模NLP会议要来了!论文提交数量将在2800左右
汽车所有权要终结?特斯拉认为无人驾驶五年内决战私家车
怎样使用Kali Linux入侵网络上的计算机
按键中断实验是什么
pcb设计软件有哪些
仅需1399元,搭载7nm麒麟810芯片,荣耀9X这回真够性价比!
Varta公司承诺用100%的可再生能源来支持苹果数据中心运营
干货 | 20种运放典型电路集锦,总有一个用得到!
关于100G QSFP28 ZR4光模块产品介绍
空调价格战打的火热 零售巨头们补贴不断
人类社会对人工智能的兴起都毫无准备,我们现在是处于人类历史新阶段的边缘吗?
还是2016款三星A8好 中端机型的小屏旗舰主打
选择合适的工业连接器需要做的3件事情
串行Flash存储器的编程解决方案
长安汽车11月销量为22.73万辆,同比增长23.01%
iPhone12Pro Geekbench5跑分出炉
华为徐直军:华为不造车,将聚焦ICT技术帮助车企造好车
COAST借助LeddarTech“Cocoon”激光雷达优化自动驾驶安全性能