1.74k likes | 1.94k Views
4.4 处理器接口电路、中断系统的设计. 4.4.1 通用输入 / 输出接口 GPIO 设计 4.4.2 中断系统设计 4.4.3 串行接口设计 4.4.4 USB 接口设计 4.4.5 JTAG 接口设计 4.4.6 A/D 转换接口设计. 4.4.1 通用输入 / 输出接口 GPIO.
E N D
4.4 处理器接口电路、中断系统的设计 4.4.1 通用输入/输出接口GPIO设计 4.4.2 中断系统设计 4.4.3 串行接口设计 4.4.4 USB接口设计 4.4.5 JTAG接口设计 4.4.6 A/D转换接口设计
4.4.1 通用输入/输出接口GPIO 嵌入式系统的GPIO接口引脚数量较多,例如,S3C44BO有71个,S3C2410有117个,PXA255有84个GPIO管脚, PXA270有120个GPIO管脚。它们与处理器之间的连接一般不使用系统总线,而是直接连接在处理器的引脚上。每个I/O引脚可被编程设置成为普通的输入或输出状态。如被作为输入端时,该GPIO管脚可被设置工作在中断方式或查询方式。但当系统被复位后,所有的GPIO管脚的默认值为输入状态。有些GPIO管脚还通过设置具有第二功能。 每个处理器内的GPIO又分成若干个组(端口),每组称为一个I/O接口。每个接口含有10-20多个引脚不等。
1、I/O系统工作过程 完成设备管理相关信息的初始化,如创建驱动程序地址表、设备名表、文件记录表等 设备管理初始化 I/O系统的初始化 驱动逻辑初始化 实现系统中各驱动程序的注册,即把系统中各驱动程序注册到设备管理中 硬件抽象初始化 主要完成设备注册 设备打开 设备读 设备写 设备控制 设备关闭
I/O系统工作过程 • 关闭设备 • 系统调用close( )关闭一个不再使用的设备,关闭一个设备时,I/O系统的内部运作过程和写一个设备大致相同,不同的是I/O系统根据设备名表中的主设备号在驱动程序地址表中定位并调用驱动程序的xxx_close( )函数,然后释放文件表中的记录,返回。在此之后对该文件描述符的任何引用都将返回错误。但是随后的open( )系统调用将仍然返回该文件描述符。
1) GPIO的配置 GPIO接口的控制器通常集成在处理器芯片内部。在系统启动时应对它们进行正确设置,GPIO的设置需要用到三组特殊功能寄存器来定义I/O引脚的具体功能。第一组时端口配置寄存器组(PCONA-PCONG),第二组是端口数据寄存器组(PDATA-PDATG),第三组是端口上拉电阻设置寄存器(PUPA-PUOG),其中A-G为端口序号。如: GPDR(方向寄存器):负责设置GPIO的输入、输出功能。 GPSR(输出置位寄存器):在输出模式下,可以通过GPSR设置GPIO管脚上的高电平值。 GPCR (输出清零寄存器):在输出模式下,可以通过GPCR设置GPIO管脚为低电平值。
GPLR(引脚状态寄存器):当某管脚设置为输入模式时,读GPLR(引脚状态寄存器)的内容可以反映当前GPIO管脚的状态。GPLR(引脚状态寄存器):当某管脚设置为输入模式时,读GPLR(引脚状态寄存器)的内容可以反映当前GPIO管脚的状态。 GPER是探测上升沿使能的专用寄存器; GFER是探测下降沿使能的专用寄存器; GEDR是探测上升下降沿使能的专用寄存器; GAFR是设置第二功能寄存器。
2)GPIO的设计要求 在并行信号传输线中,一般有数据线、控制线和电源线。由于每条数据导线传输一个数据位,这时要求数据总线长度必须较短,否则长的导线会导致有较高的寄生电容值,影响数据的传输速度。 此外,并行总线中各导线长度上的小差异,也可能导致所接受的数据字各位的抵达时间不同,影响数据的准确性。 基于ARM的处理器内核和处理器核一般都没有I/O总线部件,需要通过先进微控制总线架构AMBA来扩展宏单元和总线I/O部件,为微处理器提供32位地址信号、32位数据信号和读/写、时钟、外围复位、选通等控制信号。
3)编址形式 ARM采用存储器与I/O统一编址的方式,即把I/O端口当作为特殊的存储器地址来对待处理。 比如S3C44B0X微处理器芯片,芯片内部具有71个通用多功能输入输出引脚,分别包含在如下7组端口中: • 1个10位输出端口(端口A); • 1个11位输出端口(端口B); • 1个16位输入/输出端口(端口C); • 2个8位输入/输出端口(端口D和G); • 2个9位输入/输出端口(端口E和F)。
举例 PXA27X处理器提供了120个的GPIO,其分组如下: 端口A通用目地的I/O; 端口B可选输入功能; 端口C可选输入功能; 端口D可选输入功能; 端口E可选输出功能; 端口F可选输出功能; 端口G可选输出功能。
2、S3C2410处理器GPIO设计与应用 S3C2410X有8个端口,117个输入/输出引脚。这些端口是: A口(GPA):23个输出口 B口(GPB):11个输入/输出口 C口(GPC):16个输入/输出口 D口(GPD):16个输入/输出口 E口(GPE):16个输入/输出口 F口(GPF):8个输入/输出口 G口(GPG):16个输入/输出口 H口(GPH):11个输入/输出口 这些端口都具有多功能,通过引脚配置寄存器,可以将其设置为所需要的功能,如:I/O功能、中断功能等等。
1)端口寄存器及引脚配置 每一个端口都有4个寄存器,它们是:引脚配置寄存器、数据寄存器、引脚上拉寄存器等。
(1)端口A寄存器及引脚配置 GPADAT寄存器为准备输出的数据 其值为23位[22:0] 注意: (1)当A口引脚配置为非输出功能时,其输出无意义; (2)从引脚输入没有意义。
(2)端口B寄存器及引脚配置 GPBDAT---为准备输出或输入的数据 其值为11位[10:0] GPBUP---端口B上拉寄存器,位[10:0]有意义。 0:对应引脚设置为上拉 1:无上拉功能 注意:当B口引脚配置为非输入/输出功能时,其寄存器中的值没有意义。
(3)端口C寄存器及引脚配置 GPCDAT---为准备输出或输入的数据 其值为16位[15:0] GPCUP---端口C上拉寄存器,位[15:0]有意义。 0:对应引脚设置为上拉 1:无上拉功能 注意:当C口引脚配置为非输入/输出功能时,其寄存器中的值没有意义。
(4)端口D寄存器及引脚配置 GPDDAT---为准备输出或输入的数据 其值为16位[15:0] GPDUP---端口D上拉寄存器,位[15:0]有意义。 0:对应引脚设置为上拉 1:无上拉功能 初始化时,[15:12]无上拉功能,而[11:0]有上拉 注意:当D口引脚配置为非输入/输出功能时,其寄存器中的值没有意义。
(5)端口E寄存器及引脚配置 GPEDAT---为准备输出或输入的数据 其值为16位[15:0] GPEUP---端口E上拉寄存器,位[15:0]有意义。 0:对应引脚设置为上拉 1:无上拉功能 初始化时,各个引脚都有上拉功能。 注意:当E口引脚配置为非输入/输出功能时,其寄存器中的值没有意义。
(6)端口F寄存器及引脚配置 GPFDAT---为准备输出或输入的数据 其值为8位[7:0] GPFUP---端口F上拉寄存器,位[7:0]有意义。 0:对应引脚设置为上拉 1:无上拉功能 初始化时,各个引脚都有上拉功能。 注意:当F口引脚配置为非输入/输出功能时,其寄存器中的值没有意义。
(7)端口G寄存器及引脚配置 GPGDAT---为准备输出或输入的数据 其值为16位[15:0] GPGUP---端口G上拉寄存器,位[15:0]有意义。 0:对应引脚设置为上拉 1:无上拉功能 初始化时,[15:11]引脚无上拉功能,其它引脚有。 注意:当G口引脚配置为非输入/输出功能时,其寄存器中的值没有意义。
端口G引脚配置寄存器 LCD-PEN:POWER_ENABLE nSS0:SPI0_SELECT
(8)端口H寄存器及引脚配置 GPHDAT---为准备输出或输入的数据 其值为11位[10:0] GPHUP---端口H上拉寄存器,位[10:0]有意义。 0:对应引脚设置为上拉 1:无上拉功能 注意:当H口引脚配置为非输入/输出功能时,其寄存器中的值没有意义。
端口H引脚配置寄存器 UCLK为USB的
①MISCCR---混合控制寄存器 nEN_SCKE---SCLK使能位。在电源关闭模式下对SDRAM做保护0: 正常状态 1:低电平 nEN_SCLKx---SCLKx使能位。在电源关闭模式下对SDRAM做保护 0:SCLKx= SCLK 1:低电平 nRSTCON---对nRSTOUT软件复位控制位 0:使nRSTOUT为低,0;1:使nRSTOUT为高,1
USBSUSPND1---USB端口1模式 0:正常 1:浮空 USBSUSPND0---USB端口0模式 0:正常 1:浮空 CLKSEL1 --- CLKOUT1引脚输出信号源选择 000:MPLL CLK 001:UPLL CLK 010:FCLK 011:HCLK 100:PCLK 101:DCLK1 11x:保留 CLKSEL0 --- CLKOUT0引脚输出信号源选择 000:MPLL CLK 001:UPLL CLK 010:FCLK 011:HCLK 100:PCLK 101:DCLK0 11x:保留
USBPAD---与USB连接选择 0:与USB设备连接 1:与USB主机连接 MEM_HZ_CON---MEM高阻控制位 0:Hi-Z 1:前一状态 SPUCR_L---数据口低16位[15:0]上拉控制位 0:上拉 1:无上拉 SPUCR_H---数据口高16位[31:16]上拉控制位 0:上拉 1:无上拉
②DCLKCON---D时钟控制寄存器 DCLK1(0)CMP---DCLK1(0)低电平时间所占的比例数。 设该位值为m,m< DCLK1(0)DIV。 则低、高电平持续时间的源周期数分别为: m+1、DCLK1(0)DIV-m DCLK1(0)DIV---DCLK1(0)分频值 DCLK1(0) frequency = source clock / ( DCLK1(0)DIV + 1 )
DCLKCON---D时钟控制寄存器(续) DCLK1(0)SelCK---DCLK1(0) source clock 选择 0 : 源时钟选择PCLK 1:源时钟选择UCLK ( USB ) DCLK1(0)EN---DCLK1(0) Enable 0:禁止 1:允许
(10)外中断控制寄存器 主要设置各个外中断源的触发方式、滤波
①EXTINT0---外中断触发方式控制寄存器0 EINT0~7---中断请求信号触发方式选择 000:低电平触发 001:高电平触发 01x:下降沿触发 10x:上升沿触发 11x:双边沿触发 第3、7、11、15、19、23、27、31位---保留
②EXTINT1---外中断触发方式控制寄存器1 EINT8~15---中断请求信号触发方式选择 000:低电平触发 001:高电平触发 01x:下降沿触发 10x:上升沿触发 11x:双边沿触发 第3、7、11、15、19、23、27、31位---保留
③EXTINT2---外中断控制寄存器2 EINT16~23---外中断请求信号触发方式选择 000:低电平触发 001:高电平触发 01x:下降沿触发 10x:上升沿触发 11x:双边沿触发 第3、7、11、15、19、23、27、31位---为FILTEN 各引脚滤波控制位 0:禁止滤波 1:使能滤波
(11)外中断滤波控制寄存器 主要设置各个外中断源的滤波器设置
①EINTFLT2---外中断滤波控制寄存器2 FLTCLK16~19---外中断16~19滤波器时钟选择 0:PCLK 1:外部/振荡时钟(由OM引脚选择) EINTFLT16~19---外中断16~19滤波器宽度(频带宽度)
②EINTFLT3---外中断滤波控制寄存器3 FLTCLK20~23---外中断20~23滤波器时钟选择 0:PCLK 1:外部/振荡时钟(由OM引脚选择) EINTFLT20~23---外中断20~23滤波器宽度(频带宽度)
外中断屏蔽寄存器 各位: 0:允许中断 1:禁止中断 注意: EINT0--- EINT3不能在此被屏蔽,在SRCPND中屏蔽。
外中断标志寄存器 各位: 0:无中断请求 1:有中断请求 注意:对某位写1,则清除相应标志,即清为0.
(13)外中断状态寄存器 GSTATUS3、4: 复位时被清0,其它情况下其数据不变。 用户可以用于保存数据。
①GSTATUS0---外部引脚状态寄存器 nWEIT---引脚nWEIT状态 nCON---引脚nCON状态 RnB---引脚R/nB状态 nBATT_FLT---引脚nBATT_FLT状态 注意:各位的数值0、1,随着对应引脚变化。
②GSTATUS2---复位状态寄存器 WDTRST---上电复位控制状态 1:出现了上电复位 对该位写,则将该位清0 OFFRST---掉电模式复位状态。 1:系统出现了从掉电模式唤醒复位 对该位写,则将该位清0 PWRST---看门狗复位状态 1:系统出现了看门狗定时器复位 对该位写,则将该位清0 第13讲到此
外中断举例 static void __irq Eint0Int(void) { ClearPending(BIT_EINT0); Uart_Printf("EINT0 interrupt is occurred.\n"); } static void __irq Eint1Int(void) { ClearPending(BIT_EINT1); Uart_Printf("EINT1 interrupt is occurred.\n"); } #define ClearPending(bit) {\rSRCPND = bit;\ rINTPND = bit;\ rINTPND;\ }
void Test_Eint(void) { int i; int extintMode; //选择外中断触发方式变量 Uart_Printf("[External Interrupt Test]\n"); Uart_Printf("1.L-LEVEL 2.H-LEVEL 3.F-EDGE 4.R-EDGE 5.B-EDGE\n"); Uart_Printf("Select the external interrupt type.\n"); extintMode=Uart_Getch(); //extintMode='3'; rGPFCON = (rGPFCON & 0xfffa)|(1<<3)|(1<<1); // 设置引脚配置,F0、F1配置为EINT0/1
switch(extintMode) { case '1': rEXTINT0 = (rEXTINT0 & ~((7<<4) | (0x7<<0))) | 0x0<<4 | 0x0<<0; //EINT0/1=low level triggered break; case '2': rEXTINT0 = (rEXTINT0 & ~((7<<4) | (0x7<<0))) | 0x1<<4 | 0x1<<0; //EINT0/1=high level triggered break; case '3': rEXTINT0 = (rEXTINT0 & ~((7<<4) | (0x7<<0))) | 0x2<<4 | 0x2<<0; //EINT0/1=falling edge triggered break;
case '4': rEXTINT0 = (rEXTINT0 & ~((7<<4) | (0x7<<0))) | 0x4<<4 | 0x4<<0; //EINT0/1=rising edge triggered break; case '5': rEXTINT0 = (rEXTINT0 & ~((7<<4) | (0x7<<0))) | 0x6<<4 | 0x6<<0; //EINT0/1=both edge triggered break; default: break; }