对heziq网友问题的回答
作者:linuxer 发布于:2015-3-23 19:03
一、前言
heziq网友在《linux kernel的中断子系统之(四):High level irq event handler》文档中提出了若干个问题,由于在回复中无法图形表达,因此单独出一份文档来回答,希望可以有所帮助。当然,由于他提出的问题和硬件电路设计有关,这里我只是表达我自己的观点(毕竟出身是软件工程师),如果有误,请不吝指出。
二、上拉和下来电阻的基本知识
下图描述了一个外设通过interrupt request line连接到CPU中断控制器的block diagram:
注意:本章通篇以上拉电阻为例,下拉的概念类似,因此就不再赘述了。
基本上,上拉(或者下拉)电阻总是需要的,只不过是看看位于何处,一般而言,有三种可能的位置:
1、集成在外设芯片中(上图中的block diagram描述的就是这种类型)
2、集成在CPU中断控制器上
3、需要设计外围电路来支持
问题来了:集成在芯片上(外设或者CPU)的上拉电阻和芯片外部的上拉电阻有什么区别呢?我们来这样的一个场景,如果外设的电源域是5V的,而CPU中断控制器是工作在3.3V,按照上图的连接是否可以正常工作呢?CPU中断控制器检测高电平可能的范围是3.3V~2.8V,可是,由于使用了外设芯片的内部上拉,实际上,IRQ线上的电压在高电平的时候是5V,这样的电压可能会导致CPU一侧的工作状态异常。如果CPU这一侧也有上拉电阻的配置,那么可以考虑disable外设的上拉电阻(这时候,外设的输出引脚的特性是open drain),而使用CPU芯片内的上拉电阻。如果CPU没有上拉电阻,那么就没有办法了,只能是接外部上拉电阻,当然是上拉到CPU中断控制器需要的那个电压水平。
三、如何选择上拉电阻或者下拉电阻?
对于数字基带电路,分析比较简单。其实主要看看输出端口和输入端口的接口规格就OK了,而这里的接口规格主要是0状态和1状态的电压范围。我们还是以具体的电路为例分析,我们假设外设的电路逻辑会检测某些状态,正常的时候,三极管Q是off状态,IRQ line是输出高电平。当检测到某些状态的时候,外设芯片会导通三极管Q,这时候,IRQ line处于低电平状态。下图描述了Q处于off状态(输出高电平)的示意图:
虽然Q是off的,但是还是存在漏电流,我们标注为Iq。同理流入CPU中断控制器的电流是Icpu,一般而言,CPU中断控制器的输入是high input impedance,因此Icpu也比较小,这样,根据Kirchhoff Current Law,流经pull up电阻R的电流:I = Iq + Icpu。我们假设这个值是10uA,上拉电阻的阻值是10K欧姆,那么在R上的压降就是10uA x 10K = 100mV。也就是说,当外设打算输出高电平的时候,IRQ line上的电平并不等于V而是等于V减去pull up电阻上的压降,当这个压降超过一定范围的时候(这个值来自CPU侧如何感知高电平,也就是说CPU侧能够判别高电平的最小值VIH),电路将不能正常工作。更详细的计算我就不描述了,一句话,pull up电阻不能太大。
下图描述了Q处于on状态(输出低电平)的示意图:
理想情况下,三极管Q导通的时候,IRQ对地短路,因此IRQ的电平就是0电平,不过实际中,导通状态的三极管还是有电阻存在的,也就是说IRQ line不可能是处于0电平,而是Rq,这样,IRQ上的电平应该是Rq x Iq。同样的道理,CPU侧感知低电平也是有一个范围的,因此Iq不能太大,否则IRQ line上的电压会超出范围而被CPU中断控制器检测为高电平。为了现在Iq的值必须增大R,一句话,pull up电阻不能太小。
总结:上拉电阻(或者下拉电阻)不能太大,也不能太小,应该被设计成一个适当的值,让电路可以正常的工作。
三、问题回答
1、问题:有没有同时支持上升沿和下降沿的中断控制器?当然我觉得不可能有同时支持高电平和低电平出发的中断控制器
当然有同时支持上升沿和下降沿的中断控制器,我接触过的CPU中有PXA270的中断控制器是可以配置成双沿触发的,只要检测到rising-edge或者falling-edge,就会触发一个GPIO的中断。当然,对于level-sense的中断,如你所说:不可能有同时支持高电平和低电平出发的中断控制器
配置成双沿触发对软件是有好处的,类似处理键盘deboucing的软件逻辑就不会那么复杂了。配置成双电平触发的话,那么看来只能是正常状态是高阻态,硬件A状态触发高电平,硬件B状态触发低电平,我没有实际接触到这样设定。
2.gpio type 中断,如果是高电平,我觉得肯定要使用下拉电阻,将电平钳制在低电平。 如果是低电平,我觉得肯定要使用上拉电阻,将电平钳制在高电平。
同意,不过上拉(或者下拉)可能是chip内,也可能是chip外的。
3、gpio type 中断,如果是上升沿中断,是不是要使用下拉电阻或者根本不使用上下拉?如果使用了上拉电阻会怎么样? gpio type 中断,如果是下降沿,是不是要使用上拉电阻,或者不使用。如果使用了下拉电阻会怎么样?
使用上拉或者下拉和上升沿或者下降沿关系不大,主要看电路的情况。上拉主要是用于NPN型的三极管的open collector的情况(上文描述的电路即是如此),对于PNP型的三极管,其open collector的情况如下:
这时候,需要接下拉电阻。
4.如果gpio中断内部使用了上拉电阻,如果外部在使用上拉电阻,会出现什么副作用吗。我觉得有,两个上拉电源之间会互相影响。
如果两个上拉电阻都拉到同样的Vcc,那么其效果就是并联电阻电路而已,这时候,上拉电阻会变小(其阻值是(R1+R2)/(R1R2))。如果两个上拉电阻都拉到不同的Vcc,那么……回去翻一翻Kirchhoff电压和电流定律,我就不分析了。
5.如果gpio中断内部使用了下拉电阻,如果外部在使用下拉电阻,会使pin脚的输入电阻变低,有可能高电平信号拉不起来。
对于一个给定的电路(确定的外设芯片和确定的CPU中断控制器芯片),要使电路正常工作,其上拉或者下拉电阻必须处于一个合理的数值,不能太大,也不能太小。具体需要用我们第二章中的知识来分析
6.如果外设使用边沿触发。比如上升沿,那么它的高电平维持时间有要求吗,由高电平变低电平,是外设自己拉低的?还是interrupt controler控制?
如果外设可以检测某种硬件事件,并通过IRQ line上的上升沿通知给中断控制器的话,那么基本上高电平维持时间可以在芯片手册上查到,和中断控制器无关。当然,我们必须了解中断控制器在检测上升沿的规格,中断控制器一般都是采样来自外设的IRQ line上的电平,高电平当然要维持一定的时间,否则如果上升沿的脉冲卡在中断控制器的两次采样点中间的时候,该上升沿会被中断控制器miss掉。

