双片8259编程须知
题外话:热烈庆祝论坛新开三个板块,转一篇我自己在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]]