iTop-4412 裸机程序(二十)- 按键中断Demo

news/2025/3/14 23:20:29/

目录

  • 0.源码
  • 1. 中断初始化
  • 2. 中断回调
  • 3 start.S


上篇博文介绍了按键的轮询处理方式,本篇介绍按键的中断方式。

0.源码

GitHub:https://github.com/Kilento/4412NoOS

1. 中断初始化

void interrupt_init(void)
{/* 中断处理:* <1> IRQ模式: 中断irq引脚, 中断GIC* <2> GIC中断:中断号ID*      Key2: GPX1_1/XEINT9*      (1) Page 752: EINT9  ---> 中断ID: 57*      (2) GPX1_1 配置成中断功能: 0xF*      (3) GPX1_1 禁止上拉和下拉 PUD[3:2]*      (4) EXT_INT41CON[1] : 0x2 ---> 下降沿触发中断falling edge*      (5) EXT_INT41_MASK[1]: 0x0 ---> Enables Interrupt* <3> GIC 配置:*      (1) ICCICR_CPU0[0] : 0x1048_0000 :   1 ---> enable*      (2) ICDDCR:   0x1049_0000 :  1 ---> enable*      (3) ICCPMR_CPU0[7:0]:  0x1048_004 :  255屏蔽优先级*           ICDIPR_CPU0  偏移57个字节(每个中断占一个字节), 默认0,最高优先级*      (4) ICCIAR_CPU0[9:0]: 0x1048_000C:  中断ID*      (5) 结束中断*      (6) ICDISER_CPU0[57]:   Set-Enable Interrupt 1*      (7)  ICDIPTR_CPU:   选择该中断递送给哪一个CPU** <4> 中断清除*      (1) EXT_INT41_PEND[1]:  0*      (2)  (4) ICCICPR_CPU0*      (3)  (5) ICCEOIR_CPU0[9:0]: 0x1048_0010: 回写ID给GIC*/printf("interrupt_init\n");/*GPX1_1 - HOME - EXT_INT41[1] - EINT[9] - SPI(25) - ID(57)GPX1_2 - BACK - EXT_INT41[2] - EINT[10] - SPI(26) - ID(58)GPX3_3 - SLEEP - EXT_INT43[3] - EINT[27] - SPI(32) - ID(64)GPX2_0 - VOL- - EXT_INT42[0] - EINT[16] - SPI(32) - ID(64)GPX2_1 - VOL+ - EXT_INT42[1] - EINT[17] - SPI(32) - ID(64)*/ICDDCR = 1;               // 使能中断分配器ICDISER1_CPU0 |= 1 << 25; // 57/32 = 1...25// ICDISER1_CPU0 |= 1 << 26; // 58/32 = 1...26// ICDISER2_CPU0 |= 1 << 0;  // 64/32 = 2...0// 设置SPI[25]/ID[57]由哪个cpu处理,当前设置为cpu0的irq中断ICDIPTR14_CPU0 |= 1 << 8;ICCPMR_CPU0 = 0xff;ICCICR_CPU0 = 1;return;
}

2. 中断回调

