【ARM裸板】按键外部中断过程及示例_淹死的大白鲨的博客-程序员秘密

技术标签: 外部中断  【ARM裸板】  

示例代码下载

1.初始化

  • 设置中断源(让它能发出中断信号)
  • 设置中断控制器(让它能发出中断信号给CPU)
  • 设置CPU总开关(CPSR有I位,设置总开关,使能中断)

处理时要分辨中断源
处理完要清中断

在这里插入图片描述

1.1 中断源

  • 设置按键为中断源引脚
    • 配置引脚为外部中断模式
    • 配置中断为下降沿触发
    • 配置外部中断MASK使能
//初始化外部中断,设置按键为中断源
void key_eint_init(void)
{
    
	/* 引脚:GPF0、2   GPG3、11 */
	/* 中断:EINT0、2  EINT11、19*/
	GPFCON &= ~((3<<0) | (3<<4)); //清零
	GPFCON |=  ((2<<4) | (2<<0)); //设置[10],配置为外部中断

	GPGCON &= ~((3<<6) | (3<<22));
	GPGCON |=  ((2<<6) | (2<<22)); //设置[10],配置为外部中断

	/* 设置中断触发方式:双边沿触发 */
	EXTINT0 |= (3<<0) | (3<<8); //配置EINT0、2
	EXTINT1 |= (3<<12); //配置EINT11
	EXTINT2 |= (3<<12); //配置EINT19

	/* 设置外部MASK清零使能 */
	EINTMASK &= ((1<<11) | (1<<19));
}

在这里插入图片描述

1.2 中断控制器

  • 设置INTMASK(INTERRUPT MASK (INTMSK) REGISTER)中断屏蔽寄存器
    • 0 = Interrupt service is available.
    • 1 = Interrupt service is masked.
//初始化中断控制器
void interrupt_init(void)
{
    
	INTMASK &= ~((1<<0) | (1<<2) | (1<<5));//使能中断
}

在这里插入图片描述

1.3 CPU使能中断

  • 设置CPSR的I位
  • 当设置为0时enable,设置为1时disable
mrs r0,cpsr    //读出CPSR
bic r0,r0,#(1<<7) //第7位清零(IRQ)
msr cpsr,r0

在这里插入图片描述
在这里插入图片描述

1.4 start.S设置中断向量表

  • 0x18处调用中断服务函数
/*====================================异常向量表===========================================*/
_start:
	b reset   		 //vector 0x00: reset(0地址对应reset)
 	ldr pc, und_addr //vector 0x04: und  (发生未定义指令异常,则进入“处理未定义异常函数”)绝对跳转,跳转至sdram中
 	ldr pc, swi_addr //vector 0x08: swi
 	b halt           //vector 0x0c: prefetch aboot
 	b halt           //vector 0x10: data aboot
 	b halt           //vector 0x14: reserved
 	bl irq_addr      //vector 0x18: IRQ
  	b halt           //vector 0x1c: FIQ	
    
irq_addr:
	.word do_irq

在这里插入图片描述

1.5 start.S设置中断处理

  • 执行中断处理之前,硬件会处理的事情:
  • 1.lr_irq保存有被中断模式中的下一条即将执行的指令的地址
  • 2.SPSR_irq保存被中断模式CPSR
  • 3.CPSR的[M4:M0]=[10010],进入到irq模式
  • 4.跳到0x08的模式执行程序,即跳到bl do_irq这一指令

1.5.1 设置栈

  • sp_irq 设置栈,因为后面函数需要栈
    ldr sp, =0x33D00000

1.5.2 保存现场

  • 在irq处理函数总有可能需要用到r0~r12,因此先保存下来
  • 由下图可知,lr-4是异常处理完后的返回地址,也需要保存
    sub lr,lr,#4
    stmdb sp!, {
    r0-r12,lr} 

在这里插入图片描述

1.5.3 处理中断

  • 跳转到中断处理函数中
    bl handle_irq_c

1.5.4 恢复现场

  • 将lr的值赋给pc ,^会把spsr的值恢复到cpsr中
    ldmia sp,{
    r0-r12,pc}^ 

2.中断服务函数

void handle_irq_c(void)
{
    
	/* 1.分辨中断源 */
	int bit = INTOFFSET;

	/* 2.调用对应的处理函数 */
	key_eint_irq(bit); //处理中断,清除外部中断标志

	/* 3.清中断 :从源头开始清 */
	SRCPND = (1<<bit);
	INTPND = (1<<bit);
}

2.1 分辨中断源

  • 中断偏移寄存器 (INTERRUPT OFFSET (INTOFFSET) REGISTER)
  • 可通过判断INTOFFEST的中的可知当前中断源

在这里插入图片描述

2.2 调用处理函数

  • 该为触发外部中断,因此需要清除外部中断
  • EINTPEND (External Interrupt Pending Register)
  • 清除该中断,只需要对应写1即可,又因为其发生什么中断,对应为会变成1,因此产生什么中断,只需要把该中断的EINTPEND的值写入EINTPEND
	/* 2.调用对应的处理函数 ,清除对应的中断*/
	key_eint_irq(bit); 

在这里插入图片描述

2.3 清中断

  • 从源头开始清:即先清除SRCPND,再清除INTPND

  • 它只清除SRCPNDINTPND寄存器对应于数据中设置为1的位的位置,因此清除哪一个中断,只需要对应为写1即可
    在这里插入图片描述

  • SRCPND(SOURCE PENDING (SRCPND) REGISTER)
    在这里插入图片描述

  • INTPND(INTERRUPT PENDING (INTPND) REGISTER)
    在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_39492932/article/details/104111516

