zoukankan      html  css  js  c++  java
  • 7.点亮led的操作

    7.点亮led的操作

    Led可以作为我调试程序的工具。

    OK6410的核心板原理图:led的部分截图:

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

    2.GPIO

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

    下面是6410GPIO的信息:GPMCON控制寄存器:

    GPMDAT数据寄存器:

    实现的代码:点亮。3、4灯。

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

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

    下面是把设置好的值写到cp15:

     

     

     

    代码:

    .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 set_peri_port@初始化外设接口

        bl disable_watchdog

        bl disable_interrupt

        bl disable_mmu

        bl light_led

     

    set_svc:

        mrs r0,cpsr@把cpsr里的值读到r0

        bic r0,r0,#0x1f@清除r0,即cpsr的后五位为0

        orr r0,r0,#0xd3@设置r0的后五位为10011,svc的值

        msr cpsr,r0@把值写回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,=pWTCON@把这个常量装载到r0里面

        mov r1,#0x0@这里不能直接将pWTCON的值直接mov到寄存器里面

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

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

     

    disable_interrupt:

        mvn r1,#0x0@往r1写入全1

        ldr r0,=0x71200014

        str r1,[r0]

     

        ldr r0,=0x71300014

        str r1,[r0]

    disable_mmu:

        mcr p15,0,r0,c7,c7,0@controller

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

        bic r0, r0, #0x00000007@设置后三位为111,关闭cachemmu等

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

        mov pc, lr

     

    #define lGPMCON 0x7F008820

    #define lGPMDAT 0x7F008824

    light_led:

        ldr r0,=lGPMCON@内部寄存器不能被直接访问

        ldr r1,=0x1111

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

     

        ldr r0,=lGPMDAT

        mov r1,#0x3@往3.4led输出低电平,亮

        str r1,[r0]

        mov pc,lr

     

     

  • 相关阅读:
    protobuf使用遇到的坑
    嵌入式开发入门心得记录
    vim编辑模式下黑色背景,下来过程中出现白条的问题
    linux中awk的应用
    ntp时间同步
    mysql5.5适配
    centos 安装 epel
    ubuntu jdk安装
    add_header Access-Control-Allow-Origin $http_Origin always;
    111
  • 原文地址:https://www.cnblogs.com/FORFISH/p/4199687.html
Copyright © 2011-2022 走看看