zoukankan      html  css  js  c++  java
  • 点亮指路灯led

    为什么要使用LED?

    (bootloader,kernel)开发初期,由于串口等硬件尚未被初始化,因此调试手段相当有限,这时通常会采用LED来做为程序调试的重要手段。

    LED驱动设计:

    1、设置GPIO控制寄存器,把引脚设置为输出功能

    2、根据原理图设置GPIO数据寄存器,点亮LED

    .text
    .global _start
    _start:
        b reset
        ldr pc, _undefined_instruction
        ldr pc, _software_interrupt
        ldr pc, _prefetch_abort
        ldr pc, _data_abort
        ldr pc, _not_used
        ldr pc, _irq
        ldr pc, _fiq
    
    _undefined_instruction: .word undefined_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
    
    undefined_instruction:
        nop
        
    software_interrupt:
        nop
    
    prefetch_abort:
        nop
        
    data_abort:
        nop
        
    not_used:
        nop
        
    irq:
        nop
        
    fiq:
        nop
    
    reset:
        bl set_svc
        bl disable_watchdog    
        bl disable_interrupt
        bl disable_mmu
        bl light_led
            
    set_svc:
        mrs r0, cpsr
        bic r0, r0, #0x1f
        orr r0, r0, #0xd3
        msr cpsr, r0
        mov pc, lr
    
    #define pwTCON 0x53000000
    disable_watchdog:
        ldr r0, =pwTCON
        mov r1, #0x0
        str r1, [r0]
        mov pc, lr
    
    disable_interrupt:
        mvn r1, #0x0
        ldr r0, =0x4a000008
        str r1,[r0]
        mov pc, lr    
    
    disable_mmu:
        mcr p15,0,r0,c7,c7,0
        mrc p15,0,r0,c1,c0,0
        bic r0,r0,#0x00000007
        mcr p15,0,r0,c1,c0,0
        mov pc, lr
    
    #define GPBCON 0x56000010
    #define GPBDAT 0x56000014
    light_led:
        ldr r0, =GPBCON
        ldr r1, =0x15400
        str r1,[r0]
        
        ldr r0, =GPBDAT
        ldr r1, =0x6bf
        str r1, [r0]
        mov pc, lr

    黄色部分就是点亮LED的程序,我之前学51、K60、stm32的时候,发现这些设置寄存器是惊人的相似,都是先选择模式,在选择怎么输出。

    6410的LED就是这样,但是如果把这个代码下载到开发板里面去,发现不行,这是因为我之前有一篇博客讲的是bootloader架构设计中讲到

    #define GPBCON 0x7f008800
    #define GPBDAT 0x7f008808
    light_led:
        ldr r0, =GPBCON
        ldr r1, =0x11110000
        str r1,[r0]
        
        ldr r0, =GPBDAT
        ldr r1, =0xa0
        str r1, [r0]
        mov pc, lr

    6410还需要外设基地址初始化,CP15寄存器里面有管理外设基地址的寄存器。

    外设基地址是0x70000000,这个在6410手册里面搜索70000000就行

    对于210开发板,还需要一个加头程序,程序链接:https://pan.baidu.com/s/1gfVTFgf 密码:44ry 用的话就在Linux下执行这个程序   ./mkv210  gboot  goot-210

    这样就生成了含有加头代码的gboot 

  • 相关阅读:
    样式表中!important的用法
    ORA27101: shared memory realm does not exist问题的解决
    重置标识列的当前值
    ASP.NET Oracle数据库使用事务时注意事项
    Oracle中约束的添加方法总结
    HTML段落自动换行的样式设置
    ASP.NET应用程序中的服务器错误
    oracle中的rownum、order by与分页
    position:relative与float的区别
    Moss/Sharepoint 备份或还原时出错的处理(持续更新)
  • 原文地址:https://www.cnblogs.com/sanshijvshi/p/8343861.html
Copyright © 2011-2022 走看看