====================================================================================================================================
本章内容是为下面要进行的按键裸机驱动做准备,主要讲解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寄存器,即是中断服务程序的入口地址。