black mirror 百度云:二 ARM9(S3C2440)的IO口——理论知识及程序实例

来源:百度文库 编辑:中财网 时间:2024/04/30 03:41:50

二 ARM9(S3C2440)的IO口——理论知识及程序实例

(2011-08-05 14:27:16) 转载标签:

杂谈

分类: ARM9裸机学习笔记 概述
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; 
}