《tiny6410裸机程序》第七章:S3C6410外部中断简介

时间:2021-04-21 12:20:47

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

  本章内容是为下面要进行的按键裸机驱动做准备,主要讲解tiny6410的外部中断:涉及GPIO复用引脚设置为特殊功能作为中断源、子(外部)中断源设置寄存器EINT以及VIC总中断控制器等。

  说明:VIC是ARM的总中断控制器,EINT是外部子中断源控制器,GPIO复用作为中断产生源。EINT外部子中断源控制器和VIC总中断控制器相关寄存器的设置,决定了ARM核是否响应外部GPIO中断源信号以及响应的优先级。

按键的硬件连接如下:

  KEY1 KEY3 KEY5
GPIO GPN0/xEINT0 GPN2/xEINT2 GPN4/xEINT4

以下讲解都将以按键为例:

一、GPIO作为中断源

1.介绍

在以前常见的GPIO作为中断源使用的时候,需要首先设置GPIO复用功能为特殊功能、即EINT(外部中断引脚);同时该引脚可以捕捉什么类型的输入信号。

2.相应GPIO寄存器

rGPIONCON = 0x7F00 8830   //GPN设置,此时设置为EINT(外部中断)模式

rGPIONPUD = 0x7F00 8838   //上拉/下拉使能

//注意该种模式下,我们就不需要设置rGPIODAT寄存器了。

二、对应的EINT即外部(子)中断源设置寄存器(注意区别“三“中的总中断控制寄存器)

rEINT0CON0 = 0x7F00 8900  //上述GPIO设置为EINT模式后,需要设置外部(子)中断类型、GPIO的上升沿或下降沿等。

rEINT0MASK = 0x7F00 8920  //上述GPIO设置为EINT模式后,需要设置外部(子)中断源屏蔽寄存器、取消屏蔽。

rEINT0PEND = 0x7F00 8924  //上述GPIO设置为EINT模式后,当有某个外部中断产生时、相应位自动变0;我们在中断服务程序中可以通过判断位为0来看是共用总中断号中的那个外部子中断发生,进而做细化处理。当然,处理完后、这位必须由程序员软件置1。

三、S3C6410的中断控制器(也叫中断总控制器,注意区分上述"二"中讲解的子(外部)中断源控制寄存器)

1.介绍

  S3C6410中断控制器由两个VIC(Vectored Interrupt Controller, ARM PrimeCell)组成和两个TZIC’s(TrustZone Interrupt Controller SP890),两个TZIC’s和VIC’s很好的接合起来支持64个中断源。

  S3C6410的向量中断控制器的特性如下:每个VIC控制器包含32向量中断,固定的硬件中断优先级别,可编程的中断优先级,支持硬件的中断优先级屏蔽,可编程的硬件的中断优先级屏蔽,可产生一般中断和快速中断,可产生软件中断,原生的中断状态,中断请求状态,支持特权模式来限制访问。

2.VIC(全部中断;包括内部中断和外部总段)中断控制器常用寄存器

向量中断处理程序地址寄存器VIC0的地址是:

rVIC0INTENABLE = 0x7120 0010

//中断使能寄存器;使能对应的中断信号,使能中断信号只能通过该寄存器,如果禁用中断使用VICxINTENCLEAR寄存器,在系统重置后,所有中断都默认被禁用。

//我们要设置该寄存器,让它响应外部EINT中断

rVIC0VECTADDR = 0x7120 0100 ~ 0x7120 017C

//向量中断处理程序地址寄存器:每个寄存器对应一个中断源的ISR处理程序地址。

rVIC0ADDR = 0x7120 0F00

//向量地址寄存器:该寄存器里存放的是当前正在处理的ISR中断服务例程的地址。当前正在处理中断时,只能从该寄存器里读取其值,在处理完中断时向该寄存器里写入任何值都可以清除其值。

向量中断处理程序地址寄存器VIC1的地址是:

rVIC1INTENABLE = 0x7130 0010

//中断使能寄存器;使能对应的中断信号,使能中断信号只能通过该寄存器,如果禁用中断使用VICxINTENCLEAR寄存器,在系统重置后,所有中断都默认被禁用。

rVIC1VECTADDR = 0x7130 0100 ~ 0x7130 017C

//向量中断处理程序地址寄存器:每个寄存器对应一个中断源的ISR处理程序地址。

rVIC1ADDR = 0x7130 0F00

//向量地址寄存器:该寄存器里存放的是当前正在处理的ISR中断服务例程的地址。当前正在处理中断时,只能从该寄存器里读取其值,在处理完中断时向该寄存器里写入任何值都可以清除其值。

四、总结

步骤:

1.设置rGPIONCON寄存器,让GPN复用口为xEINT即外部中断模式;

2.设置rGPIONPUD寄存器,让GPN口使能上升和下降沿信号捕捉;

3.设置子(外部)中断源控制器寄存器rEINT0CON0,设置中断类型是GPN复用口xEINT的上升或下降沿;

4.设置子(外部)中断源屏蔽寄存器rEINT0MASK,不要屏蔽我们使用的GPN口;

5.设置总中断控制器VIC的rVIC0INTENABLE寄存器,已使能对该外部子中断EINT对应总中断的支持;

6.设置总中断控制器VIC的rVICTADDR寄存器,即是中断服务程序的入口地址。