课程目的

通过阅读原理图和芯片手册,编写程序点亮OK6410上的四个LED灯。

原理图

Alt text
Alt text

通过分析LED灯的原理图可以知道以下几点:

  1. LED灯采用共阳极接法,管脚输出低电平时LED灯点亮
  2. LED灯的控制引脚是GPM组的GPM0~GPM3这四个引脚

GPIO

通用输入输出端口,一般有至少两个寄存器控制,一个是控制寄存器,用于选择该端口是作为输入还是输出,一个是存放数据的数据寄存器。

芯片手册

6410芯片手册第10章是关于GPIO的介绍。6410一共有187个多功能输入输出端口,这些端口分为GPA~GPQ共17组。每组端口共用一套寄存器,包括GPxCON, GPxDAT, GPxPUD, GPxCONSLP,GPxUPSLP。其中GPxCON是端口的配置寄存器,GPxDAT是端口的数据寄存器。GPM组端口的寄存器描述如下:
Alt text

由此可知,点灯LED灯包括下面两个步骤:

  1. 配置GPMCON,使得GPM0~GPM3作为输出功能来使用
  2. 配置GPMDAT,使得低4位为0,即可以在对应管脚输出低电平

编码与测试

代码如下:

#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寄存器的描述。
Alt text
Alt text

这部分代码如下所示:

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启动,然后重启,即可以看裸机程序的执行效果。

  • 无标签