OK6410 LED灯驱动

来源:互联网 发布:淘宝修改会员名的条件 编辑:程序博客网 时间:2024/04/28 06:43

首先还是从电路图开始:
 

 

User LED电路图

 

 

User LED CPU管脚接线图

 

从电路图文档中可以看出,LED是通过GPIOM端口实现的,其中分别用到了GPM0/1/2/3管脚。根据LED的接线图可以看出只有在NLED0/1/2/3为低电平时,才会导通点亮。M端口有6个管脚,三个对应的寄存器:

 

GPMCON是控制寄存器,控制管脚的功能:用作输入,输出等。

GPMDAT是数据寄存器,内容与管脚电平相一致,也即GPM0为高电平那么对应的0b11.

GPMPUD是用来控制功率输出的,通常在电平输出不符合要求是,实现电平的上拉和下拉。

 

                     相关寄存器文档(芯片手册300 pg.)

 

Bootloader中对应GPM初始化的代码位于board/samsung/smdk6410/lowlevel_init.S

  1. /* LED on only #8 */
  2. ldr r0, =ELFIN_GPIO_BASE
  3. ldr r1, =0x00111111
  4. str r1, [r0, #GPMCON_OFFSET]

  5. ldr r1, =0x00000555
  6. str r1, [r0, #GPMPUD_OFFSET]

  7. ldr r1, =0x002a
  8. str r1, [r0, #GPMDAT_OFFSET]

 

相关寄存器定义在include/s3c6410.h

 

  1. #define ELFIN_GPIO_BASE 0x7f008000
  2. #define GPMCON_OFFSET 0x820
  3. #define GPMDAT_OFFSET 0x824
  4. #define GPMPUD_OFFSET 0x828

ldr指令用来将立即数装载如寄存器,strr1中的值写入间址GPMDAT_OFFSET+r0ELFIN_GPIO_BASE定义的就是实际的物理地址,不难看出bootloader是实地址寻址的。

 

3行写入0x00111111GPMCON寄存器,也即配置GPM0-5为输出。

接着2行写入0x00000555GPMPUD寄存器,配置GPM0-5内部电阻下拉使能。这是因为如果要点亮LED,那么需要低电平,下拉可以保证下拉电阻接地产生低电平。

最后2行写入0x002aGPMDATA寄存器,也即0b101010,所以对应的GPM0/2/4是低电平,GPM1/3/5是高电平,与此相连的LED1/3点亮,LED2/4熄灭,这也就是为何开发板上电后LED1/3点亮的原因。




http://blog.chinaunix.net/space.php?uid=20608849&do=blog&id=2141924