前段时间由于就业的压力以及想找一个好一点的工作于是就有了学习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的含义了吧!