使用软件来访问硬件,有两种基本方式,一是通过访问单个引脚,二是访问总线来访问硬件。
下面就介绍简单的通过访问单个引脚来访问硬件(我个人觉得这对学习指针操作很有帮助)。编码环境:PC下的linux系统,通过u_boot来引导裸板出现的运行。
首先查看硬件原理图,判断是高电平点亮还是低电平点亮,有下图一可知,是低电平点亮LED灯。下图一还可以得出是通过gpk4~7来控制LED,接下来就要通过三星手册(建议看英文版的,因为其他的芯片一般都是英文版的)来查阅它们寄存器的地址。
图一
三星手册上关于gpk的资料如下图二,还提供可看门狗的寄存器地址,后面会用的看门狗。
·
图 二
其中GPRCON是用来配置(Configure)----选择引脚的功能,因为GPK4~7都进行了引脚功能的复用,这里选择输出(Output)也就是读操作。GPKDAT用于数据的读/写操作,这里写此寄存器可控制电平的高低。
这里我们是使用C语言来进行操作的,直接写应用程序下载到裸板上是没用的。C语言的操作要有C语言的环境---设置堆栈,这里就涉及到一个启动文件,该启动文件使用汇编编写,功能包括关看门狗、设置堆栈,调用C程序的main()函数。代码如下:
.text
.global _start
_start:
ldr r0, =0x7E004000 @看门狗寄存器的地址
mov r1, #0x0
str r1, [r0] @关看门狗
ldr sp, =1024*4 @设置堆栈
bl main
halt_loop:
b halt_loop
应用程序:
#define rGPKCON (*(volatile unsigned long *)0x7F008800)
#define rGPKDAT (*(volatile unsigned long *)0x7F008808)
#define GPK5_OUT (1<<(10*2))
int main()
{
rGPKCON = GPK5_OUT;
rGPKDAT &= ~(1<<5);
return 0;
}
makefile文件:
led2.bin : crt.s led1.c
arm-linux-gcc -g -c -o crt.o crt.s
arm-linux-gcc -g -c -o led1.o led1.c
arm-linux-ld -Ttext 0x00000000 -g crt.o led1.o -o led1_elf
arm-linux-objcopy -O binary -S led1_elf led1.bin
arm-linux-objdump -D -m arm led1_elf > led1.dis
clean :
rm -f led1.bin led1.dis led1_elf *.o
make命令之后会生成一个.bin文件,将给文件下载到开发板,按下复位键,就可以实现。