通过阅读原理图和芯片手册,编写程序点亮OK6410上的四个LED灯。
通过分析LED灯的原理图可以知道以下几点:
通用输入输出端口,一般有至少两个寄存器控制,一个是控制寄存器,用于选择该端口是作为输入还是输出,一个是存放数据的数据寄存器。
6410芯片手册第10章是关于GPIO的介绍。6410一共有187个多功能输入输出端口,这些端口分为GPA~GPQ共17组。每组端口共用一套寄存器,包括GPxCON, GPxDAT, GPxPUD, GPxCONSLP,GPxUPSLP。其中GPxCON是端口的配置寄存器,GPxDAT是端口的数据寄存器。GPM组端口的寄存器描述如下:
由此可知,点灯LED灯包括下面两个步骤:
代码如下:
#define GPMCON 0x7F008820 #define GPMDAT 0x7F008824 light_led: ldr r0, =GPMCON ldr r1, =0x1111 str r1, [r0] ldr r0, =GPMDAT mov r1, #0xe @点亮第一个LED灯 str r1, [r0] |
将上面的代码烧写到设备后,LED灯并没有点亮,究其原因在于,6410在使用GPIO之前还需要对外设基地址进行一次初始化,可参考ARM11核心手册CP15协处理器的c15寄存器的描述。
这部分代码如下所示:
set_peri_port: ldr r0, =0x70000000 orr r0, r0, 0x13 mcr p15, 0, r0, c15, c2, 4 |
外设基地址为0x70000000来自于6410的芯片手册,不是ARM11核心手册。
编译完成后得到程序的二进制代码,下面将这个二进制文件烧写到设备中验证是否成功。设置开发板从SD卡启动,然后给开发板上电,停留在uboot模式,然后对Nandflash进行一次格式化,确保之前的代码不会影响程序的运行。然后选择从USB烧写镜像文件,烧写的内容是uboot,连接USB线后,即可在虚拟机上执行dnw gboot.bin 50000000,通过USB线将程序下载烧写到设备的Nandflash。
下载完成后,将开发板拔回到从Nandflash启动,然后重启,即可以看裸机程序的执行效果。