RTC中断访问8259芯片

用到的相关8259内容

实时时钟芯片RTC接在8259芯片的从片引脚0上,如下图:
RTC中断访问8259芯片
在8259芯片内部,有中断屏蔽寄存器IMR,这是个8位寄存器,对应着芯片的8个引脚的输入,IMR相应位是0还是1,决定了从该引脚来的中断信号是否能通过8259送往处理器(0表示允许,1表示阻断)。

当外部设备通过某个引脚送来一个中断请求信号时,如果他没有被IMR阻断(相应位为0),那么就可以被送往处理器。

注意:
8259是可编程的,主片的端口号为0x20和0x21,从片的是0xa0和0xa1,可以通过这四个端口访问82259,设置其工作方式,包括IMR内容

当然,中断能否被相应,还要取决去CPU的状态,主要看标志寄存器IF,若IF=0,则所有从处理器INTR引脚来的中断信号都被忽略,当其为1时,处理器可以相应中断。

用到的RTC内容

基本介绍见百度百科
RTC可以产生很多中断,比如闹钟中断,更新结束中断和周期性中断(具体见寄存器B和C,如下图)。RTC的计时是独立的,产生中断只是一个赠品。所以如果希望产生中断,需要进行一些额外的设置。
RTC中断访问8259芯片

RTC中断访问8259芯片

我们通过访问CMOS RAM的端口号来访问RTC。
0X70和0X74是索引端口号
0X71或者0X75是数据端口号

比如为了设置更新周期结束中断:

  mov al,0x0b                        ;RTC寄存器B
      or al,0x80                         ;阻断NMI 。。0x70端口的第7位为1时,阻断NMI
      out 0x70,al						
      mov al,0x12                        ;设置寄存器B,禁止周期性中断,开放更 
      out 0x71,al                        ;新结束后中断,BCD码,24小时制 

在访问RTC期间,阻断NMI,所以第二行or一个80。
第四行的0X12可以对照上表来设置

每当中断实际发生,可以在读取寄存器C来检查中断原因,且只要一读取,寄存器C的内容就清0,如果不读取,同样的中断不会再次产生。为了,下面的代码读取寄存器C的内容

mov al,0x0c						;每当中断实际发生时,都需要读一下寄存器c的值,寄存器c的特点是读一下后所有内容自动
      out 0x70,al	;而且如果不读取,那么同样的中断不会再次发生;并且读的是0X0C而不是0X1c,说明打开了NMI
      in al,0x71  

RTC到8259

rtc设置完成后,需要设置8259的IMR,下面的代码,通过端口0xa1读取8259从片的IMR寄存器,用and将第0为清0(因为RTC连接在引脚0上,且IMR相应位为0是,表示允许中断),其他位不动,再写回去。
当然,还需要设置CPU的IF位,用sti指令

 in al,0xa1                         ;读8259从片的IMR寄存器 
      and al,0xfe                        ;清除bit 0(此位连接RTC)
      out 0xa1,al                        ;写回此寄存器 

      sti       

以上内容,是我自己记得重点,忽略了很多东西,有什么不懂或者不对的地方,欢迎留言一起探讨

上一篇:实时时钟中断的处理过程


下一篇:mysql判断表字段或索引是否存在,然后修改