S3C6410 GPIO学习

        前段时间由于就业的压力以及想找一个好一点的工作于是就有了学习linux的想法,于是就购买飞凌公司的OK6410 开发板,以及国嵌的配套自学包,开始了茫茫的自学之路。本人是一个很懒的人,平时很少动笔写东西,但是linux的学习是一个复杂过程的学习,所谓好记性不如烂笔头,于是我就将我学习过程中的所见所获记录下来,供以后复习回味。

下面就开始我的第一篇博客。

 

S3C6410  GPIO学习

      我曾经学习过STM32以及ti的cortexM3,发现S3C6410和STM32有着惊人的相似,这就为GPIO的学习减少了不少负担。

      首先,搭建调试平台。我承认我比较异想天开,开始我居然想用MDK来做开发,后来发现根本没有ARM1176JZF-S 的选项,起初还以为是我的版本太低后来才发现MDK的高板本同样不支持,我只有放弃了。也怪我一开始太马虎,没有找到光盘的安装包,就在网上下载了以RVDS2.2的版本,和自身已经装有的Jlink版本。就开始测试一下成功没有,后面发现根本无法load  .axf文件,最后向网友求助才知道可能版本不对,最后只有装回最初始的版本和过嵌教程中规定的Jlink驱动。这样老老实实的安装后居然就可以下载程序了,我真为自己的无知而感到悲哀!

       飞凌开发板的LED控制端为M端口所以只要对M端口 下面的三格寄存器操作就行了。具体操作数据手册上有 

/**********************************************************
*实验要求:   用FL6410上的4个LED资源实现跑马灯程序。
*功能描述:   FL6410用下面4个引脚连接了LED发光二极管,分别是
*           GPM0--LED1
*           GPM1--LED2
*           GPM2--LED3
*           GPM3--LED4
*           本程序将控制这四个管脚的输出电平,实现跑马灯的效果
*日    期:   2011-3-10
*作    者:   国嵌
**********************************************************/
#include "def.h"
#include "gpio.h"

#define LED1_ON   ~(1<<0)
#define LED2_ON   ~(1<<1)
#define LED3_ON   ~(1<<2)
#define LED4_ON   ~(1<<3)

#define LED1_OFF   (1<<0)
#define LED2_OFF   (1<<1)
#define LED3_OFF   (1<<2)
#define LED4_OFF   (1<<3)
#define LEDALL_OFF (0xf<<0)

//GPIO
#define GPIO_BASE    (0x7F008000)
//oGPIO_REGS类型在 gpio.h 中定义
#define GPIO     (( volatile oGPIO_REGS *)GPIO_BASE)

//函数声明
void delay(int times);
void LedPortInit(void);
void LedRun(void);

/*
 * 程序入口
 * */
int main(void)

 LedPortInit();
 LedRun();
}

/*
 * 延时函数
 * */
void delay(int times)
{
    int i;
    for(;times>0;times--)
      for(i=0;i<3000;i++);
}

/*
 *   初始化连接LED灯的管脚资源
 * @ 通过将GPIO_BASE强制转化为(volatile oGPIO_REGS*)型的指针可以很方便
 * 的访问各个GPIO寄存器的值,这种方法比通过使用寄存器地址的宏定义访问
 * 寄存器单元更加规范和科学。
 * */ 
void LedPortInit(void)
{
 u32 uConValue;
 uConValue = GPIO->rGPIOMCON;
 uConValue &= ~0xffff;
 uConValue |= 0x1| (0x1<<4)| (0x1<<8)| (0x1<<12);
 GPIO->rGPIOMCON = uConValue;   
}

/*
 *   跑马灯的实现函数
 * @ 通过控制连接LED的管脚的输出电平点亮和熄灭各个LED。
 * @ 逐个循环点亮各个LED。在每点亮一个后保持一定时间再熄灭它,接着
 * 点亮下一个LED,这样就形成了一个跑马灯的效果。
 * @ 这是一个需要改善的跑马灯程序,想想怎么优化这段代码。
 * */
