s3c2440有130多个GPIO口,且分为9个组,
GPX( A,B,C,D,E,F,G,H,I,J)
对应的操作寄存器名称是
GPXCON //设置IO口的工作方式 00-输入,01-输出,10-特殊功能,11-保留(两位表示一根引脚线)
GPXDAT //IO口是输入:读取引脚的高低电平,输出:设置高低,特殊:不能用
GPXUP //设置引脚的内部上拉电阻,0使用内部上拉,1,不使用内部上拉,(GPA没有上拉)
其中GPACON只能用于输出,因为他外接的是Adress引脚。 0输出,1,地址
接下来是keil配置jlink的配置过程
打开keil4,新建工程,选择samsung下面的s3c2440A工程
然后选择确定和确定载入启动文件,
打开s3c2440.s修改
CLOCK_SETUP EQU 1
然后打开configuretion wizard勾选全部combox
下面是通过jlink下载的配置
打开option for target
1,勾选ROM1:0x0 0x1000000 勾选startup
2,勾选RAM1,:0x30000000 0x2000000
OUTPUT
1,勾选create HEX
LInker
1,勾选Report migjt fail coxxxxxx
Debug
1,勾选Use j-link/j-TRACE
2,反勾选LOAD Application at Startup
3,在initializetion file中浏览到Ext_RAM.ini
4,j-link 右边的settings->auto Selection
Utilities
1,反勾选UPdate Target before Debugging
2,settings->add->s29GL016 flash 2M
3,选择j-link/j-Tracem
下面是通过jlink调试的配置
打开option for target
1,勾选ROM1:0x30000000 0x1000000
2,勾选RAM1,:0x31000000 0x1000000
代码
/*
time:2016-03-29,
change:创建文件,GPIO.c GPIO.h
auther:wxc
*/
#include <S3C2440.H>
#define uint_8 unsigned char
#define uint_32 unsigned int
#define GPIO volatile unsigned long*
#define OUT 1
#define IN 0
#define false 0
#define true 1
#define GPB5_out (1<<(5*2))
#define GPB6_out (1<<(6*2))
/*
功能:
参数:
返回:
*/
/*
功能:延时函数
参数:延时时间
返回:无
*/
void delay_ms(uint_32 time)
{
int j= 5000;
for(;time>0;time--)
{
for(;j>0;j--)
;
}
}
/*
功能:设置引脚方向
参数:GPx引脚类型,con 引脚方向,flag引脚值
返回:是否设置成功
*/
int GPIO_CON(GPIO GPx,int con,int flag)
{
if(flag<0||flag>16)
{
return false;
}
*GPx |= con<<(flag*2);
return true;
}
/*
功能:获取引脚值
参数:GPx引脚类型,flag引脚值
返回:返回数据
*/
int getGPIO_DAT(GPIO GPx,int flag)
{
return (*GPx&(1<<flag))>>flag;
}
/*
功能:设置引脚值
参数:GPx引脚类型,con引脚值,flag引脚位置
返回:设置成功
*/
int setGPIO_DAT(GPIO GPx,int con,int flag)
{
if(con>2)
{
return false;
}
if(con == OUT)
*GPx = (*GPx|(1<<flag));
else
*GPx = (*GPx&~(1<<flag));
return true;
}
//点个灯玩玩
int main()
{
int ledIndex = 5;
int bool=0;
bool = GPIO_CON(&GPBCON,OUT,5);
bool = GPIO_CON(&GPBCON,OUT,6);
bool = GPIO_CON(&GPBCON,OUT,7);
bool = GPIO_CON(&GPBCON,OUT,8);
// GPBCON = GPB5_out;
while(1)
{
// GPBDAT &= ~(3<<5);
bool = setGPIO_DAT(&GPBDAT,1,ledIndex);
delay_ms(10000);
bool = setGPIO_DAT(&GPBDAT,0,ledIndex);
// setGPIO_DAT(GPBCON,0,ledIndex);
delay_ms(10000);
if(ledIndex++>8)
{
ledIndex = 5;
}
}
return false;
}