注册 登录
编程论坛 嵌入式开发

双片8259编程须知

永夜的极光 发布于 2008-10-21 09:23, 3027 次点击
题外话:热烈庆祝论坛新开三个板块,转一篇我自己在blog写的文章,本人最近才进入嵌入式领域,很多东西都是完全一片空白,所以一些简单的问题还是要搞搞清楚的,希望本文对和我一样新接触嵌入式的朋友有所帮助
另外其实还有一篇有关多串口类的文章,由于保密的原因,不能公布源码,所以就不转过来了

========================================================================================================================

最近编了一个多串口通讯的程序,总共6个串口,前4个都没什么问题,但是后两个串口没反应.用其他的工具测试,后两个串口是正常的

查了一些资料,看起来问题是应该出在8259A上,因为后两个串口用的是中断10和11

普及一下8259A的知识,这是一个中断控制器,单片的8259A可以控制8个中断,但是如果采用多片级联,可以最多控制64个中断.一般的用法,是用两块8259A控制16个中断,其中IRQ0~7在主片上,然后从主片的IRQ2上级联一个8259A,又有了IRQ8~15,这些中断一般都有典型的用法,这些基本上所有和8259A有关的书都会介绍.这里就不写了.

这次,我用的6个中断是4,3,7,5,10,11,这也是典型的用法.至于原因,我就不知道了.

实际发现,10和11中断都不能使用,我就怀疑是中断屏蔽位的问题,可惜找了很多介绍8259A的资料,都没有看到有意义的东西,不得不说,现在的资料重复率实在是高,基本就是一个模子印出来的,有介绍的都有,没介绍的都没有.

后来,终于千辛万苦的找到了关于IRQ8~15的资料.的确和我想的一样,这8个中断的屏蔽位和低8号中断是不同的(如果相同才真是有鬼了).下面是具体的资料

主片中断IRQ0~7 中断号(其实是中断向量表的地址)是0x07~0x0F,ICR(Interrupt Control Register)是0x20,IMR(Interrupt Mask Register)是0x21

从片中断IRQ8~15中断号是0x70~0x77. ICR是0xA0,IMR是0xA1

主片中断在写程序的时候,一般顺序是,取得中断号对应的中断处理函数地址,用新的中断处理函数地址替换,在IMR的对应屏蔽位置0,解除屏蔽.新的中断处理函数处理结束后,发送EOI(End Of Interrupt,一般是0x20)给ICR.再不需要这个中断的时候,恢复原来的中断处理程序,屏蔽IMR中的对应位

从片中断大体流程也差不多,不过在使能中断的时候,要先使能主片的IRQ2,再使能从片上对应的位.在中断处理函数结束后,先发送EOI给从片的ICR,再发送EOI给主片的ICR.整个程序结束时,要屏蔽从片对应位的中断,是否屏蔽主片的IRQ2,要看情况而定,如果从片还有其他中断在用,就不能屏蔽.

下面是两个相关的地址:

http://cs.nju.

http://blog.

[[it] 本帖最后由 永夜的极光 于 2008-10-21 09:24 编辑 [/it]]
3 回复
#2
永久的守护2008-10-21 13:28
毕业很想从事这方面工作 希望以后能向你多请教
1