OK6410裸机程序---leds

来源:互联网 发布:黑马程序员基础视频 编辑:程序博客网 时间:2024/04/30 03:43

今天写一下OK6410裸机中的led灯,led是差不最简单的裸机驱动了吧。详细的说一下,以便梳理自己的知识。

我们首先看一下OK6410的LED连接图:

 

其中NLED1234,和s3c6410的GPIO引脚相连,如图:

 

 

其实LED发光的原理很简单的,就是把LED连接到s3c6410的GPIO引脚,通过改变s3c6410的GPIO上的电平来控制LED发光。

这样的话就很清楚了,我们来看下s3c6410 datasheet上关于GPIO引脚的设置:

首先是GPMCON寄存器:

 

因为我们要控制GPIO的电平,所以要把对应的GPIO引脚设置为Output,即:0001

像我们这个就是:GPMCON &=0xffff fff1;

把这个引脚设置好后,我们可以通过改变GPMDAT的值来改变引脚上的电平。下面是GPMDAT:

 

可以看出来我们只要把对应的位设置为0或1,就可以控制LED了。简单吧?

下面看下源程序:

view plaincopy to clipboardprint?
void (*printf)(char *,...) = 0xc7e11650;  
#define GPMCON (*(unsigned long volatile *)0x7F008820)  
#define GPMDAT (*(unsigned long volatile *)0x7F008824)  
#define GPMPUD (*(unsigned long volatile *)0x7F008828)  
/*  
 * NLED1 GPM0 
 * NLED2 GPM1 
 * NLED3 GPM2 
 * NLED4 GPM3 
 */ 
void set_gpio(void);  
void udelay();  
int main(void)  
{  
    set_gpio();  
    printf("%2x/n",GPMDAT);  
    GPMDAT = 0x00;  
      
    int i;  
    while(1) {  
          
        for(i=0;i<=3;i++)  
        {  
            GPMDAT = (1<<i);  
            udelay();  
        }  
    }  
    return 0;  
}  
/* 
 * delay 
 */ 
void udelay()  
{  
    unsigned long  i=0;  
    for(i=0;i<1000000;i++);  
}  
void set_gpio(void)  
{  
    GPMCON &= 0xffff1111;  

void (*printf)(char *,...) = 0xc7e11650;
#define GPMCON (*(unsigned long volatile *)0x7F008820)
#define GPMDAT (*(unsigned long volatile *)0x7F008824)
#define GPMPUD (*(unsigned long volatile *)0x7F008828)
/*
 * NLED1 GPM0
 * NLED2 GPM1
 * NLED3 GPM2
 * NLED4 GPM3
 */
void set_gpio(void);
void udelay();
int main(void)
{
 set_gpio();
 printf("%2x/n",GPMDAT);
 GPMDAT = 0x00;
 
 int i;
 while(1) {
  
  for(i=0;i<=3;i++)
  {
   GPMDAT = (1<<i);
   udelay();
  }
 }
 return 0;
}
/*
 * delay
 */
void udelay()
{
 unsigned long  i=0;
 for(i=0;i<1000000;i++);
}
void set_gpio(void)
{
 GPMCON &= 0xffff1111;
}

这样,leds就交替亮了。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/eagle_lzt/archive/2011/05/02/6384659.aspx

原创粉丝点击