评论:
2016-07-07 16:12
gpio type 中断,如果是高电平,我觉得肯定要使用下拉电阻,将电平钳制在低电平。 如果是低电平,我觉得肯定要使用上拉电阻,将电平钳制在高电平。
---------------
上面的这句话是heziq的表述,我同意他的描述,是因为我对这句话的解析是这样的:
++++++++++++
对于gpio type 的电平中断而言,如果是高电平有效(高电平触发中断),我觉得肯定要使用下拉电阻,将电平钳制在低电平。 如果是低电平有效(低电平触发中断),我觉得肯定要使用上拉电阻,将电平钳制在高电平。
++++++++++++
2015-03-23 22:24
真是太专业了,太棒了。我还有几个疑问要请教你。
对于问题1:
这个双边沿deboucing是什么原理?我只知道软件deboucing。嘿嘿!给讲解一下呗!而且我觉得中断引脚不能配置成高阻态,否则容易误动作。抗干扰能力差。
问题3:
这个问题我没有描述清楚。我们不具体关心使用的是NPN还是PNP, 比如如果是上升沿触发,是不是requst line最好是无中断的时候拉成低电平。这样外设直接拉到高电平,产生上升沿。如果无中断的时候,request line 是高电平,那么外设先要拉低,在拉高,才能产生上升沿。同理下降沿。这是我要表达的意思。
问题4:
是不是最好只保留一个上拉或者下拉,尽量避免并联上拉或者下拉。
问题6:
比如上升沿,是不是外设将拉高,然后维持一段时间,在拉低。在没有中断的情况下,电压总维持在低电平。
下降沿类似。
问题3和6其实是一样的。
2015-03-24 09:14
-----------------------------------
键盘driver中的deboucing timer相信大家都比较熟悉,你可以思考一下,如果该按键的引脚是单边缘触发、双边缘触发以及电平触发时候的软件逻辑。
问题3:
这个问题我没有描述清楚。我们不具体关心使用的是NPN还是PNP, 比如如果是上升沿触发,是不是requst line最好是无中断的时候拉成低电平。这样外设直接拉到高电平,产生上升沿。如果无中断的时候,request line 是高电平,那么外设先要拉低,在拉高,才能产生上升沿。同理下降沿。这是我要表达的意思。
--------------------------------------
也不是说上升沿的触发方式外设就要首先保持在低电平,也可能是正常状态时候始终是高电平,但是当外设检测到事件后,拉出一个指定宽度低电平的脉冲。这种情况,中断控制器也是可以使用上升沿检测的。
问题4:
是不是最好只保留一个上拉或者下拉,尽量避免并联上拉或者下拉。
-------------------------------------
这个是和电路设计有关,当然,如果in-chip的上拉电阻如果满足电路设计的要求,那么当然就不需要外加那个并联的上拉电阻了。
2015-03-24 11:03
我的理解
边沿触发的设计机制,一般是由一个clock信号,然后每一个clock 信号都会去检测一下电平状态,如果这次clock信号检测到跟上一次clock信号检测到的两次电平信号不一致,就说明由一个边沿信号出来。所以边沿信号的触发方式,跟最开始默认高低电平没有必然的联系。就像linuxer说的,如果你默认是高电平,只要由一个指定宽度的低电平脉冲,等这个脉冲到了,又会跳到高电平,这样还是会检测到上升沿的。
功能
最新评论
- wangjing
写得太好了 - wangjing
写得太好了! - DRAM
圖面都沒辦法顯示出來好像掛點了。 - Simbr
bus至少是不是还有个subsystem? - troy
@testtest:只要ldrex-modify-strex... - gh
Linux 内核在 sparse 内存模型基础上实现了vme...
文章分类
随机文章
文章存档
- 2025年4月(5)
- 2024年2月(1)
- 2023年5月(1)
- 2022年10月(1)
- 2022年8月(1)
- 2022年6月(1)
- 2022年5月(1)
- 2022年4月(2)
- 2022年2月(2)
- 2021年12月(1)
- 2021年11月(5)
- 2021年7月(1)
- 2021年6月(1)
- 2021年5月(3)
- 2020年3月(3)
- 2020年2月(2)
- 2020年1月(3)
- 2019年12月(3)
- 2019年5月(4)
- 2019年3月(1)
- 2019年1月(3)
- 2018年12月(2)
- 2018年11月(1)
- 2018年10月(2)
- 2018年8月(1)
- 2018年6月(1)
- 2018年5月(1)
- 2018年4月(7)
- 2018年2月(4)
- 2018年1月(5)
- 2017年12月(2)
- 2017年11月(2)
- 2017年10月(1)
- 2017年9月(5)
- 2017年8月(4)
- 2017年7月(4)
- 2017年6月(3)
- 2017年5月(3)
- 2017年4月(1)
- 2017年3月(8)
- 2017年2月(6)
- 2017年1月(5)
- 2016年12月(6)
- 2016年11月(11)
- 2016年10月(9)
- 2016年9月(6)
- 2016年8月(9)
- 2016年7月(5)
- 2016年6月(8)
- 2016年5月(8)
- 2016年4月(7)
- 2016年3月(5)
- 2016年2月(5)
- 2016年1月(6)
- 2015年12月(6)
- 2015年11月(9)
- 2015年10月(9)
- 2015年9月(4)
- 2015年8月(3)
- 2015年7月(7)
- 2015年6月(3)
- 2015年5月(6)
- 2015年4月(9)
- 2015年3月(9)
- 2015年2月(6)
- 2015年1月(6)
- 2014年12月(17)
- 2014年11月(8)
- 2014年10月(9)
- 2014年9月(7)
- 2014年8月(12)
- 2014年7月(6)
- 2014年6月(6)
- 2014年5月(9)
- 2014年4月(9)
- 2014年3月(7)
- 2014年2月(3)
- 2014年1月(4)
2016-07-06 15:16
上面这句话该怎样解释啊,我不太理解,为什么是高电平时,要用下拉电阻啊?