1. 硬件原理
GPIO是最简单的硬件,通用输入/输出端口,可以输入输出高电平、低电平。一般也没太多东西,就记录一下上拉电阻和下拉电阻。上拉电阻的作用是,当GPIO引脚处于第三态,既不是高电平,也不是低电平,而是呈高阻态,相当于悬空,没有接任何东西,它的电平由上拉电阻上拉到高电平状态。
如图,当GPIOx为输入时,如果没有上拉电阻,电平将不确定,通过上拉电阻VCC连接,读到的将是高电平,下拉电阻同理。
2. 芯片手册
3. mini2440电路图
由原理图可以看出,GBP5~8引脚接4个led灯,当引脚输出低电平,led亮。下面是流水灯的实现代码
4. S3C2440寄存器
对于s3c2440来说,它有上百个IO口,分为A-J 9组,每组类似,都有3个寄存器。
GPxCON配置寄存器,A组比较特殊,0配置为输出,1配置为特殊功能,一般GPACON全设1。其它组每2位控制一引脚,00表示输入,01表示输出,10表示特殊功能,11保留。
CPxDAT数据寄存器,很简单,配置为输出时,写1输出高电平,配置为输入时,读到1就是读入高电平。
GPxUP上拉寄存器,写1内部无上拉,写0上拉。一般配置成输入时,需要上拉。
led.h
/*******************************************************************
* Copyright (C),2011-2012, XXX.
* FileName: led.h
* Author:HuangYinqing
* Version:1.0
* Date::2012-04-22
* Description:led驱动.
* Function List:
* History:
******************************************************************/
#ifndef __LED_H__
#define __LED_H__
#define LED_CON_MASK ( (3<<10) | (3<<12) | (3<<14) | (3<<16) )
#define LED_CON_OUT ( (1<<10) | (1<<12) | (1<<14) | (1<<16) )
/*led对应的引脚*/
#define LED1_PIN (1<<5)
#define LED2_PIN (1<<6)
#define LED3_PIN (1<<7)
#define LED4_PIN (1<<8)
/*函数声明*/
void LedInit(void);
void LedOn(unsigned long ulLedPin);
void LedOff(unsigned long ulLedPin);
void LedTest(void);
#endif
led.c
/*******************************************************************
* Copyright (C),2011-2012, XXX.
* FileName: led.c
* Author:HuangYinqing
* Version:1.0
* Date::2012-04-22
* Description:led驱动.
* Function List:
* History:
******************************************************************/
#include "common.h"
#include "core.h"
#include "led.h"
/********************************************************************
函数功能:led初始化。
入口参数:无。
返 回:无。
备 注:无。
********************************************************************/
void LedInit(void)
{
/*设置GPB5-GPB8为输出端口*/
rGPBCON &= ~LED_CON_MASK;
rGPBCON |= LED_CON_OUT;
}
/********************************************************************
函数功能:点亮某个led灯。
入口参数:
ulLedPin:led引脚号,取LEDn_PIN(1<=n<=4)
返 回:无。
备 注:无。
********************************************************************/
void LedOn(unsigned long ulLedPin)
{
rGPBDAT &= ~ulLedPin;
}
/********************************************************************
函数功能:关闭某个led灯。
入口参数:
ulLedPin:led引脚号,取LEDn_PIN(1<=n<=4)
返 回:无。
备 注:无。
********************************************************************/
void LedOff(unsigned long ulLedPin)
{
rGPBDAT |= ulLedPin;
}
/********************************************************************
函数功能:流水灯测试。
入口参数:无
返 回:无。
备 注:无。
********************************************************************/
void LedTest(void)
{
LedOn(LED1_PIN);
mdelay(1000);
LedOff(LED1_PIN);
LedOn(LED2_PIN);
mdelay(1000);
LedOff(LED2_PIN);
LedOn(LED3_PIN);
mdelay(1000);
LedOff(LED3_PIN);
LedOn(LED4_PIN);
mdelay(1000);
LedOff(LED4_PIN);
}