智能推荐

springboot使用中遇到的问题_lp_10k的博客-程序员秘密

Field menuMapper in com.fast.project.system.service.impl.MenuServiceImpl required a bean of type ‘com.fast.project.XXXXXr’ that could not be found时一是mapper层没有添加@mapper注解,导致该接口无法被扫描。二是启动类配置了@Compo...

shell编程心得_呼噜娃娃的博客-程序员秘密

参考地址:http://blog.csdn.net/zhuying_linux/article/details/6630220优点:shell简单、灵活,,对于linux系统的自动化管理非常有帮助,可以让系统管理员的工作变得容易、简单、高效。shell脚本可以在unix和linux系统中灵活移植。shell脚本方便获取和修改源码,不需要编译。shell在linux很多地

Java1.8 新特性之Lambda实例 简述_阿咚do懂的博客-程序员秘密

一、Lambda 表达式的基础语法:Java8中引入了一个新的操作符 "-&gt;" 该操作符称为箭头操作符或 Lambda 操作符箭头操作符将 Lambda 表达式拆分成两部分:左侧:Lambda 表达式的参数列表右侧:Lambda 表达式中所需执行的功能, 即 Lambda 体语法格式一:无参数,无返回值 () -&gt; System.out.println("Hello Lambda!");语法格式二:有一个参数,并且无返回值 (x) -&gt; ...

内存按字节编址从A5000H到DCFFFH的区域其存储容量为(2)。_ana35287的博客-程序员秘密

2014年下半年 网络工程师 上午试卷 综合知识内存按字节编址从A5000H到DCFFFH的区域其存储容量为(2)。A.123KB B.180KB C.223KB D.224KB解析:从地址A5000H到DCFFFH的容量大小=DCFFF-A5000=37FFFH(224*1024)大小其中1024byte=1Kb此时我们将37FFFH转换成十进制=229...

Open64 源码编译安装_open64官网_cnvidia的博客-程序员秘密

来自:http://askubuntu.com/questions/62129/how-to-install-open64-compiler开始玩Open64了!编译安装Open64需要安装以下软件库。sudo apt-get install mawk csh bash make flex bison gfortran ia32-libs gcc-multilib g++-multil

Fast I/O和IRP_笔记_fastio irp 缓存管理器 流程_ch3rry的博客-程序员秘密

1. IRP and Fast I/Ohttp://excel.fit.vutbr.cz/submissions/2019/019/19_poster.pdf2.Minifilter 拦截FileMapping IO事件https://blog.csdn.net/zj510/article/details/85059638#FileMapping_173 文件过滤http...

随便推点

python polar函数_Python数据可视化第 9 讲:matplotlib极坐标图绘制函数polar_weixin_39604189的博客-程序员秘密

1. 极坐标在平面内取一个定点O,叫极点,引一条射线Ox,叫做极轴,再选定一个长度单位和角度的正方向(通常取逆时针方向)。对于平面内任何一点M,用ρ表示线段OM的长度(有时也用r表示),θ表示从Ox到OM的角度,ρ叫做点M的极径,θ叫做点M的极角,有序数对 (ρ,θ)就叫点M的极坐标,这样建立的坐标系叫做极坐标系。通常情况下,M的极径坐标单位为1(长度单位),极角坐标单位为rad(或°) 2. p...

Mock Annotation for Java 注解mock介绍_乾坤瞬间的博客-程序员秘密

文章目录背景项目目标maven项目坐标项目依赖how to use生成一个pojo类。main.java功能介绍1. 接受多层pojo递归嵌套2. 接受正则表达式(支持基本类型/String/Date类型)3. 时间函数4. 容器随机5. 基本数据类型检测方法6. 支持 以@为前缀的语义转换7. 优先级8. 1.1.0 新增内容继承类使用内部类使用详细案例框架支持的类型注解使用方式注意: 注解的表达能力有限为什么不用map?后续进展所有规则均参照前端界比较流行的mock框架:javascript Mo

给 JavaScript 开发者讲讲函数式编程_b10l07的博客-程序员秘密

和大多数人一样,我在几个月前听到了很多关于函数式编程的东西,不过并没有更深入的了解。于我而言,可能只是一个流行词罢了。从那时起,我开始更深地了解函数式编程并且我觉得应该为那些总能听到它但不知道究竟是什么的新人做一点事情。谈及函数式编程,你可能会想到它们:Haskell 和 Lisp,以及很多关于哪个更好的讨论。尽管它们都是函数式语言,不过的确有很大的不...

搞IT的好友们,注意了将来身体是革命的本钱哦_qq401128994的博客-程序员秘密

说实话,搞IT并不容易,虽然是白领,环境好,待遇高,但身体了一天不如一天,视力了也在下降,找女朋友了也难,在别人不知道的时候还在埋头苦干的加班,难也。

ListView异步加载图片,完美实现图文混排_nathan柠檬的博客-程序员秘密

ListView加载文本数据都是很简单的,即使是异步获取文本数据。但是异步加载图片就稍微有一点麻烦,既要获得一个比较好的用户体验,还要防止出现图片错位等各种不良BUG,其实要考虑的东西还是挺多的。好了,我们先来看一下我们今天要实现的一个效果图: 看起来似乎并不难,确实,我们今天的核心问题只有一个,就是怎么异步加载图片,并且没有违和感。好了,废话不多说,先来看主布局文

OpenCV3——图像变换之缩放、金字塔、仿射、透射[email protected]的博客-程序员秘密

本文链接:https://blog.csdn.net/qq_30815237/article/details/86706977 ...

推荐文章

热门文章

相关标签