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

            本人入手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, =0x7E004000
	mov r1, #0
	str r1, [r0]

	/* 设置堆栈*/
	ldr sp, =8*1024
	bl 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亮
		}
}


                                         


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章