ARM9基础实例-GPIO

板子照片和资源如下:
ARM9基础实例-GPIO_第1张图片ARM9基础实例-GPIO_第2张图片ARM9基础实例-GPIO_第3张图片
内存和GPIO电路图:
ARM9基础实例-GPIO_第4张图片ARM9基础实例-GPIO_第5张图片

根据原理图,找到灯和按键对应的引脚,完成按键EINT19按下三个灯全亮,其余按键按下对应灯熄灭的裸板程序如下:

启动文件代码

@ 硬件初始化:关看门狗、初始化时钟、初始化SDRAM等外设;
@ 软件初始化:设置栈、设置返回地址、调用main、清理工作
@ 此程序只关闭看门狗、设置栈、调用main三个步骤
.text
.global _start
_start:
	ldr	r0, =0x53000000     @ 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

main.c文件代码

#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,LED2,LED4对应GPF4、GPF5、GPF6
 * S2,S3,S4,S5对应GPF0、GPF2、GPG3、GPG11
 */
#define	GPF4_msk	(3<<(4*2))
#define	GPF4_out	(1<<(4*2))
#define	GPF5_msk	(3<<(5*2))
#define	GPF5_out	(1<<(5*2))
#define	GPF6_msk	(3<<(6*2))
#define	GPF6_out	(1<<(6*2))

#define GPF0_msk    (3<<(0*2))
#define GPF0_in     (0<<(0*2))
#define GPF2_msk    (3<<(2*2))
#define GPF2_in     (0<<(2*2))
#define GPG3_msk    (3<<(3*2))
#define GPG3_in     (0<<(3*2))
#define GPG11_msk    (3<<(11*2))
#define GPG11_in     (0<<(11*2))

void delay(long temp)
{
	while(temp--)
	;
}

int key_scan(void)
{
	if(((GPFDAT >> 0) & 0x1) == 0)
		return 1;
	if(((GPFDAT >> 2) & 0x1) == 0)
		return 2;
	if(((GPGDAT >> 3) & 0x1) == 0)
		return 3;
	if(((GPGDAT >> 11) & 0x1) == 0)
		return 4;
	return 0;
}
int main()
{
	int keyVal = 0;
	// 配置端口功能模式
	GPFCON &= ~(GPF4_msk | GPF5_msk | GPF6_msk | GPF0_msk | GPF2_msk);
	GPFCON |= GPF4_out | GPF5_out | GPF6_out | GPF0_in | GPF2_in;
	GPGCON &= ~(GPG3_msk | GPG11_msk);
	GPGCON |= GPG3_in | GPG11_in;
	
	GPFDAT &= 0xffffff8f;	// 先点亮所有灯
	while(1)
	{
		keyVal = key_scan();
		switch(keyVal)		// 根据按键动作决定熄灭对应灯或者点亮所有灯
		{
			case 1:
			{
				GPFDAT |= 0x00000040;
				break;
			}
			case 2:
			{
				GPFDAT |= 0x00000020;
				break;
			}
			case 3:
			{
				GPFDAT |= 0x00000010;
				break;
			}
			case 4:
			{
				GPFDAT &= 0xffffff8f;
				break;
			}
			default:break;
		}
		delay(10000);
	}
	return 0;
}

Makefile

main.bin : main.c start.S
	arm-linux-gcc -g -c -o start.o start.S
	arm-linux-gcc -g -c -o main.o main.c
	arm-linux-ld -Ttext 0x0000000 -g start.o main.o -o main_elf
	arm-linux-objcopy -O binary -S main_elf main.bin
	arm-linux-objdump -D -m arm main_elf > main.dis
clean :
	rm -f main_elf main.dis *.o

你可能感兴趣的:(硬件)