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;
}
@******************************************************************************
@ 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;
}
相关文章推荐
- s3c2440的MMU裸机程序
- ARX几个典型的简单程序(转载)
- C的几个简单程序
- 树莓派用Python写几个简单程序4:socket的使用
- 从斐波那契数列简单谈程序的几个层次
- 几个简单程序加深你对多线程和信号量的理解
- ARM裸机程序研究 - S3C2440时钟初始化
- C#WinForm程序最小化后在托盘中隐藏方法以及几个关键点的简单分析
- gcc编译编写ARM最简单的c程序_S3C2440点亮LED
- 几个简单的stm32汇编程序
- C语言入门的几个简单程序
- 【小程序】调用wx.request接口时需要注意的几个问题
- 两个简单的几个c 程序
- 【小程序】调用wx.request接口时需要注意的几个问题
- java简单的接口程序
- 有关数据的基本类型和数组的几个简单程序
- tiny6410 裸机程序烧机简单介绍
- 树莓派用Python写几个简单程序3_UART_BT-HM10
- 一个简单的arm 裸机程序
- 特简单的opencv 与摄像头接口程序