| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3026 人关注过本帖, 1 人收藏
标题:双片8259编程须知
取消只看楼主 加入收藏
永夜的极光
Rank: 6Rank: 6
等 级:贵宾
威 望:27
帖 子:2721
专家分:1
注 册:2007-10-9
收藏(1)
 问题点数:0 回复次数:0 
双片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]]
搜索更多相关主题的帖子: 须知 
2008-10-21 09:23
快速回复:双片8259编程须知
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025020 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved