这是我第一次写博客,自己学ARM,随着学习的深入发现所学的东西越来越多,而本人的脑子有限,所以打算谢谢博客,记录下所学的东西,便于回忆,可能有不对的地方,希望大家能提出来,谢谢。
根据s3c2440数据手册,发现该芯片总共有130个多功能pins,同时被分为8大块,分别为GPA (25) GPB(11) GPC(16) GPD(16) GPE(16) GPF(8) GPG(16) GPH(9) GPJ(13)。
pins还真多,让我倍感压力啊。
学习arm的第一步,点亮小灯,虽然实验比较简单,但可以了解如何操作引脚,还是很值得的。
实验目标:点亮小灯。
涉及的引脚为:GPF4 GPF5 GPF6 。
实验步骤:
1. 将GPF4 GPF5 GPF6 设为输出引脚。
2. 延时一段时间轮流点亮。形成流水灯的效果。
程序代码:
Head.s
.text
.global start
start:
ldr sp,=4096
bl disable_watch_dog
bl main
halt_loop:
b halt_loop
init.c
#define WTCON (*(volatile unsigned long *)0x53000000)
void disable_watch_dog(void)
{
WTCON = 0;
}
Led.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)
#define GPF4_out (1<<2*4)
#define GPF5_out (1<<2*5)
#define GPF6_out (1<<2*6)
#define GPF4_msk (3<<2*4)
#define GPF5_msk (3<<2*5)
#define GPF6_msk (3<<2*6)
#define GPF0_msk (3<<0*2)
#define GPF2_msk (3<<2*2)
#define GPG3_msk (3<<2*3)
int main(void)
{
int temp,temp1;
GPFDAT = ~(0);
GPFCON &= ~(GPF4_msk|GPF5_msk|GPF6_msk|GPF0_msk|GPF2_msk);
GPGCON &= ~(GPG3_msk);
GPFCON |= (GPF4_out|GPF5_out|GPF6_out);
while(1)
{
temp = GPFDAT&(~(1<<3));
temp |= (GPGDAT&(1<<3));
//temp1 = GPGDAT;
if(temp&0x0001)
GPFDAT |=(1<<4);
else
GPFDAT &=~(1<<4);
if(temp&(1<<2))
GPFDAT |=(1<<5);
else
GPFDAT &=~(1<<5);
if(temp&(1<<3))
GPFDAT |=(1<<6);
else
GPFDAT &=~(1<<6);
}
return 0;
}
Makefile
KeyLed.bin:head.s init.c keyLed.c
arm-linux-gcc -c -o head.o head.s
arm-linux-gcc -c -o init.o init.c
arm-linux-gcc -c -o keyLed.o keyLed.c
arm-linux-ld -Ttext 0x00000000 head.o init.o keyLed.o -o keyLed_elf
arm-linux-objcopy -O binary -S keyLed_elf keyLed.bin
arm-linux-objdump -D -m arm keyLed_elf > keyLed.dis
clean:
rm -rf keyLed.bin keyLed_elf keyLed.dis *.o