版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lvjianxin6015/article/details/54236898
下面将基于前面写的start.S、gboot.lds、和makefile,加入led的调试信息,验证程序是否完全正确。(比如:点亮led2、led4)
GPIO控制方法主要涉及到两个寄存器:
数据寄存器里面的值决定该IO口输出高电平还是低电平。
2440的led是接在GPB上的:
由原理图可知,当led的引脚接低电平时,led会亮。
寄存器:
控制寄存器(决定输入输出),共22位,每两位控制一个引脚:
数据寄存器(决定高低电平):
程序如下:
#define GPBCON 0x56000010
#define GPBDAT 0x56000014
light_led:
ldr r0,=GPBCON
ldr r1,=0x15400 #设置GPB5(led1)~GPB8(led4)为输出模式,(01 01 01 01 00 00 00 00 00),其他默认为输入
str r1,[r0]
ldr r0,=GPBDAT
ldr r1,=0x6BF #GPB5(led1)与GPB7(led3)为低电平,其他的默认设为高电平。(11010111111)
str r1,[r0]
mov pc,lr
将gboot.bin下载到处理器,可以观察到led2和led4亮了。
对于6440的板子,在核心初始化中有一步忘记操作了,就是外设地址的初始化。核心初始化可参考专题5。
外设地址初始化:
70000000为外设基地址。
set_peri_port:
ldr r0, =0x70000000 #为外设的基地址
orr r0, r0, #0x13
mcr p15,0,r0,c15,c2,4
mov pc, lr
6440点亮led:
GPKCON0每4位控制1位引脚:
代码:
#define GPKCON 0x7f008800
#define GPKDAT 0x7f008808
light_led:
ldr r0, =GPKCON
ldr r1, =0x11110000 #led1~led4配置为输出
str r1, [r0]
ldr r0, =GPKDAT
ldr r1, =0xa0 #10100000 led2 和led4 亮
str r1, [r0]
mov pc, lr