- 查看原理图,我的JZ2440开发板连接图是
LED1: nLED_1 –> GPF4
LED2: nLED_2 –> GPF5
LED3: nLED_4 –> GPF6
S1: EINT0–> GPF0
S2: EINT2 –> GPF2
S3: EINT11 –> GPG3
2. 查看S3C2440手册
控制GPF口的寄存器如下:
GPFCOND寄存器控制I/O口的功能(输入/输出/中断)。
GPFDAT寄存器存放I/O口的状态(高电平/低电平)
GPFUP寄存器控制I/O口是否使能上拉
电路图里LED和Key都接有上拉电阻,不用内部上拉。
控制GPG口的寄存器也类似。
3. 编写代码
@************************************************************
@ File:crt0.S
@ 功能:通过它转入C程序
@************************************************************
.text
.global _start @代码开始地址定义个标记
_start:
ldr r0, =0x53000000 @ WATCHDOG寄存器地址
mov r1, #0x0 @给r1 赋值0x0
str r1, [r0] @ 写入0,禁止WATCHDOG,否则CPU会不断重启
ldr sp, =1024*4 @ 设置堆栈,注意:不能大于4k, 因为现在可用的内存只有4K
@ nand flash中的代码在复位后会移到内部ram中,此ram只有4K
@调用C函数前要先设置堆栈
bl main @调用C程序中的main函数,并将下一条指令地址定义为返回地址
halt_loop:
b halt_loop @死循环
/*************************************************************
File:key_led.c
功能:实现按键控制LED灯的亮灭
*************************************************************/
#define GPFCON (*(volatile unsigned long *)0x56000050) //设置GPFCON地址
#define GPFDAT (*(volatile unsigned long *)0x56000054) //设置GFPDAT地址
#define GPGCON (*(volatile unsigned long *)0x56000060) //设置GPGCON地址
#define GPGDAT (*(volatile unsigned long *)0x56000064) //设置GPFDAT地址
#define GPF4_out (1<<(4*2)) // 0000 0001 0000 0000
#define GPF5_out (1<<(5*2)) // 0000 0100 0000 0000
#define GPF6_out (1<<(6*2)) // 0001 0000 0000 0000
#define GPF4_msk (3<<(4*2)) // 0000 0011 0000 0000
#define GPF5_msk (3<<(5*2)) // 0000 1100 0000 0000
#define GPF6_msk (3<<(6*2)) // 0011 0000 0000 0000
#define GPF0_in (0<<(0*2))
#define GPF2_in (0<<(2*2))
#define GPG3_in (0<<(3*2))
#define GPF0_msk (3<<(0*2))
#define GPF2_msk (3<<(2*2))
#define GPG3_msk (3<<(3*2))
int main()
{
unsigned long dwDat; // LED1,LED2,LED4对应的3根引脚设为输出
GPFCON & = ~(GPF4_msk | GPF5_msk | GPF6_msk) ; //将GPF4-6设置为输入
//0011 1111 0000 0000 取反 1100 0000 1111 1111
GPFCON |= GPF4_out | GPF5_out | GPF6_out ; //将GPF4-6设置为输出
//0001 0101 0000 0000
// S2,S3对应的2根引脚设为输入
GPFCON &= ~(GPF0_msk | GPF2_msk);
GPFCON |= GPF0_in | GPF2_in;
// S4对应的引脚设为输入
GPGCON &= ~GPG3_msk;
GPGCON |= GPG3_in;
while(1)
{
//若Kn为0(表示按下),则令LEDn为0(表示点亮)
dwDat = GPFDAT; // 读取GPF管脚电平状态
if (dwDat & (1<<0)) // S2没有按下
GPFDAT |= (1<<4); // LED1熄灭
else
GPFDAT &= ~(1<<4); // LED1点亮
if (dwDat & (1<<2)) // S3没有按下
GPFDAT |= (1<<5); // LED2熄灭
else
GPFDAT &= ~(1<<5); // LED2点亮
dwDat = GPGDAT; // 读取GPG管脚电平状态
if (dwDat & (1<<3)) // S4没有按下
GPFDAT |= (1<<6); // LED3熄灭
else
GPFDAT &= ~(1<<6); // LED3点亮
}
return 0;
}
之后编写makefile文件,即可生成可执行文件烧录到开发板。
编译和烧录过程http://blog.youkuaiyun.com/owhfg/article/details/62226849