void LedRun(void)
{
    GPIO->rGPIOMDAT |= LEDALL_OFF;
    while(1)
 {
  GPIO->rGPIOMDAT &= LED1_ON;
  delay(1000);
  GPIO->rGPIOMDAT |= LEDALL_OFF;

  GPIO->rGPIOMDAT &= LED2_ON;
  delay(1000);
  GPIO->rGPIOMDAT |= LEDALL_OFF;

  GPIO->rGPIOMDAT &= LED3_ON;
  delay(1000);
  GPIO->rGPIOMDAT |= LEDALL_OFF;

  GPIO->rGPIOMDAT &= LED4_ON;
  delay(1000);
  GPIO->rGPIOMDAT |= LEDALL_OFF;
    }
}

 

 

 

#ifndef __GPIO_H__
#define __GPIO_H__

#ifdef __cplusplus
extern "C" {
#endif

#include "def.h"

typedef struct tag_GPIO_REGS
{
 u32 rGPIOACON;   //0x7F008000
 u32 rGPIOADAT;
 u32 rGPIOAPUD;
 u32 rGPIOACONSLP;
 u32 rGPIOAPUDSLP;
 u32 reserved1[3];
 
 u32 rGPIOBCON;   //0x7F008020
 u32 rGPIOBDAT;
 u32 rGPIOBPUD;
 u32 rGPIOBCONSLP;
 u32 rGPIOBPUDSLP; 
 u32 reserved2[3];
  
 u32 rGPIOCCON;   //0x7F008040
 u32 rGPIOCDAT;
 u32 rGPIOCPUD;
 u32 rGPIOCCONSLP;
 u32 rGPIOCPUDSLP; 
 u32 reserved3[3];
  
 u32 rGPIODCON;   //0x7F008060
 u32 rGPIODDAT;
 u32 rGPIODPUD;
 u32 rGPIODCONSLP;
 u32 rGPIODPUDSLP; 
 u32 reserved4[3];
  
 u32 rGPIOECON;   //0x7F008080
 u32 rGPIOEDAT;
 u32 rGPIOEPUD;
 u32 rGPIOECONSLP;
 u32 rGPIOEPUDSLP; 
 u32 reserved5[3];
  
 u32 rGPIOFCON;   //0x7F0080A0
 u32 rGPIOFDAT;
 u32 rGPIOFPUD;
 u32 rGPIOFCONSLP;
 u32 rGPIOFPUDSLP; 
 u32 reserved6[3];
  
 u32 rGPIOGCON;   //0x7F0080C0
 u32 rGPIOGDAT;
 u32 rGPIOGPUD;
 u32 rGPIOGCONSLP;
 u32 rGPIOGPUDSLP; 
 u32 reserved7[3];
 
 u32 rGPIOHCON0;   //0x7F0080E0
 u32 rGPIOHCON1;
 u32 rGPIOHDAT;
 u32 rGPIOHPUD;
 u32 rGPIOHCONSLP;
 u32 rGPIOHPUDSLP; 
 u32 reserved8[2];

 u32 rGPIOICON;   //0x7F008100
 u32 rGPIOIDAT;
 u32 rGPIOIPUD;
 u32 rGPIOICONSLP;
 u32 rGPIOIPUDSLP; 
 u32 reserved9[3];

 u32 rGPIOJCON;   //0x7F008120
 u32 rGPIOJDAT;
 u32 rGPIOJPUD;
 u32 rGPIOJCONSLP;
 u32 rGPIOJPUDSLP; 
 u32 reserved10[3];
 
 u32 rGPIOOCON;   //0x7F008140
 u32 rGPIOODAT;
 u32 rGPIOOPUD;
 u32 rGPIOOCONSLP;
 u32 rGPIOOPUDSLP; 
 u32 reserved11[3]; 

 u32 rGPIOPCON;   //0x7F008160
 u32 rGPIOPDAT;
 u32 rGPIOPPUD;
 u32 rGPIOPCONSLP;
 u32 rGPIOPPUDSLP; 
 u32 reserved12[3];

 u32 rGPIOQCON;   //0x7F008180
 u32 rGPIOQDAT;
 u32 rGPIOQPUD;
 u32 rGPIOQCONSLP;
 u32 rGPIOQPUDSLP; 
 u32 reserved13[3]; 

 u32 rSPCON;    //0x7F0081A0
 u32 reserved14[3];
 u32 rMEM0CONSTOP;  //0x7F0081B0
 u32 rMEM1CONSTOP;  //0x7F0081B4
 u32 reserved15[2];
 u32 rMEM0CONSLP0;  //0x7F0081C0
 u32 rMEM0CONSLP1;  //0x7F0081C4
 u32 rMEM1CONSLP;  //0x7F0081C8
 u32 reserved;
 u32 rMEM0DRVCON;  //0x7F0081D0
 u32 rMEM1DRVCON;  //0x7F0081D4
 u32 reserved16[10];

 u32 rEINT12CON;   //0x7f008200
 u32 rEINT34CON;   //0x7f008204
 u32 rEINT56CON;   //0x7f008208
 u32 rEINT78CON;   //0x7f00820C
 u32 rEINT9CON;   //0x7f008210
 u32 reserved17[3];

 u32 rEINT12FLTCON;  //0x7f008220
 u32 rEINT34FLTCON;  //0x7f008224
 u32 rEINT56FLTCON;  //0x7f008228
 u32 rEINT78FLTCON;  //0x7f00822C
 u32 rEINT9FLTCON;  //0x7f008230
 u32 reserved18[3];

 u32 rEINT12MASK;  //0x7f008240
 u32 rEINT34MASK;  //0x7f008244
 u32 rEINT56MASK;  //0x7f008248
 u32 rEINT78MASK;  //0x7f00824C
 u32 rEINT9MASK;   //0x7f008250
 u32 reserved19[3]; 

 u32 rEINT12PEND;  //0x7f008260
 u32 rEINT34PEND;  //0x7f008264
 u32 rEINT56PEND;  //0x7f008268
 u32 rEINT78PEND;  //0x7f00826C
 u32 rEINT9PEND;   //0x7f008270
 u32 reserved20[3];   

 u32 rPRIORITY;   //0x7f008280
 u32 rSERVICE;   //0x7f008284
 u32 rSERVICEPEND;  //0x7f008288
 u32 reserved21;

 u32 reserved22[348];
 
 u32 rGPIOKCON0;   //0x7f008800
 u32 rGPIOKCON1;   //0x7f008804
 u32 rGPIOKDAT;   //0x7f008808
 u32 rGPIOKPUD;   //0x7f00880c

 u32 rGPIOLCON0;   //0x7f008810
 u32 rGPIOLCON1;   //0x7f008814
 u32 rGPIOLDAT;   //0x7f008818
 u32 rGPIOLPUD;   //0x7f00881c

 u32 rGPIOMCON;   //0x7f008820
 u32 rGPIOMDAT;   //0x7f008824
 u32 rGPIOMPUD;   //0x7f008828 
 u32 reserved23;

 u32 rGPIONCON;   //0x7f008830
 u32 rGPIONDAT;   //0x7f008834
 u32 rGPIONPUD;   //0x7f008838 
 u32 reserved24;

 u32 reserved25[16];

 u32 rSPCONSLP;   //0x7f008880

 u32 reserved26[31];  

 u32 rEINT0CON0;   //0x7f008900
 u32 rEINT0CON1;   //0x7f008904
 u32 reserved27[2];

 u32 rEINT0FLTCON0;  //0x7f008910
 u32 rEINT0FLTCON1;  //0x7f008914
 u32 rEINT0FLTCON2;  //0x7f008918
 u32 rEINT0FLTCON3;  //0x7f00891c
 u32 rEINT0MASK;   //0x7f008920
 u32 rEINT0PEND;   //0x7f008924
 u32 reserved28[2];
 u32 rSLPEN;    //0x7f008930

}
oGPIO_REGS;

#ifdef __cplusplus
}
#endif

#endif //__GPIO_H__

 

 

这样通过GPIO.大概可以知道GPIO->rGPIOMCON的含义了吧!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值