null第8章 I/O端口第8章 I/O端口李建义8.1 通用 I/O端口8.1 通用 I/O端口通用I/O口的配置
通用I/O口的编程8.1.1 S3C2440的I/O端口8.1.1 S3C2440的I/O端口130个多功能端口,分为9组:
1个8位的I/O端口(端口F)
1个9位的I/O端口(端口H)
1个13位I/O端口(端口J)
1个11位I/O端口(端口B)
4个16位I/O端口(端口C、D、E、G)
1个25位输出端口(端口A)8.1.1 S3C2440的I/O端口8.1.1 S3C2440的I/O端口每组端口可以通过软件配置端口控制寄存器来满足不同系统和设计的需要。
在运行 主程序之前,必须先对用到的每一个引脚功能进行设置。
如果某些引脚的复用功能没有使用,可将该引脚先设置为I/O口。
8.1.1 S3C2440的I/O端口8.1.1 S3C2440的I/O端口\datasheet\Um_s3c2440a_rev.pdf中
9.IO Ports8.1.2 S3C2440芯片与端口相关的寄存器8.1.2 S3C2440芯片与端口相关的寄存器(1)端口控制寄存器(GPACON-GPJCON):配置每一个引脚的工作模式
(2)端口数据寄存器(GPADAT-GPJDAT):当端口配置为输出引脚时,输出数据的方法是将数据写到GPADAT-GPJDAT的相应位;当端口配置为输入引脚时,读入数据的方法是将GPADAT-GPJDAT的相应位读出。
8.1.2 S3C2440芯片与端口相关的寄存器8.1.2 S3C2440芯片与端口相关的寄存器(3)端口上拉寄存器(GPBUP-GPJUP):设置端口上拉寄存器,,可以设置该组端口与内部上拉电阻连接或断开。当寄存器相应的位配置为0时,该引脚接上拉电阻,当寄存器相应的位配置为1 时,该引脚不接上拉电阻。
(4)外部中断控制寄存器(EXTINT):根据外部中断的需要,将中断触发信号配置为低电平触发、高电平触发、下降沿触发和上升沿触发和边沿触发几种方式。8.1.3 应用实例—um_s3c2440a_rev10.pdf 37页8.1.3 应用实例—um_s3c2440a_rev10.pdf 37页发光二极管控制电路:端口F 6、7引脚分别与LED1 和LED2 连接,端口输出低电平时,LED灯亮;电平,LED灯灭。代码分析:代码分析:Void Led_Display(int LedStatus)
{
Led_state= LedStatus;
if((LedStatus&0x01)==0x01)
rGPFDAT=rGPFDAT&0xBF;
else
rGPFDAT=rGPFDAT|0x40;
if((LedStatus&0x02)==0x02)
rGPFDAT=rGPFDAT&0x7F;
else
rGPFDAT=rGPFDAT|0x80;
}最低位为1第6位为0,LED1亮第6位为1,LED1灭第2位为1第7位为0,LED2亮第7位为1,LED2灭结论:若想要LED1亮,只需将LedStatus最低位为1即可,为0则LED1 灭;
若想要LED2亮,只需将LedStatus第2位为1即可,为0则LED2 灭;I/O端口控制寄存器I/O端口控制寄存器nullnull端口A数据寄存器当端口配置为输出口,输出引脚的状态与GPADAT的相应位相同;
当端口配置为功能引脚时,此控制寄存器的未定义。端口B端口Bnull端口B端口B端口F端口F端口F---控制寄存器端口F---控制寄存器端口F---数据寄存器和上拉寄存器端口F---数据寄存器和上拉寄存器2440addr.h文件中关于I/O口寄存器的定义2440addr.h文件中关于I/O口寄存器的定义// I/O PORT
#define rGPACON (*(volatile unsigned *)0x56000000) //Port A control
#define rGPADAT (*(volatile unsigned *)0x56000004) //Port A data
#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 rGPCCON (*(volatile unsigned *)0x56000020) //Port C control
#define rGPCDAT (*(volatile unsigned *)0x56000024) //Port C data
#define rGPCUP (*(volatile unsigned *)0x56000028) //Pull-up control C
#define rGPDCON (*(volatile unsigned *)0x56000030) //Port D control
#define rGPDDAT (*(volatile unsigned *)0x56000034) //Port D data
#define rGPDUP (*(volatile unsigned *)0x56000038) //Pull-up control Dnull#define rGPECON (*(volatile unsigned *)0x56000040) //Port E control
#define rGPEDAT (*(volatile unsigned *)0x56000044) //Port E data
#define rGPEUP (*(volatile unsigned *)0x56000048) //Pull-up control E
#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
#define rGPGCON (*(volatile unsigned *)0x56000060) //Port G control
#define rGPGDAT (*(volatile unsigned *)0x56000064) //Port G data
#define rGPGUP (*(volatile unsigned *)0x56000068) //Pull-up control G
#define rGPHCON (*(volatile unsigned *)0x56000070) //Port H control
#define rGPHDAT (*(volatile unsigned *)0x56000074) //Port H data
#define rGPHUP (*(volatile unsigned *)0x56000078) //Pull-up control H
#define rGPJCON (*(volatile unsigned *)0x560000d0) //Port J control
#define rGPJDAT (*(volatile unsigned *)0x560000d4) //Port J data
#define rGPJUP (*(volatile unsigned *)0x560000d8) //Pull-up control #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***关于volatile的说明******关于volatile的说明***volatile的本意是“易变的” ;由于访问寄存器的速度要快过RAM,所以编译器一般都会作减少存取外部RAM的优化。比如: static int i=0; int main(void) { ... while (1) { if (i) dosomething(); } }/* Interrupt service routine. */ void ISR_2(void) { i=1; }***关于volatile的说明******关于volatile的说明***程序的本意是希望ISR_2中断产生时,在main当中调用dosomething函数,
但是,由于编译器判断在main函数里面没有修改过i,因此可能只执行一次对从i到某寄存器的读操作,然后每次if判断都只使用这个寄存器里面的“i副本”,导致dosomething永远也不会被调用。
如果将将变量加上volatile修饰,则编译器保证对此变量的读写操作都不会被优化(肯定执行)。此例中i也应该如此说明。
***关于volatile的说明******关于volatile的说明***一般说来,volatile用在如下的几个地方: 1、中断服务程序中修改的供其它程序检测的变量需要加volatile; 2、多任务环境下各任务间共享的标志应该加volatile; 3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能有不同意义。端口初始化函数 IO_test\2440lib.c端口初始化函数 IO_test\2440lib.cvoid Port_Init(void)
{
rGPACON = 0x7fffff;
rGPBCON = 0x000150;
rGPBUP = 0x7ff;
rGPCCON = 0xaaaaaaaa;
rGPCUP = 0xffff; null rGPDCON = 0xaaaaaaaa;
rGPDUP = 0xffff;
rGPECON = 0xa02aa800;
rGPEUP = 0xffff;
rGPFCON = 0x55aa;
rGPFUP = 0xff;
}含义?实现灯的闪烁-自左至右实现灯的闪烁-自左至右GPF4 F5 F6 F7
D1 D2 D3 D4 null/*********************************************
函数名:left_right()
函数作用:实现4个led灯从左到右依次亮
函数参数:无
返回值:无
作者:李建义
完成日期:2010年9月27日
*********************************************/
void left_right( )
{
while(Uart_GetKey() != '\r')
{
rGPFDAT = rGPFDAT & 0x0F | 0xE0;
Delay(1000);
rGPFDAT = rGPFDAT & 0x0F | 0xD0;
Delay(1000);
rGPFDAT = rGPFDAT & 0x0F | 0xB0;;
Delay(1000);
rGPFDAT = rGPFDAT & 0x0F | 0x70;
Delay(2000);
}
}void left_right( )
{
while(Uart_GetKey() != '\r')
{
rGPFDAT = rGPFDAT & 0x0F | 0xE0;
Delay(1000);
rGPFDAT = rGPFDAT & 0x0F | 0xD0;
Delay(1000);
rGPFDAT = rGPFDAT & 0x0F | 0xB0;
Delay(1000);
rGPFDAT = rGPFDAT & 0x0F | 0x70;
Delay(2000);
}
}LED显示程序代码分析:main_io.cLED显示程序代码分析:main_io.cvoid Led_Test1(void)
{
Uart_Printf( "LED Test, press Enter key to exit !\n" ) ;
while(Uart_GetKey() != '\r')
{
Delay(1000);
Led_Display(0x8);
Delay(1000);
Led_Display(0x4);
Delay(1000);
Led_Display(0x2);
Delay(1000);
Led_Display(0x1);
Delay(1000);
Led_Display(0xF);
Delay(1000);
Led_Display(0x0);
}
}E:\SINOSYS\Experiment\IO\SourceCode\IO_test\2440lib.cE:\SINOSYS\Experiment\IO\SourceCode\IO_test\2440lib.cvoid Led_Display(int data)
{
//Active is low.(LED On)
// GPF7 GPF6 GPF5 GPF4
//nLED_8 nLED4 nLED_2 nLED_1
rGPFDAT = (rGPFDAT & ~(0xf<<4)) | ((~data & 0xf)<<4);
}
4-7位清0,其他位不变4-7位置位,其它位不变结论:data的0-3位对应led1-4,要使对应的灯亮,data相应位为1,
rGPFDAT对应的位为0即可本课小结本课小结掌握I/O口配置的方法;
端口控制寄存器
端口上拉寄存器
掌握I/O口读、写数据的方法
端口数据寄存器周四实验周四实验通用I/O口实验-跑马灯(实验16 IO_test)
任务:修改程序,分别使4个灯亮的顺序为自右至左、自左至右、中间到两边、两边到中间、从左到右顺序亮,然后全灭、从右到左顺序亮,然后全灭。
分别编写这几个函数,写在
实验报告
化学实验报告单总流体力学实验报告观察种子结构实验报告观察种子结构实验报告单观察种子的结构实验报告单
上
下周一上机:2:00-3:45:3、4、5、6班汇编
下周四上机 2:00—4:00单元:第1、2班
4:00---6:00单元:第3、5班
下周六8:30-10:00:4、6班