资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,1,第,7,章,I,O,端口及中断控制器,2,本章重点,:,S3C2410A I/O,端口概述;,I/O,端口控制;,I/O,端口特殊功能寄存器;,I/O,端口程序举例。在,I/O,端口特殊功能寄存器中,除了讲述,GPAGPH,对应的寄存器外,还讲述了杂项控制寄存器、与外部中断有关的寄存器等内容。,S3C2410A,中断控制器概述;中断控制器操作、中断源及中断优先权产生模块;中断控制器特殊功能寄存器;中断程序举例。,3,7.1 I/O,端口概述,I/O,端口控制寄存器位于,S3C2410A,内部,有,117,个多功能输入,/,输出端口引脚,分为如下,8,个端口,:,端口,A,(,GPA,):,23,个输出引脚的端口;,端口,B,(,GPB,):,11,个输入,/,输出引脚的端口;,端口,C,(,GPC,):,16,个输入,/,输出引脚的端口;,端口,D,(,GPD,):,16,个输入,/,输出引脚的端口;,端口,E,(,GPE,):,16,个输入,/,输出引脚的端口;,端口,F,(,GPF,):,8,个输入,/,输出引脚的端口;,端口,G,(,GPG,):,16,个输入,/,输出引脚的端口;,端口,H,(,GPH,):,11,个输入,/,输出引脚的端口。,4,上述,8,个端口也称为通用输入输出端口,GPIO,(,General Purpose I/O,,通用输入,/,输出接口)也称为并行,I/O,(,parallel I/O,),是最基本的,I/O,形式,由一组输入引脚、输出引脚或输入,/,输出引脚组成,,CPU,对它们能够进行存取操作。,为了满足不同系统设计的需要,每个,I/O,口可以很容易地通过软件对进行配置。每个引脚的功能必须在启动主程序之前进行定义。如果一个引脚没有使用复用功能,那么它可以配置为,I/O,口。,注意:端口,A,除了作为功能口外,只能够作为输出口使用。,5,在,S3C2410A,中,大多数的引脚端都是复用的,所以对于每一个引脚端都需要定义其功能。为了使用,I/O,口,首先需要定义引脚的功能。每个引脚端的功能通过端口控制寄存器(,PnCON,)来定义(配置)。,与配置,I/O,口相关的寄存器包括:,端口控制寄存器(,GPACON,GPHCON,)、,端口数据寄存器(,GPADAT,GPHDAT,)、,端口上拉寄存器(,GPBUP,GPHUP,)、,杂项控制寄存器以及外部中断控制寄存器(,EXTINTN,)等。,6,在,7.3.2,节,讲述了特殊功能寄存器中的另外一些寄存器,这些寄存器控制某些时钟信号、外部中断请求信号的方式、外部中断屏蔽与否等等。包括:杂项控制寄存器,MISCCR,、,DCLK,控制寄存器,DCLKCON,、外部中断控制寄存器,EXTINT0EXTINT2,、外部中断滤波寄存器,EINTFLT2,和,EINTFLT3,、外部中断屏蔽寄存器,EINTMASK,、外部中断登记寄存器,EINTPEND,和通用状态寄存器,GSTATUS0GSTATUS4,。每个寄存器的具体含义见,7.3.2,节。,7,7.2 I/O,端口控制,端口引脚配置寄存器,GPACONGPHCON,在,S3C2410A,中,大多数引脚有多种功能。因此对每个引脚,要求确定哪一种功能被选择。端口引脚配置寄存器,GPACONGPHCON,确定每个引脚的功能。,如果,GPF0GPF7,和,GPG0GPG7,在,Power_OFF,模式用作唤醒信号,那么这些端口应该配置成中断模式。,8,端口数据寄存器,GPADATGPHDAT,如果端口被配置为输出端口,数据应该写到端口数据寄存器的对应位;,如果端口被配置为输入端口,数据应该从端口数据寄存器的对应位读出。,9,端口上拉(电阻)允许,/,禁止寄存器,GPBUPGPHUP,端口上拉(电阻)允许,/,禁止寄存器也称为端口上拉允许,/,禁止寄存器。,端口上拉(电阻)允许,/,禁止寄存器控制每个端口上拉电阻允许,/,禁止。当对应位为,0,时,引脚的上拉电阻被允许;当对应位为,1,时,上拉电阻被禁止。,10,杂项控制寄存器,杂项(,miscellaneous,)控制寄存器对数据总线端口,DATA31:16,、,DATA15:0,上拉电阻、,USB pad,和,CLKOUT,等进行选择。,11,外部中断控制寄存器,EXTINTn,和外部中断滤波寄存器,EINTFLTn,S3C2410A,的,24,个外部中断可以由各种信号方式提出请求。由,EXTINTn,寄存器配置的外部中断请求信号方式有:低电平触发、高电平触发、下降沿触发、上升沿触发以及,2,个沿都触发。,8,个外部中断引脚有数字滤波,参见,7.3.2,节外部中断滤波寄存器,EINTFLT2,和,EINTFLT3,。,只有,16,个,EINT,引脚,EINT15:0,在,Power_OFF,模式可以用作唤醒源。,12,Power_OFF,模式与,I/O,端口,在,Power_OFF,模式,所有,GPIO,寄存器值被保留。,外部中断屏蔽寄存器,EINTMASK,不能阻止从,Power_OFF,模式中唤醒。但是,如果,EINTMASK,正屏蔽着,EINT15:4,中的一个,虽然唤醒能够被操作,但源登记寄存器,SRCPND,中的,EINT4-7,和,EINT8-23,位,在刚刚唤醒后将不设置为,1,。,13,7.3 I/O,端口特殊功能寄存器,7.3.1,端口,A,端口,H,寄存器组,端口,A,寄存器组,共有,4,个寄存器:,端口,A,引脚配置寄存器,GPACON,,地址,0 x56000000,可读写,复位值,0 x7FFFFF,。,端口,A,数据寄存器,GPADAT,,地址,0 x56000004,可读写,复位值未定义。,其他未用。,各寄存器具体含义见表,7-1,和表,7-2,。,14,表,7-1,端口,A,引脚配置寄存器含义,GPACON,位,描 述,GPACON,位,描 述,GPA22,22,0=,输出,1=,nFCE,GPA10,10,0=,输出,1=,ADDR25,GPA21,21,0=,输出,1=,nRSTOUT,GPA9,9,0=,输出,1=,ADDR24,GPA20,20,0=,输出,1=,nFRE,GPA8,8,0=,输出,1=,ADDR23,GPA19,19,0=,输出,1=,nFWE,GPA7,7,0=,输出,1=,ADDR22,GPA18,18,0=,输出,1=,ALE,GPA6,6,0=,输出,1=,ADDR21,GPA17,17,0=,输出,1=,CLE,GPA5,5,0=,输出,1=,ADDR20,GPA16,16,0=,输出,1=,nGCS5,GPA4,4,0=,输出,1=,ADDR19,GPA15,15,0=,输出,1=,nGCS4,GPA3,3,0=,输出,1=,ADDR18,GPA14,14,0=,输出,1=,nGCS3,GPA2,2,0=,输出,1=,ADDR17,GPA13,13,0=,输出,1=,nGCS2,GPA1,1,0=,输出,1=,ADDR16,GPA12,12,0=,输出,1=,nGCS1,GPA0,0,0=,输出,1=,ADDR0,GPA11,11,0=,输出,1=,ADDR26,15,GPADAT,位,描 述,GPA22:0,22:0,当该端口被配置为输出端口时,引脚状态与这个寄存器中的对应位相同。,当该端口被配置为功能引脚时,读入值未定义,表,7-2,端口,A,数据寄存器含义,16,端口,B,寄存器组,共有,4,个寄存器:,端口,B,引脚配置寄存器,GPBCON,,地址,0 x56000010,可读写,复位值,0 x7FFFFF,。,端口,B,数据寄存器,GPBDAT,,地址,0 x56000014,可读写,复位值未定义。,端口,B,上拉允许,/,禁止寄存器,GPBUP,,地址,0 x56000018,,可读写,复位值,0 x00,。,第四个保留未用。,各寄存器具体含义见表,7-3,、表,7-4,和表,7-5,。,17,表,7-3,端口,B,引脚配置寄存器含义,GPBCON,位,描 述,GPB10,21:20,00=,输入,01=,输出,10=,nXDREQ0,11=,保留,GPB9,19:18,00=,输入,01=,输出,10=,nXDACK0,11=,保留,GPB8,17:16,00=,输入,01=,输出,10=,nXDREQ1,11=,保留,GPB7,15:14,00=,输入,01=,输出,10=,nXDACK1,11=,保留,GPB6,13:12,00=,输入,01=,输出,10=,nXBREQ,11=,保留,GPB5,11:10,00=,输入,01=,输出,10=,nXBACK,11=,保留,GPB4,9:8,00=,输入,01=,输出,10=,TCLK0,11=,保留,GPB3,7:6,00=,输入,01=,输出,10=,TOUT3,11=,保留,GPB2,5:4,00=,输入,01=,输出,10=,TOUT2,11=,保留,GPB1,3:2,00=,输入,01=,输出,10=,TOUT1,11=,保留,GPB0,1:0,00=,输入,01=,输出,10=,TOUT0,11=,保留,18,GPBDAT,位,描 述,GPA10:0,10:0,当该端口被配置为输入端口时,从输入引脚来的外部信号能够从这个寄存器的对应位读出。,当该端口被配置为输出端口时,写到这个寄存器中的数据能够被送到对应的引脚。,当该端口被配置为功能引脚时,读入值未定义,表,7-4,端口,B,数据寄存器含义,表,7-5,端口,B,上拉寄存器含义,GPBUP,位,描 述,GPA10:0,10:0,0,:连接到对应端口引脚的上拉功能被允许。,1,:连接到对应端口引脚的上拉功能被禁止。,19,端口,C,寄存器组,各寄存器具体含义见表,7-6,、表,7-7,和表,7-8,。,端口,D,寄存器组,各寄存器具体含义见表,7-9,、表,7-10,和,7-11,。,端口,E,寄存器组,各寄存器具体含义见表,7-12,、表,7-13,和表,7-14,。,端口,F,寄存器组,各寄存器具体含义见表,7-15,、表,7-16,和表,7-17,。,端口,G,寄存器组,各寄存器具体含义见表,7-18,、表,7-19,和表,7-20,。,端口,H,寄存器组,各寄存器具体含义见表,7-21,、表,7-22,和表,7-23,。,20,7.3.2,其他寄存器,杂项控制寄存器,杂项控制寄存器中的一些位用来对,USB,主机和,USB,设备进行控制;另外一些位用于保护,SDRAM,,以及对数据总线上拉电阻允许,/,禁止等进行控制。,杂项控制寄存器,MISCCR,,地址为,0 x56000080,,可读写,,Reset,值为,0 x10330,。寄存器具体含义见表,7-24,。,SCKE,、,SCLK1,和,SCLK0,引脚信号,,S3C2410A,输出,在,Power_OFF,模式用于保护,SDRAM,。在寄存器,MISCCR,中规定了它们输出信号的方式。,21,DCLK,控制寄存器,DCLK,控制寄存器,DCLKCON,,地址为,0 x56000084,,可读写,,Reset,值为,0 x0,。寄存器具体含义见表,7-25,。,DCLKCON,寄存器定义,DCLK0,、,DCLK1,信号,这两个信号用作外部源时钟,,DCLKn,信号的低电平、高电平时间长度的关系见图,7.1,。,只有当,CLKOUT1:0,被设置成发送,DCLKn,信号时,,DCLKCON,才能够实际操作。,22,图,7.1,DCLKn,高低电平关系,23,外部中断方式控制寄存器组,外部中断控制寄存器组共有,3,个寄存器,寄存器名分别为,EXTINT0,、,EXTINT1,和,EXTINT2,;地址分别为,0 x56000088,、,0 x5600008C,和,0 x56000090,;可读写;,Reset,值均为,0,。,外部中断控制寄存器组,能够配置,EXINT0EXINT23,共,24,个外部中断源中的每一个提出中断请求信号的方式,包括电平方式和边沿方式,同时也配置了信号的极性。,为了识别电平中断,对,EINT15:0,中的,EXTINTn,引脚合法的逻辑电平必须保持最少,40ns,以上。,各寄存器具体含义见表,7-26,、表,7-27,和表,7-28,。,24,外部中断控制寄存器,寄存器,地址,读,/,写,描述,复位值,EXTINT0,外部中断控制寄存器,0,0 x56000088 R/W,使用位,30:0,,分别对,EINT7,EINT0,触发信号进行配置。,000,:低电平触发;,001,:高电平触发;,01x,:下降沿下降;,10 x,:上升沿触发;,11x,:双边沿触发,0 x0,EXTINT1,外部中断控制寄存器,1,0 x5600008C,R/W,使用位,30:0,,分别对,EINT15,EINT8,触发信号进行配置。,0 x0,25,EXTINT2,外部中断控制寄存器,2,0 x56000090,R/W,使用位,30:0,,分别对,EINT23,EINT16,触发信号进行配置。,000,:低电平触发;,001,:高电平触发;,01x,:下降沿下降;,10 x,:上升沿触发;,11x,:双边沿触发。,位,31,为,EINT23,滤波器,使能控制,,1,:使能;,0,:不使能,0 x0,26,外部中断滤波寄存器组,外部中断滤波寄存器组共有,4,个寄存器,前两个保留未用。后两个寄存器分别是,EINTFLT2,和,EINTFLT3,;地址分别是,0 x5600009C,和,0 x560000A0,;可读写;,Reset,值均为,0 x0,。,2,个外部中断滤波寄存器控制,8,个外部中断,EINT23:16,使用的滤波时钟和滤波宽度。,各寄存器具体含义见表,7-29,和表,7-30,,表中,OSC_CLK,即图,6.1,中的,XTIpll,。,27,外部中断屏蔽寄存器,外部中断屏蔽寄存器名为,EINTMASK,,地址为,0 x560000A4,,可读写,,Reset,值为,0 x00FFFFF0,。,外部中断屏蔽寄存器能够对,20,个外部中断源,EINT23:4,分别进行屏蔽,具体含义见表,7-31,。,28,外部中断屏蔽寄存器,寄存器,地址,读,/,写,描述,复位值,EINTMASK,0 x560000A4,R/W,外部中断屏蔽寄存器,,使用位,23:4,控制,EINT23,EINT4,中断屏蔽。,0,:使能中断;,1,:屏蔽中断,0 x00FFFFF0,29,外部中断登记寄存器,外部中断登记寄存器,EINTPEND,供,20,个外部中断,EINT23:4,使用。用户能够清除,EINTPEND,寄存器某一指定位,方法是通过给寄存器对应位写,1,。,外部中断登记寄存器(,external interrupt pending register,)也译作外部中断未决寄存器。,外部中断登记寄存器地址为,0 x560000A8,,可读写,,Reset,值为,0 x0,。,外部中断登记寄存器具体含义见表,7-32,。,1,表示有中断请求。,30,寄存器,地址,读,/,写,描述,复位值,EINTPEND,0 x560000A8,R/W,外部中断登记寄存器,使用位,23:4,控制,EINT23,EINT4,中断请求。,0,:不被请求;,1,:被请求,0 x0,31,通用状态寄存器组,通用状态寄存器组由,5,个寄存器,GSTATUS0GSTATUS4,组成;地址分别为,0 x560000AC,、,0 x560000B0,、,0 x560000B4,、,0 x560000B8,和,0 x560000BC,;前两个寄存器为只读,后,3,个为可读写寄存器;,Reset,值分别为未定义、,0 x32410000,、,0 x1,、,0 x0,和,0 x0,。,各寄存器具体含义见表,7-33,、表,7-34,、表,7-35,、表,7-36,和表,7-37,。,32,通用状态寄存器,寄存器,地址,读,/,写,描述,复位值,GSTATUS0,0 x560000AC,R,外部引脚端状态,Undefined,GSTATUS1,0 x560000B0,R,芯片,ID,0 x32410000,GSTATUS2,0 x560000B4,R/W,复位状态,0 x1,GSTATUS3,0 x560000B8,R/W,Infrom,寄存器,可以利用,nRESET,和看门狗定时器清零,0 x0,GSTATUS4,0 x560000BC,R/W,Infrom,寄存器,可以利用,nRESET,和看门狗定时器清零,0 x0,33,这些寄存器中,可以读取的,S3C2410A,的引脚状态有:,nWAIT,,存储器要求等待(扩展当前总线周期)信号,输入,见表,7-33,,参考表,5-3,。,NCON,,,Nand Flash,配置状态,输入,见表,7-33,,参考表,5-29,。,RnB,,,Nand Flash Ready/Busy,输入信号,见表,7-33,,参考表,5-29,。,nBATT_FLT,,电池状态引脚输入信号,见表,7-33,,参考表,6-1,。,34,7.4 I/O,端口程序举例,在嵌入式系统中能够使用,C,语言对特殊功能寄存器进行读写,特殊功能寄存器位于,S3C2410A,片内。每个特殊功能寄存器都有一个固定地址,通常要在,.H,文件中映射特殊功能寄存器的地址。方法是对每个特殊功能寄存器对应的地址,用预处理命令,define,加以定义。,以下映射方法一的代码取自,C/OS-,的,gpio.h,,方法二的代码取自,Linux,的,arch-s3c2410/s3c2410.h,。,35,方法一:,#define _REG(x)(*(volatile unsigned int*)(x),#define GPIO_CTL_BASE0 x56000000,#define bGPIO(p)_REG(GPIO_CTL_BASE+(p),#define rMISCCRbGPIO(0 x80),/,相当于,#define rMISCCR,(*(volatile unsigned int*)(0 x56000000+0 x80),/,下同,#define rDCLKCONbGPIO(0 x84),#define rEXTINT0 bGPIO(0 x88),#define rGSTATUS3bGPIO(0 xb8),#define rGSTATUS4bGPIO(0 xbc),#define rGPACONbGPIO(0 x00),#define rGPADATbGPIO(0 x04),#define rGPBCON bGPIO(0 x10),#define rGPHCONbGPIO(0 x70),#define rGPHDATbGPIO(0 x74),#define rGPHUPbGPIO(0 x78),36,方法二:,#define GPIO_CTL_BASE 0 x56000000,#define bGPIO(p)_REG(GPIO_CTL_BASE+(p),#define MISCCRbGPIO(0 x80),#define DCLKCON bGPIO(0 x84),#define EXTINT0 bGPIO(0 x88),#define GSTATUS3bGPIO(0 xb8),#define GSTATUS4bGPIO(0 xbc),#define GPACONbGPIO(0 x00),#define GPADATbGPIO(0 x04),#define GPBCONbGPIO(0 x10),#define GPHCONbGPIO(0 x70),#define GPHDATbGPIO(0 x74),#define GPHUPbGPIO(0 x78),37,以下程序是,C/OS-,环境下,针对某开发板具体配置,设置,I/O,端口的一个例子。请读者根据,I/O,端口设置的数据,说出开发板的配置。,38,rGPACON=0 x5ef7ff;,rGPBCON=0 x155559;,rGPBUP =0 x7ff;,rGPCCON=0 xaaaa55aa;,rGPCUP =0 xffff;,rGPDCON=0 xaaaaaaaa;,rGPDUP =0 xffff;,rGPECON=0 xaaaaaaaa;,rGPEUP =0 xffff;,rGPFCON=0 x55aa;,rGPFUP =0 xff;,rGPGCON=0 xff4affb9;,rGPGUP =0 xffff;,rGPGDAT=rGPGDAT,rGPHCON=0 x2afaaa;,rGPHUP =0 x7ff;,39,【,例,7.1】,以下举例程序中,端口,E,、端口,F,作为普通,I/O,端口使用,其中端口,E,的,GPE3,引脚输出控制一个,LED,指示灯、,GPE4,引脚输出控制一个蜂鸣器,如图,7.2,所示;端口,F,用作并行数据输入,若端口,F,对应的引脚上有一位是低电平时,则蜂鸣器发声,,LED,灯亮。,(,见参考书,P243,),40,7.5,中断控制器概述,S3C2410A,片内的中断控制器,接收来自,56,个中断源的中断请求。这些中断源由,S3C2410A,外部中断请求引脚和片内外设提供。片内外设包括,DMA,控制器、,UART,、,IIC,等。在这些中断源中,,UARTn,的,INT_ERRn,、,INT_RXDn,和,INT_TXDn,经过逻辑或以后送到中断控制器,作为,INT_UARTn,。,EINT4EINT7,、,EINT8EINT23,经过逻辑或以后送到中断控制器,作为,EINT4_7,、,EINT8_23,。,41,当从片内外设和外部中断请求引脚接收到多个中断请求时,中断控制器经过仲裁处理后,向,ARM920T,内核请求,FIQ,或,IRQ,中断。,仲裁处理取决于硬件优先权逻辑,并且仲裁结果写入中断登记寄存器,INTPND,(,interrupt pending register,)。用这种方法可以帮助用户,告知在多个中断请求源中,哪一个经过仲裁并送到,ARM920T,内核。,42,图,7.3,是中断处理示意图。,43,有了中断请求,请求源的保存可以分为两种。一种是带子请求寄存器的,如,UARTn,的,INT_ERRn,、,INT_RXDn,和,INT_TXDn,,有了中断请求,请求源要保存在子源登记寄存器,SUBSRCPND,中;另一种是不带子请求寄存器的,如,INT_DMA3,,有了中断请求,请求源要保存在源登记寄存器,SRCPND,中。对于带子请求寄存器的,还要检查中断子屏蔽寄存器,INTSUBMSK,是否对某一个子请求源进行了屏蔽,只有不屏蔽,才能在源登记寄存器,SRCPND,中对应位置,1,。之后,一个或多个中断请求要判断是否被屏蔽;是,IRQ,模式还是,FIQ,模式;如果是,IRQ,模式还要判断多个中断请求的优先权;最后以,IRQ,或,FIQ,请求送,ARM920T,内核。,44,外部中断,EINT4EINT7,、,EINT8EINT23,的请求,要在外部中断登记寄存器,EINTPEND,中保存,检查外部中断屏蔽寄存器,EINTMASK,是否屏蔽,如果不屏蔽,才能送到源登记寄存器,SRCPND,的对应位,EINT4_7,、,EINT8_23,。,中断控制器用到的,S3C2410A,引脚信号有,EINT0EINT23,和,nBATT_FLT,。,45,7.6,中断控制器操作、中断源及中断优先权,7.6.1,中断控制器操作,程序状态寄存器(,PSR,)中的,F,位和,I,位,如果,ARM920T CPU,中的,PSR,的,F,位被设置为,1,,,CPU,不接受来自中断控制器的快速中断请求(,Fast Interrupt Request,,,FIQ,)。同样,如果,I,位被设置为,1,,,CPU,不接受来自中断控制器的中断请求(,Interrupt Request,,,IRQ,)。因此,通过清除,PSR,的,F,位或,I,位为,0,,同时设置中断屏蔽寄存器,INTMSK,的对应位为,0,,送到中断控制器的中断请求才能被处理。,46,中断模式,ARM920T,有,2,种类型的中断模式:,FIQ,或,IRQ,,所有的中断源在中断请求时,要确定该中断源被设置成哪一种模式。中断模式寄存器,INTMOD,中的每,1,位,指示一个中断源被设置成了哪一种模式。所有中断源中,只有,1,个可以设置成,FIQ,模式。,47,中断登记寄存器,S3C2410A,中有两个中断登记寄存器,一个是源登记寄存器,SRCPND,,另一个是中断登记寄存器,INTPND,。这两个登记寄存器指示一个中断请求是或否被登记(记录)。当多个中断源同时请求中断服务时,寄存器,SRCPND,多个对应位被设置成,1,。与此同时,经过仲裁处理后,寄存器,INTPND,中仅仅,1,位被自动地设置为,1,。如果多个中断被屏蔽,这些中断源同时请求中断服务时,寄存器,SRCPND,中的对应位仍被设置为,1,,但是不引起寄存器,INTPND,值的改变。当寄存器,INTPND,中的,1,位被设置为,1,时,如果这,1,位对应,IRQ,请求,并且,PSR,中的,I,位为,0,;或者这,1,位对应,FIQ,请求,并且,PSR,中的,F,位为,0,,就会进入相应的中断服务程序。,48,寄存器,SRCPND,和,INTPND,能被读或写,中断服务程序必须清除相应的登记位,方法是通过写,1,到,SRCPND,的对应位,能够将该位清,0,。然后再写,1,到,INTPND,的对应位,能够将,INTPND,的对应位清,0,。,中断登记寄存器(,interrupt pending register,),也译作中断未决寄存器。,49,中断屏蔽寄存器,中断屏蔽寄存器,INTMSK,中的某,1,位被设置为,1,,指示对应的中断已经被屏蔽(禁止)。如果寄存器,INTMSK,中的某,1,位为,0,,这,1,位对应的中断源产生的中断请求,通常将被服务。,如果寄存器,INTMSK,中的某,1,位为,1,,并且该位对应的中断源产生了中断请求,源登记寄存器,SRCPND,中对应的源登记位将被置,1,。,50,7.6.2,中断源,中断控制器支持,56,个中断源,如表,7-38,所示。,51,7.6.3,中断优先权产生模块,用于,32,个中断请求的优先权逻辑由,7,个仲裁器(,arbiter,)组成,其中,6,个为第一级仲裁器,一个为第二级仲裁器,如图,7.4,所示。,在图,7.4,中,每个仲裁器,根据优先权寄存器,PRIORITY,中的,1,位仲裁模式控制(,ARB_MODE,)和,2,位选择控制信号(,ARB_SEL,)中的值,以如下方式,处理连接在仲裁器上的,6,个中断请求,参见表,7-39(P247),。,52,图,7.4,53,7.7,中断控制器特殊功能寄存器,中断控制器特殊功能寄存器可以分为两组,一组由源登记寄存器、中断模式寄存器、中断屏蔽寄存器、优先权寄存器和中断登记寄存器组成。另一组由中断偏移寄存器、子源登记寄存器和中断子屏蔽寄存器组成。,来自中断源的所有中断请求,都要在源登记寄存器中被登记(记录)。根据中断模式寄存器,它们被分为两组:快速中断请求,FIQ,和中断请求,IRQ,。对于同时来的多个,IRQ,请求,仲裁器依优先权寄存器的设置进行仲裁。,54,源登记寄存器,源登记寄存器,SRCPND,由,32,位组成,其中每,1,位与,1,个中断源相对应。,源登记寄存器,SRCPND,地址为,0 x4A000000,,可读写,,Reset,值为,0 x00000000,,具体含义见表,7-40,。,55,中断模式寄存器,中断模式寄存器,INTMOD,由,32,位组成,它们中的每一位对应一个中断源。中断模式寄存器,INTMOD,地址为,0 x4A000004,,可读写,,Reset,值为,0 x00000000,,具体含义见表,7-41,。,56,中断屏蔽寄存器,中断屏蔽寄存器,INTMSK,由,32,位组成,它们中的每,1,位对应,1,个中断源。,中断屏蔽寄存器,INTMSK,地址为,0 x4A000008,,可读写,,Reset,值为,0 xFFFFFFFF,,具体含义见表,7-42,。,57,优先权寄存器,优先权寄存器,PRIORITY,,地址为,0 x4A00000C,,可读写,,Reset,值为,0 x7F,,具体含义见表,7-43,。,中断登记寄存器,中断登记寄存器,INTPND,地址为,0 x4A000010,,可读写,,Reset,值为,0 x00000000,,具体含义见表,7-44,。,58,中断偏移寄存器,中断偏移寄存器,INTOFFSET,中的值是偏移值,表明了,IRQ,模式的哪一个中断请求记录在,INTPND,寄存器中。,中断偏移寄存器,INTOFFSET,地址为,0 x4A000014,,只读,,Reset,值为,0 x00000000,,具体含义见表,7-45,。,59,子源登记寄存器,子源登记寄存器(,sub source pending register,),SUBSRCPND,中的每,1,位,指示对应的子中断源有无中断请求。,子源登记寄存器,SUBSRCPND,地址为,0 x4A000018,,可读写,,Reset,值为,0 x00000000,,具体含义见表,7-46,。,60,中断子屏蔽寄存器,中断子屏蔽寄存器(,interrupt sub mask register,),INTSUBMSK 11,位中的每,1,位,对应,1,个子中断源。,中断子屏蔽寄存器,INTSUBMSK,地址为,0 x4A00001C,,可读写,,Reset,值为,0 x7FF,,具体含义见表,7-47,。,61,7.8,中断程序举例,【,例,7.2】,对于某公司生产的,S3C2410X,开发板,假设,4,个开关分别连接到,S3C2410X,(,S3C2410X,与,S3C2410A,功能完全相同)芯片的,GPF0/GPF2/GPG3/GPG11 4,个引脚,这,4,个引脚设置为中断请求引脚,与中断请求和中断处理相关的内容有:,中断初始化,中断初始化函数中与本例对应的,C,语言代码如下:,62,rGPFCON|=20|24;,/,设置,GPF0,、,GPF2,为,EINT0,、,EINT2,功能,rGPGCON|=26|222;,/,设置,GPG3,、,GPG11,为,EINT11,、,EINT19,功能,rINTMOD=0;,/,中断模式寄存器设置为,0,,所有中断均为,IRQ,类型,rEXTINT0|=40|48;/,设置,EINT0,、,EINT2,上升沿触发,rEXTINT1|=412;/,设置,EINT11,上升沿触发,rEXTINT2|=412;/,设置,EINT19,上升沿触发,rEINTMASK,/EINT11,、,EINT19,对应屏蔽位置,0,,允许服务,rINTMSK,/EINT0,、,EINT2,、,EINT8_23,对应屏蔽位置,0,,允许服务,/,假定中断优先权寄存器的值使用已经设定过的值,,/,此处不再设置,63,中断请求,一旦这,4,个中断请求引脚出现一个或多个中断请求,则:,如果,EINT0,或,EINT2,有请求,源登记寄存器,SRCPND0,或,SRCPND2,被自动置,1,;,如果,EINT11,或,EINT19,有请求,外部中断登记寄存器,EINTPEND11,或,EINTPEND19,被自动置,1,,并且源登记寄存器,SRCPND5,被自动置,1,;,由于这些中断都没有被屏蔽,经过优先权仲裁器,优先权最高的中断请求,在中断登记寄存器,INTPND,中的对应位被置,1,,中断偏移寄存器,INTOFFSET,中自动被设置相应的偏移量;,作为,IRQ,请求送,ARM920T,内核;,ARM920T CPU,的当前程序状态寄存器,CPSR,中如果,I,位为,0,时,表示允许,IRQ,中断,当前正在执行的指令执行结束后,,CPU,响应,IRQ,请求。,64,中断响应,在中断响应过程,,ARM920T CPU,自动完成以下操作:,将,PC,的值,保存到,IRQ,方式下的连接寄存器,LR,中,返回时用;,将当前程序状态寄存器,CPSR,内容保存到,IRQ,方式下的保留程序状态寄存器,SPSR,中;,强制设置程序状态寄存器的方式位,CPSR4:0,为,10010,,系统进入,IRQ,方式;,强制设置程序状态寄存器的,T,状态位,CPSR5,为,0,,系统进入,ARM,状态;,强制设置程序状态寄存器的,IRQ,禁止位,CPSR7,为,1,,禁止,CPU,再次响应,IRQ,请求;,通常(没采用高向量地址配置)将,IRQ,异常入口地址,0 x00000018,送程序计数器,PC,。此后程序从,0 x00000018,处执行,分支到,IRQ,中断服务程序。,65,发生异常后,异常入口地址及这些地址中存放的指令见表,7-48,,表中对应,IRQ,的入口地址,0 x00000018,内,存放的是分支指令,B HandlerIRQ,,,HandlerIRQ,通常是,IRQ,中断服务程序的入口地址。,然而,由于表,7-48,中分支指令,B,的分支范围为,32MB,,当中断服务程序在内存中保存后,如果首地址离异常入口地址较远,超过,32MB,时,需要增加一段代码。这段代码应该与异常入口地址较近,并且能够分支到异常(中断)服务程序。例如对于中断请求,IRQ,,有以下代码:,66,HandlerIRQ ;,标号,程序入口,,;,由,0 x00000018,中,B HandlerIRQ,;,指令分支到此处,SUB SP,SP,#4 ;,修改栈指针,在栈顶留出,4,;,字节空间,后续指令,;STR R0,SP,#4,将,R0,内容填入,STMFD SP!,R0 ;,保存工作寄存器,R0,内容,LDR R0,=HandleIRQ,;,取出保存,HandleIRQ,异常向量的表地址,LDR R0,R0 ;,表地址的内容,即,HandleIRQ,地址,送,R0,STR R0,SP,#4 ;R0,的值,即,HandleIRQ,地址,存堆栈,LDMFD SP!,R0,PC,;,恢复工作寄存器,R0,内容;出栈,;HandleIRQ,地址到,PC,,实现分支,67,上述代码中的,HandleIRQ,是,IRQ,中断服务程序的入口地址,各异常(中断)服务程序的入口地址在异常向量表中已经定义。,68,;,异常向量表,HandleReset#4,;Reset,异常服务程序入口地址,占,4,字节,HandleUndef#4,HandleSWI#4,HandlePabort#4,HandleDabort#4,HandleReserved#4,HandleIRQ#4,;IRQ,中断服务程序入口地址,占,4,字节,HandleFIQ#4,69,中断向量表,进入,IRQ,中断服务程序后,要区分是哪个中断源提出了请求,并且应该转到对应的服务程序。,中断登记寄存器,INTPND,的,32,位对应的,32,个中断源,有,32,段服务程序与之相对应。用,32,段服务程序中每段程序的起始地址,可以建立一个表,称为中断向量表。中断向量表如下:,70,;,中断向量表,HandleEINT0#4;HandleEINT0,是,EINT0,中断源,;,对应的程序入口地址,长度为,4,字节,HandleEINT1#4,HandleEINT2#4,HandleEINT3#4,HandleEINT4_7#4;HandleEINT4_7,是,;EINT4EINT7,中断源对应的程序入口地址,,;,进入该程序,还要根据外部中断登记寄存器,;EINTPEND,区分,4,个中断源中哪一
展开阅读全文