OK6410裸机程序(一)——GPIO(LED)

来源:互联网 发布:游戏账号交易平台软件 编辑:程序博客网 时间:2024/04/30 02:35

            本人入手OK6410-A开发板,已经有一段时间。因为去年工作忙一直没时间来折腾这个东东。现在工作也有点空闲时间,又想开始折腾一下了。

            我给自己定的最终目标是:linux驱动开发。有点经验的人都知道,驱动开发对硬件知识的掌握也很重要,所以本人确定就先从裸板程序开始学习。

我将借用这个平台来记录我学习的过程中的问题和经验。好了话不多说,现在就开始第一课。

       OK6410裸机程序(一)——GPIO(LED)

              这是一个非常简单的程序,这个程序就好像我们在学习C语言所写的“HELLO WORLD”程序。都会用它来做为C语言的入门程序。

              GPIO意思就是通用输入、输出端口,通俗地说,就是一些引脚,可以通过它们输入出高低电平。或者通过它们读入引脚状态——高低电平。

              S3C6410共有187个多功能的I/O端口。共分布在17个端口上(GPA、GPB……GPQ)。即然

一个引脚可以用于输入、输出或其他功能,那么一定有寄存器用来选择这些功能;对于输入,一定可以

通过读取某个寄存器来确定引脚的电平是高是低;对于输出,一定可以通过写入某个寄存器来让这个引脚

输出高电平或低电平;对于其它功能,则另有寄存器来控制它了。

                对于这几组GPIO引脚,它们的寄存器是相似的,普通I/O功能通常是由三个寄存器来完成:

                GPxCON:用于选择引脚功能。

                GPxDAT:用于读写引脚数据。

                GPxUP:用于确定是否使用内部上拉电阻。(x表示:A、B、C……Q)

下面就于端口A为例:如下图所示,一个端口是由5个32位的寄存器控制。每个寄存器都有自己地址。一个端口有八个引脚,也就是寄存器每四位控制一个引脚。

               

如图下面每个引脚的配置:

                

                                                                                                                    图2    引脚配置

数据寄存器GPADAT

             

上下拉电阻设置寄存器GPAPUD

                   

我们在对GPIO操作的时候,第一步就是对这三个寄存器进行设置。配置相应的功能、输入、输出模式的选择。是否开启上下拉电阻功能。

下面我们就与点亮OK6410板上的第一个LED灯为例。

首先,来看一下OK6410开发板的原理图。LED灯的硬件是接在CPU上的个哪个引脚。

                                                                                        图:底板原理图

                                           图:核心板原理图部分

结合核心板与底板原理图,可以看出位号LED1的LED灯(我们要点亮的灯),是阴极通过电阻接到了CPU上的GPM0引脚上。阳极直接接到了电源3.3V。也就是说:我们要点亮LED1这个灯,就要使CPU上的GPM0引脚输出低电平。才能点亮LED。

接下来,我们来看看这个程序 (请在linux环境下用交叉工具执行)。

/*GNU 汇编,设置CPU必要的硬件环境*/
 
.globl _start  /*设置全局标号*/_start:/* 告诉CPU外设的基地址,对协处理器CP15操作命令*/    
/* Peri port setup */    ldr r0, =0x70000000    orr r0, r0, #0x13    mcr p15,0,r0,c15,c2,4       @ 256M(0x70000000-0x7fffffff)    /*关闭看门狗*/ldr r0, =0x7E004000mov r1, #0str r1, [r0]/* 设置堆栈*/
ldr sp, =8*1024bl Main    /*转到C语言执行*/
halt:b halt
 
/*************************************************************************//*程序名称:点亮LED灯 C程序/************************************************************************/
 
volatile unsigned long *GPMCON = (volatile unsigned long *)0x7F008820;volatile unsigned long *GPMDAT = (volatile unsigned long *)0x7F008824;void Main(){GPMCON |= (1 << 0);//设置成输出while(1){GPMDAT &= ~(1 << 0); //第0位置0,即输出为低,LED亮}}

                                         

	
				
		
原创粉丝点击