找回密码
 立即注册

QQ登录

只需一步,快速开始

帖子
查看: 3431|回复: 0
打印 上一主题 下一主题
收起左侧

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

[复制链接]
跳转到指定楼层
楼主
ID:105323 发表于 2016-3-4 16:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
概述
    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.程序
#definerGPBCON   (*(volatile unsigned *)0x56000010) //Port Bcontrol
#definerGPBDAT   (*(volatile unsigned *)0x56000014) //Port Bdata
#definerGPBUP    (*(volatile unsigned *)0x56000018) //Pull-upcontrol 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))这种方法,相比直接赋值的方法,这种表示方法比较容易观察出是寄存器的哪一位发生了变化,并且保证除了需要改变的位发生变化之外,其他位保持不变!

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表