浅析嵌入式系统之uboot详解(4.2)—外部中断(GPIO)

bootloader详解目录—废铁是怎么产生价值的

浅析嵌入式系统之uboot详解(1)—板子上电后uboot做了什么
浅析嵌入式系统之uboot详解(2)—CPU工作模式
浅析嵌入式系统之uboot详解(3)—看门狗
浅析嵌入式系统之uboot详解(4.1)—内部中断
浅析嵌入式系统之uboot详解(4.2)—外部中断(GPIO)
浅析嵌入式系统之uboot详解(4.3)—异常和异常向量
浅析嵌入式系统之uboot详解(5.1)—时钟分频
浅析嵌入式系统之uboot详解(5.2)—省电模式(番外)
浅析嵌入式系统之uboot详解(5.3)—PWM定时器(番外)
浅析嵌入式系统之uboot详解(6)—关闭缓存和mmu
浅析嵌入式系统之uboot详解(7)—初始化SDRAM


uboot详解—外部中断 GPIO

1. 前言

  上一篇我们介绍了内部中断相关的寄存器,从内部中断源的产生到触发cpu处理的过程,这一篇我们要介绍外部中断。

  外部中断一般是指由计算机外设发出的中断请求,如:键盘中断、打印机中断、定时器中断等。外部中断是可以屏蔽的中断,也就是说,利用中断控制器可以屏蔽这些外部设备 的中断请求。

2. 外部中断

  由ARM 处理器的芯片原理图,可以看出除了一些特殊的外接功能引脚外,GPIO引脚占了绝大部分。GPIO是General Purpose Input Output (通用输入/输出),外设都是连接到这些引脚上面的,所以可以简单的说,我们想让一个处理器实现什么样的功能,直接依赖于对GPIO寄存器的操作。关于GPIO的操作,有机会在介绍,这里主要分析外部中断。

  从datasheet里可以看到,一部分GPIO引脚可以设置成不同的功能,比如输入功能,输出功能和中断功能等,如下图,GPFx引脚可以设置成不同的工作模式,比如要将GPF3设置成中断模式,只需要将GPFCON的[7:6]设置为b10:
在这里插入图片描述
对于s3c2440处理器一共支持24个外部中断源,如下图,EINT0~23都是外部中断,EINT4~7和EINT8~23是复合中断,其他的都是单一中断
在这里插入图片描述
下面还是用s3c2440的中断处理总概图来分析:
在这里插入图片描述
上图中,内部中断部分我们已经分析过了,现在主要分析红色框内部的部分——外部中断处理过程

在处理外部中断请求前,需要确认一些前提条件:

  1. 外设的中断线有没有连接到cpu的GPIO中断引脚,比如我们要实现一个按键中断,那么要先确认该按键是否有连接到cpu的EINT0~EINT3中的一个引脚上, 现在我们假设该按键连接在EINT2引脚上
    在这里插入图片描述

  2. 查看芯片原理图,可以知道EINT2引脚其实就是GPF2 GPIO管脚,那么只要配置GPFCON的对应位为中断模式就可以了,比如要将GPF2引脚设置成中断引脚,则需要将GPFCON的第[5:4]两位设置成10就可以了 在这里插入图片描述
    在这里插入图片描述

  3. 设置引脚工作模式后,需要设置该引脚的触发方式,比如有上升沿触发,下降沿触发,高电平触发和低电平触发,比如这里设置为下降沿触发,只需要将EXTINT0寄存器的[10:8]位设置为000就可以了
    在这里插入图片描述

  4. 查看datasheet可以知道,EINT0~7是没有控制滤波时钟和滤波宽度的,但是EINT8~23是可以设置控制滤波时钟和滤波宽度的,当然可以通过选择打开或者关闭这个功能
    在这里插入图片描述
    当开启了滤波功能时候,就可以过滤一些不规则波形(毛刺)的影响了,可以让外设的中断信号更准确的被识别,比如按键连接在能够滤波的外部中断引脚,就可以通过滤波来防抖了,而不用在软件里面设置,下图是对某个中断滤波时钟和滤波宽度的设置
    在这里插入图片描述

  5. 到这一步,准备工作就差不多了,我们回到第一张图红色框框住的部分,经过外部中断产生器以后,如果是单一中断源,则直接设置SRCPND寄存器的相应中断位为1,然后继续后面的过程(这个过程在前面一篇文章中讲过);

    如果是复合中断源,将经过EINTPND(子外部中断暂存寄存器)和EINMASK(屏蔽子外部中断寄存器)的判断后,决定是否将该中断信号送到SRCPND,如果EINMASK没有屏蔽该信号,则直接设置SRCPND寄存器的相应中断位为1,然后继续后面的过程(这个过程在前面一篇文章中讲过)。
    在这里插入图片描述
    在这里插入图片描述

  6. 信号到达SRCPND寄存器以后,就继续后面的步骤了。

这篇文章介绍的内容相对简单,下面就列举一个中断屏蔽的例子。

这里先明确一个认识,中断的关闭和中断的屏蔽概念是不一样的,中断的关闭是指将CPSR中的 I F位设置为1,中断的屏蔽是将屏蔽寄存器里面的中断屏蔽位置1, 所以往往在一些网络文章里(比如讲解uboot start.S文件的时候),将中断屏蔽操作说成中断关闭操作是不准确的。

mov r0, #0xffffffff

ldr r1, =INTMSK

str r1, [r0]  @屏蔽所有中断

ldr r1,0x3ff

ldr r0,=INTSUBMSK  
 
str r1, [r0]  @屏蔽内部子中断

因为外部中断在板子刚上电的时候,GPIO管脚的默认状态是输出状态,所以没有设置GPIO管脚为中断模式的时候是没有外部中断的,这里不需要屏蔽。

3. 总结

  这篇文章介绍了外部中断的是一些配置,虽然内容比较简单,但是我们在编程上还是操作外部中断会比较多,外接模块的中断请求都需要外部中断来处理,所以掌握好外部中断是很重要的。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ʚ兔子的先森ɞ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值