void irq_exception(void)
{int irq_num = 0;int key_id = 0;led_ctrl(0, 0);led_ctrl(1, 1);irq_num = ICCIAR_CPU0 & 0x3ff;printf("%d\n", irq_num);switch (irq_num){case 57:{key_id = KEY_HOME;EXT_INT41_PEND |= (0x1 << 1); // 清GPIO中断标志位put_key_value(key_id);break;}default:{printf("unknown irq number=%d", irq_num);break;}}ICCEOIR_CPU0 = (ICCEOIR_CPU0 & (~0x3FF)) | irq_num; // 清cpu中断标志return;
}

3 start.S


init_stack:     /*svc mode stack*/msr cpsr, #0xd3ldr sp, _stack_svc_end/*undef mode stack*/msr cpsr, #0xdbldr sp, _stack_und_end/*abort mode stack*/    msr cpsr,#0xd7ldr sp,_stack_abt_end/*irq mode stack*/    msr cpsr,#0xd2ldr sp, _stack_irq_end/*fiq mode stack*/msr cpsr,#0xd1ldr sp, _stack_fiq_end/*user mode stack, enable FIQ/IRQ*/msr cpsr,#0x10ldr sp, _stack_usr_end/*Call main*/ldr pc, = main 	/* 使用长加载进行地址跳转,不能再使用 bl 进行跳转 */
b .irq_handler:/* 中断程序执行时,会自动将当前pc指针地址存入 lr 寄存器中 */sub  lr,lr,#4  /* 由于 armv7 使用两级流水线,PC 指针地址= 当前执行指令地址 + 8,当前中断处理程序地址 = pc - 4 */stmfd sp!,{r0-r12,lr} /* 将所有寄存器(r0-r12, lr)的值按顺序存储到当前栈顶位置 */bl irq_exception  /* 跳转到中断程序  */ldmfd sp!,{r0-r12,pc}^ /* 中断返回程序会从栈中弹出之前存储的所有寄存器的值,并跳转回原来的程序入口地址 */_stack_svc_end:      .word stack_svc + 512
_stack_und_end:      .word stack_und + 512
_stack_abt_end:      .word stack_abt + 512
_stack_irq_end:      .word stack_irq + 512
_stack_fiq_end:.word stack_fiq + 512
_stack_usr_end:      .word stack_usr + 512.data
stack_svc:      .space 512
stack_und:.space 512
stack_abt:      .space 512
stack_irq:      .space 512
stack_fiq:      .space 512stack_usr:      .space 512

2024年02月13日

Kilento


http://www.ppmy.cn/news/1350775.html

相关文章

C#(C Sharp)学习笔记_If条件判断语句【五】

前言&#xff1a; 本期学习的是编程语言中的主要语句&#xff1a;if-条件判断语句。在这里我们会学到&#xff1a;if语法&#xff0c;if-else&#xff0c;和if嵌套。话不多说&#xff0c;我们开始吧&#xff01; 什么是条件判断语句&#xff1f; 条件语句是用来判断给定的条件…

Unity类银河恶魔城学习记录5-1.5-2 P62-63 Creating Player Manager and Skill Manager源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili PlayerManager.cs using System.Collections; using System.Collections.G…

TapableHookPlugins

以极客时间《玩转Webpack》课程学习为主的记录笔记。 源码解读 webpack的命令跟踪&#xff0c;从node_modules/webpack/bin/ 可以看到命令内容&#xff0c;webpack会查看是否下载安装了webpack-cli / webpack-command。使用webpack-cli 解析命令行信息、安装使用到的依赖&…

ONLYOFFICE文档8.0新功能浅探

ONLYOFFICE文档8.0新功能浅探 上个月末这个月初的几天&#xff0c;ONLYOFFICE版本更新了&#xff01;更新到了一个比较整的大的版本号&#xff0c;8.0版本&#xff0c;看来这个生产力工具的升级速度基本上能保持每年两个版本号的速度&#xff0c;还是很快的&#xff0c;一般来…

不懂编程?节点包来凑——Dynamo常用节点包推荐(上)

由于篇幅有限&#xff0c;本次文章我们分上、下两篇&#xff0c;来分享给大家。 Dynamo作为一款辅助三维设计工具&#xff0c;他可以通过图形化的编程&#xff0c;帮我们解决很多在设计或者建模过程中遇到的小问题&#xff1b;同时他作为一款可视化编程软件&#xff0c;学起来…

计算机服务器中了mkp勒索病毒如何解密,mkp勒索病毒解密流程

随着网络技术的不断发展与应用&#xff0c;越来越多的企业走向数字化办公模式&#xff0c;计算机极大地方便了企业的正常生产运营&#xff0c;但网络威胁的手段也不断增加。近期&#xff0c;云天数据恢复接到很多企业的求助&#xff0c;企业的计算机服务器遭到了mkp勒索病毒攻击…

速盾cdn:香港服务器如何用国内cdn

在国内使用香港服务器的情况下&#xff0c;可以考虑使用速盾CDN来提供加速服务。速盾CDN是一种专业的内容分发网络解决方案&#xff0c;可以通过使用不同节点的服务器来提供高速的内容传输和访问。 首先&#xff0c;使用速盾CDN可以帮助解决香港服务器与国内用户之间的延迟和带…

Android 9.0 禁用adb install 安装app功能

1.前言 在9.0的系统产品定制化开发中,在进行一些定制开发中,对于一些app需要通过属性来控制禁止安装,比如adb install也不允许安装,所以就需要 熟悉adb install的安装流程,然后来禁用adb install安装功能,接下来分析下adb 下的安装流程 2.禁用adb install 安装app功能的…