二 ARM9(S3C2440)的IO口——理论知识及程序实例
转载自:骨Zi里德骄傲
概述
S3C2440A 包含了130 个多功能输入/输出口引脚并且它们为如下显示的八个端口:
– 端口A(GPA):25 位输出端口 – 端口B(GPB):11 位输入/输出端口 – 端口C(GPC):16 位输入/输出端口 – 端口D(GPD):16 位输入/输出端口 – 端口E(GPE):16 位输入/输出端口 – 端口F(GPF):8 位输入/输出端口 – 端口G(GPG):16 位输入/输出端口 – 端口H(GPH):9 位输入/输出端口 – 端口J(GPJ):13 位输入/输出端口
每个端口都可以简单的由软件配置为各种系统配置和设计要求。你必须在开始主程序前定义使用的每个引脚的功能。如果没有使用某个引脚的复用功能,这个引脚可以配置为I/O 口。
端口控制描述
端口配置寄存器(GPACON 至GPJCON) S3C2440A 中,大多数端口为复用引脚。因此要决定每个引脚选择哪项功能。PnCON(引脚控制寄存器)决定了每个引脚使用哪项功能。
如果在掉电模式中PE0 至PE7 用于唤醒信号,这些端口必须配置为输入模式。 端口数据寄存器(GPADAT 至GPJDAT)如果端口配置为输出端口,可以写入数据到PnDAT 的相应位。如果端口配置为输入端口,可以从PnDAT 的相应位读取数据。
端口上拉寄存器(GPBUP 至GPJUP)
端口上拉寄存器控制每个端口组的使能/禁止上拉电阻。当相应位为0 时使能引脚的上拉电阻。当为1 时禁止上拉电阻。 如果使能了上拉电阻,那么上拉电阻与引脚的功能设置无关(输入、输出、DATAn、EINTn 等等) 杂项控制寄存器
此寄存器控制睡眠模式,USB 引脚和CLKOUT 选择的数据端口上拉电阻。 外部中断控制寄存器
24 个外部中断由各种信号方式触发。EXTINT 寄存器为外部中断请求配置信号触发方式为低电平触发、高电平触发、下降沿触发、上升沿触发或双边沿触发。由于每个外部中断引脚包含一个数字滤波器,中断控制可以确认请求信号是否长于3 个时钟。
EINT[15:0]用于唤醒源
下面是结合具体的程序(用的是FL2440开发板): 一般步骤:
上拉寄存器和控制寄存器设置",
I/O口上拉寄存器和控制寄存器设置比较简单,首先确定I/O 口工作模式,如果
是工作在第二功能状态,则上拉电阻功能禁止,即 GPBUP~GPHUP 中相应位置 1;如果工作在基本输入 /输出状态,则上拉电阻功能允许,此时因上电或复位时 GPBUP~GPHUP 初值为 0,所以在程序中不用设置。 ",
I/O口数据寄存器中每一位输入 /输出功能大多由 I/O 口控制寄存器中两位控制,如 GPHDATA[0],即 GPH0 的
输入 /输出功能,由 GPHCON[1:0] 控制, GPHCON[1:0]=0 0,该位作输入;GPHCON[1:0]=0 1 ,该位作输出; GPHCON[1:0]=1 0 ,该位作nCTS0;GPHCON[1 :0]=1 1,系统保留没用。其他各口与此相同,编写 I/O 程序时一定注意 GPnCON 和GPnDATA 中位的对应关系。 ",
I/O口与外围设备连接一般要通过光电隔离或其他隔离器件,直接相连一定要确认负载不能超过 4个与非门。光电隔离一是可保护微处理器;二是可进行电平转换;三是可对某些信号进行分配,所以在一般情况下都要加。 #define GPBCON (*(volatile unsigned *)0x56000010) #define GPBDAT (*(volatile unsigned *)0x56000014) #define GPBUP (*(volatile unsigned *)0x56000018) #define uchar unsigned char #define uint unsigned int
void Delay(int x);
void Delay(int x) {
int k, j; while(x) {
for (k=0;k<=0xff;k++) for(j=0;j<=0xff;j++); x--; } }
int ledMain(void) {
GPBCON = 0x1dd7fc; // GPB5,GPB6,GPB8,GPB10设置为输出 GPBDAT = ((1<<5)|(1<<6)|(1<<8)|(1<<10)); //使LED全灭 GPBDAT&=0xffe; //关闭蜂鸣器
GPBUP = 0x00; //使能上拉寄存器,因为作为输出口所以要使能上拉
while (1) // 死循环 {
GPBDAT = ~(1<<5); //LED0亮 Delay(500);
GPBDAT = ~(1<<6); //LED1亮 Delay(500);
GPBDAT = ~(1<<8); //LED2亮 Delay(500);
GPBDAT = ~(1<<10); //LED3亮 Delay(500); }
return 0; }
相关推荐: