您的位置:首页 > 其它

S3C2440下几个简单的裸机接口程序

2012-03-11 18:34 323 查看
例一:

@******************************************************************************

@ File:led_on.S

@ 功能:LED点灯程序,点亮LED1

@******************************************************************************

.text

.global _start

_start:

LDR R0,=0x56000010 @ R0设为GPBCON寄存器。此寄存器

@ 用于选择端口B各引脚的功能:

@ 是输出、是输入、还是其他

MOV R1,#0x00001400

STR R1,[R0] @ 设置GPB5为输出口, 位[10:9]=0b01

LDR R0,=0x56000014 @ R0设为GPBDAT寄存器。此寄存器

@ 用于读/写端口B各引脚的数据

MOV R1,#0x00000000 @ 此值改为0x00000020,

@ 可让LED1熄灭

STR R1,[R0] @ GPB5输出0,LED1点亮

MAIN_LOOP:

B MAIN_LOOP

例二:

@******************************************************************************

@ File:crt0.S

@ 功能:通过它转入C程序

@******************************************************************************

.text

.global _start

_start:

ldr r0, =0x56000010 @ WATCHDOG寄存器地址

mov r1, #0x0

str r1, [r0] @ 写入0,禁止WATCHDOG,否则CPU会不断重启

ldr sp, =1024*4 @ 设置堆栈,注意:不能大于4k, 因为现在可用的内存只有4K

@ nand flash中的代码在复位后会移到内部ram中,此ram只有4K

bl main @ 调用C程序中的main函数

halt_loop:

b halt_loop

led_on_c.c文件

#define GPBCON (*(volatile unsigned long *)0x56000010)

#define GPBDAT (*(volatile unsigned long *)0x56000014)

int main()

{

GPBCON = 0x00001400; // 设置GPB5为输出口, 位[11:10]=0b01

GPBDAT = 0x00000000; // GPB5输出0,LED1点亮

return 0;

}

例三:

@******************************************************************************

@ File:crt0.S

@ 功能:通过它转入C程序

@******************************************************************************

.text

.global _start

_start:

ldr r0, =0x56000010 @ WATCHDOG寄存器地址

mov r1, #0x0

str r1, [r0] @ 写入0,禁止WATCHDOG,否则CPU会不断重启

ldr sp, =1024*4 @ 设置堆栈,注意:不能大于4k, 因为现在可用的内存只有4K

@ nand flash中的代码在复位后会移到内部ram中,此ram只有4K

bl main @ 调用C程序中的main函数

halt_loop:

b halt_loop

//key_led.c文件

#define GPBCON (*(volatile unsigned long *)0x56000010)

#define GPBDAT (*(volatile unsigned long *)0x56000014)

#define GPFCON (*(volatile unsigned long *)0x56000050)

#define GPFDAT (*(volatile unsigned long *)0x56000054)

#define GPGCON (*(volatile unsigned long *)0x56000060)

#define GPGDAT (*(volatile unsigned long *)0x56000064)

/*

* LED1-4对应GPB5、GPB6、GPB7、GPB8

*/

#define GPB5_out (1<<(5*2))

#define GPB6_out (1<<(6*2))

#define GPB7_out (1<<(7*2))

#define GPB8_out (1<<(8*2))

/*

* K1-K4对应GPF4、GPF1、GPF2、GPF0

*/

//#define GPG11_in ~(3<<(11*2))

//#define GPG3_in ~(3<<(3*2))

#define GPF2_in ~(3<<(2*2))

#define GPF0_in ~(3<<(0*2))

#define GPF1_in ~(3<<(1*2))

#define GPF4_in ~(3<<(4*2))

int main()

{

unsigned long dwDat;

// LED1-LED4对应的4根引脚设为输出

GPBCON = GPB5_out | GPB6_out | GPB7_out | GPB8_out ;

// K1-K2对应的2根引脚设为输入

//GPGCON = GPG11_in & GPG3_in ;

// K3-K4对应的2根引脚设为输入

//GPFCON = GPF2_in & GPF0_in ;

GPFCON = GPF2_in & GPF0_in & GPF1_in & GPF4_in ;

while(1){

//若Kn为0(表示按下),则令LEDn为0(表示点亮)

//dwDat = GPGDAT; // 读取GPG管脚电平状态

dwDat = GPFDAT; // 读取GPF管脚电平状态

//GPBDAT |= (1<<5);

if (dwDat & (1<<1)) // K1没有按下

GPBDAT |= (1<<5); // LED1熄灭

else

GPBDAT &= ~(1<<5); // LED1点亮

if (dwDat & (1<<4)) // K2没有按下

GPBDAT |= (1<<6); // LED2熄灭

else

GPBDAT &= ~(1<<6); // LED2点亮

// dwDat = GPFDAT; // 读取GPF管脚电平状态

if (dwDat & (1<<2)) // K3没有按下

GPBDAT |= (1<<7); // LED3熄灭

else

GPBDAT &= ~(1<<7); // LED3点亮

if (dwDat & (1<<0)) // K4没有按下

GPBDAT |= (1<<8); // LED4熄灭

else

GPBDAT &= ~(1<<8); // LED4点亮

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: