27.点亮led的操作

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了27.点亮led的操作相关的知识,希望对你有一定的参考价值。

27.点亮led的操作

Led可以作为我调试程序的工具:在嵌入式系统软件,例如Bootloader和kernel,在开发初期,由于串口等硬件尚未被初始化,因此调试手段相当有限,这时候可以采用Led来作为调试手段。

OK6410有关led的原理图:

技术分享

从上图知道,要让led发光二极管,就是从右到左导通,右边是高电平,所以左边给低电平,二极管就会导通,发光了。

 

知道原理后,看看OK6410的核心板原理图,查看NLED1-4应该接到核心板的哪些引脚:led的部分截图:

技术分享

我们从上面的原理图知道,led1-4对应的是GPM0-3.对应NLED1-4.

 

 

2.GPIO

GPIO是General-Purpose Input/Output Ports:通用输入/输出端口。在嵌入式系统中,CPU经常需要控制许多结构简单的外部设备或者电路,这些设备通常只要两种状态,即是开关,对这些设备的控制,使用传统的串口或者USB口就显得复杂,所以,在嵌入式为控制器上通常提供了一种"通用的可编程的I/O端口",也就是GPIO。

技术分享

下面是6410GPIO的信息:GPMCON控制寄存器,GPMDAT数据寄存器。

技术分享

技术分享

GPMDAT数据寄存器:

技术分享

点亮led的实现思路:

  1. 设置GPIO控制寄存器,把引脚设置为输出功能
  2. 根据原理图设置GPIO数据寄存器,点亮led

实现的代码:点亮。3、4灯。
技术分享

编译,生成.bin文件。这是可执行文件。当我们烧写到开发板的时候,发现开发板不亮。这是因为我们在前面的操作中没有去初始化硬件的外设接口。

 

 

在19.Bootloader框架设置的时候有提到,uboot初始化的时候,6410比2440核多了一步就是外设基地址初始化:

技术分享

这里灯不亮就是前面的uboot框架设置的时候,少了这一步。

打开ARM11核的手册,搜索CP15:

技术分享

进入这一章:找到c15这一组寄存器里的Peripheral Port Memory Remap这个寄存器,就是外设基地址寄存器。前面的灯不亮,就是少了通过这寄存器的设置,对外设进行初始化。

设置参数:

技术分享

点击后面的页数,继续查看设置信息:

技术分享

技术分享

技术分享

技术分享

上面是核手册的信息:

下面是芯片手册的信息,有关外设基地址寄存器的设置。

技术分享

set_peri_port:

    ldr r0, =0x70000000 //ldr伪指令,装载0x70000000到r0。

    orr r0, r0, #0x13 //由上面知道,256内存对应的值:b10011=0x13

    mcr p15,0,r0,c15,c2,4 //对应上面的值设置cp15.

    mov pc, lr //返回

技术分享

其中上面的orr中的0x13=0b10011,是对应256M内存。

技术分享

下面是把设置好的值写到cp15:mcr p15,0,r0,c15,c2,4

技术分享

 

 

 

代码:

.text

.global _start

_start:

    b reset

    ldr pc, _undifined_instruction

    ldr pc, _software_interrupt

    ldr pc, _prefetch_abort

    ldr pc, _data_abort

    ldr pc, _not_used

    ldr pc, _irq

    ldr pc, _fiq

    

 

_undifined_instruction: .word undifined_instruction

_software_interrupt: .word software_interrupt

_prefetch_abort: .word prefetch_abort

_data_abort: .word data_abort

_not_used: .word not_used

_irq: .word irq

_fiq: .word reset

 

undifined_instruction:

    nop

 

software_interrupt:

    nop

    

prefetch_abort:

    nop

    

data_abort:

    nop

 

not_used:

    nop

 

irq:

    nop

 

fiq:    

    nop

    @什么是异常向量表

 

reset:

    bl set_svc

    bl [email protected]初始化外设接口

    bl disable_watchdog

    bl disable_interrupt

    bl disable_mmu

    bl light_led

 

set_svc:

    mrs r0,[email protected]把cpsr里的值读到r0

    bic r0,r0,#[email protected]清除r0,即cpsr的后五位为0

    orr r0,r0,#[email protected]设置r0的后五位为10011,svc的值

    msr cpsr,[email protected]把值写回cpsr。svc模式设置完成

 

set_peri_port:

    ldr r0, =0x70000000

    orr r0, r0, #0x13

    mcr p15,0,r0,c15,c2,4

    mov pc, lr

 

#define pWTCON 0x7E004000

disable_watchdog:

    ldr r0,[email protected]把这个常量装载到r0里面

    mov r1,#[email protected]这里不能直接将pWTCON的值直接mov到寄存器里面

    @mov的对象是通用寄存器。这里需要使用str指令装载。

    str r1,[r0]@把r1存到0x7E004000

 

disable_interrupt:

    mvn r1,#[email protected]往r1写入全1

    ldr r0,=0x71200014

    str r1,[r0]

 

    ldr r0,=0x71300014

    str r1,[r0]

disable_mmu:

    mcr p15,0,r0,c7,c7,[email protected]

    mrc p15,0,r0,c1,c0,0

    bic r0, r0, #[email protected]设置后三位为111,关闭cachemmu等

    mcr p15,0,r0,c1,c0,0

    mov pc, lr

 

#define lGPMCON 0x7F008820

#define lGPMDAT 0x7F008824

light_led:

    ldr r0,[email protected]内部寄存器不能被直接访问

    ldr r1,=0x1111

    str r1,[r0]@设置GPM的末四位为输出引脚

 

    ldr r0,=lGPMDAT

    mov r1,#[email protected]往3.4led输出低电平,亮

    str r1,[r0]

    mov pc,lr

技术分享

 

以上是关于27.点亮led的操作的主要内容,如果未能解决你的问题,请参考以下文章

点亮指路灯led

单片机串口通信控制led灯的点亮

2022-2-23作业

ARM 学习笔记之二 LED点亮程序设计

从点亮一个LED开始,Cortex-A9裸机程序设计

实现点亮LED灯