欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

基于S3C2410的通用IO编程 编程设计模式UPF#工作 

程序员文章站 2022-07-05 21:54:29
...
一、通用IO的定义
GPIO(General-Purpose IO ports),通用的IO口。一般的微控制芯片都提供通用的可编程接口。按照它们的功能分成:
l通用IO控制寄存器
l通过IO数据寄存器
很多MCU的GPIO接口出去了标准的寄存器必须外,还会提供上拉寄存器,可以设置IO的输出模式为高阻。
二、S3C2410A的通用IO寄存器
S3C2410A共有117个复用的输入/输出端口,分别是端口A~H,共8组。按照其位数不同不同可分为:
l端口A(GPA),23位输出口
l端口B(GPB),11位输出口
l端口C(GPC),16位输出口
l端口D(GPD),16位输出口
l端口E(GPE),16位输出口
l端口F(GPF),8位输出口
l端口G(GPG),16位输出口
l端口H(GPH),11位输出口
为了满足不同设计要求,每个IO口可以设置成不同的工作模式,其中又可以将IO口分成如下3类:
l端口控制寄存器(GPACON~CPHCON)
设置引脚工作模式,例如:输入、输出、外部中断和保留。
l端口数据寄存器(GPADAT~CPHDAT)
当端口被设置成输入模式,可以向GPxDAT的相应位写入数据;当端口被设置成输出模式,可以从GPxDAT的相应位读出数据
l端口上拉寄存器(GPAUP~CPHUP)
控制某一端口的响应位的上拉电阻状态(允许/禁止)。
0 – 响应的上拉电阻被允许
1 – 响应的上拉电阻被禁止
参看S3C2410A数据手册
三 编程实例
(1) 编程目的
控制和S3C2410A芯片IO连接的几个LED有规律的点亮。
(2) 电路原理
电路原理如图1所示:
基于S3C2410的通用IO编程
            
    
    
        编程设计模式UPF#工作 
图1 电路原理图
四个LED发光二极管分别与S3C2410A的GPF4~GPF7相连,通过GPF4~GPF7的引脚高低电平变化控制LED的点亮和熄灭。由图1可以清晰的看出当GPF4~GPF7输出低电平时LED点亮,反之当GPF4~GPF7输出高电平时LED熄灭。
(3) 代码分析
在头文件中定义了相关的寄存器

#define rGPFCON (*(volatile unsigned *)0x56000050) //Port F control
#define rGPFDAT (*(volatile unsigned *)0x56000054) //Port F data
#define rGPFUP (*(volatile unsigned *)0x56000058) //Pull-up control F
操作相关寄存器,使得LED能够规律的工作

void led_test(void)
{
rGPFCON=0x5500; // SET PORTF7/6/5/4 OUTPUT
rGPFUP=0; // PULL-UP ENABLE
uart_printf("/n I/O (Diode Led) Test Example/n");
led_on();
led_off();
led_on_off();
delay(1000);
rGPFCON = 0x55aa; // GPF1,GPF0=10 :EINT1,EINT0,(2410lib.c) uart_printf(" end./n");
}

/******************************************************************************* name: led_on
* func: turn on the leds one by one
******************************************************************************/
void led_on(void)
{
int i,nOut;
nOut = 0xF0;
//rGPFDAT=nOut & 0x10;
rGPFDAT=nOut & 0xd0;
for(i=0;i<100000;i++);
rGPFDAT = nOut & 0x50;//0x70
for(i=0;i<100000;i++);
rGPFDAT=nOut & 0x40; //0x00
for(i=0;i<100000;i++);
rGPFDAT=nOut & 0x00; //0x30
for(i=0;i<100000;i++);
rGPFDAT=nOut ;
}

/******************************************************************************* name: led_off
* func: turn off the leds one by one
******************************************************************************/void led_off(void)
{
int i,nOut;
nOut=0;
rGPFDAT = 0;
for(i=0;i<100000;i++);
rGPFDAT = nOut | 0x20;//0x80;
for(i=0;i<100000;i++);
rGPFDAT |= nOut | 0xa0;//0x40;
for(i=0;i<100000;i++);
rGPFDAT |= nOut | 0xb0;//0x20;
for(i=0;i<100000;i++);
rGPFDAT |= nOut | 0xf0;//0x10;
for(i=0;i<100000;i++);
}
具体的细节可以参考相应的工程文件。