微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM9(S3C2440)的IO口--LED流水灯

ARM9(S3C2440)的IO口--LED流水灯

时间:11-23 来源:互联网 点击:
概述

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 口。

IO口控制寄存器

端口配置寄存器(GPACON 至GPJCON)
S3C2440A 中,大多数端口为复用引脚。因此要决定每个引脚选择哪项功能。PnCON(引脚控制寄存器)决
定了每个引脚使用哪项功能。
端口数据寄存器(GPADAT 至GPJDAT)
如果端口配置为输出端口,可以写入数据到PnDAT 的相应位。如果端口配置为输入端口,可以从PnDAT 的相
应位读取数据。
端口上拉寄存器(GPBUP 至GPJUP)
端口上拉寄存器控制每个端口组的使能/禁止上拉电阻。当相应位为0 时使能引脚的上拉电阻。当为1 时禁止上拉电阻。如果使能了上拉电阻,那么上拉电阻与引脚的功能设置无关(输入、输出、DATAn、EINTn 等等)
杂项控制寄存器
此寄存器控制睡眠模式,USB 引脚和CLKOUT 选择的数据端口上拉电阻。
外部中断控制寄存器
24 个外部中断由各种信号方式触发。EXTINT 寄存器为外部中断请求配置信号触发方式为低电平触发、高电平触发、下降沿触发、上升沿触发或双边沿触发。
由于每个外部中断引脚包含一个数字滤波器,中断控制可以确认请求信号是否长于3 个时钟。
EINT[15:0]用于唤醒源

LED流水灯实验使用PB口的GPB5-PGB8控制4个LED循环点亮。采用共阳极接法,即当端口位为低电平时LED亮,高电平时LED灭。

步骤:

1.IO口初始化,设置GPBCON,GPBUP寄存器。

在这里PB口的GPB5-PGB8作为通用IO口使用,实现输出功能,所以GPBCON的GPB5-PGB8位应分别都为01,即GPBCON[17:10] 为 01010101;GPBUP初始状态全为0,即使能上拉电阻功能,可不用设置,此处进行了设置。
I/O口与外围设备连接一般要通过光电隔离或其他隔离器件,直接相连一定要确认负载不能超过 4个与非门。光电隔离一是可保护微处理器;二是可进行电平转换;三是可对某些信号进行分配,所以在一般情况下都要加。
2.控制思路比较简单,让PB口的5-8位循环变为低电平(其他时间均为高电平),即可实现流水灯,在两次电平变换中间加入延时。

3.程序

#define rGPBCON (*(volatile unsigned *)0x56000010)//Port B control
#define rGPBDAT (*(volatile unsigned *)0x56000014)//Port B data
#define rGPBUP (*(volatile unsigned *)0x56000018)//Pull-up control B

#define LED1_ON(rGPBDAT &=~(1<5))//GPB5 位清0
#define LED1_OFF(rGPBDAT |=(1<5) )//GPB5 位置1
#define LED2_ON(rGPBDAT &=~(1<6))
#define LED2_OFF(rGPBDAT |=(1<6))
#define LED3_ON(rGPBDAT &=~(1<7))
#define LED3_OFF(rGPBDAT |=(1<7))
#define LED4_ON(rGPBDAT &=~(1<8))
#define LED4_OFF(rGPBDAT |=(1<8))

void Delay(void)
{
int i;
for(i=0;i<1000000;i++);
}

int Main()
{
rGPBCON &=~((3<10)|(3<12)|(3<14)|(3<16));//对GPBCON[10:17]清零
rGPBCON |=((1<10)|(1<12)|(1<14)|(1<16));//设置GPB5~8为输出
rGPBUP &=~((1<5)|(1<6)|(1<7)|(1<8));//设置GPB5~8的上拉功能
rGPBDAT |=(1<5)|(1<6)|(1<7)|(1<8);//关闭LED

while(1)
{
LED1_ON;Delay();LED1_OFF;
LED2_ON;Delay();LED2_OFF;
LED3_ON;Delay();LED3_OFF;
LED4_ON;Delay();LED4_OFF;
}
return 0;
}

4.程序说明,程序中对寄存器的设置采用了#define LED1_ON (rGPBDAT &=~(1<5)) 这种方法,相比直接赋值的方法,这种表示方法比较容易观察出是寄存器的哪一位发生了变化,并且保证除了需要改变的位发生变化之外,其他位保持不变!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top