zoukankan      html  css  js  c++  java
  • 汇编实现点亮Led灯(2440)

    1.gboot.lds

    OUTPUT_ARCH(arm)
    ENTRY(_start)
    SECTIONS {
        . = 0x30008000;
        
        . = ALIGN(4);
        .text :
        {
        start.o (.text)
        *(.text)
        }

        . = ALIGN(4);
        .data :
        {
        *(.data)
        }
        
        . = ALIGN(4);
        bss_start = .;
        .bss :
        {
        *(.bss)
        }
        bss_end = .;
    }
    2.start.S

    .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 disable_watchdog
        bl disable_interrupt
        bl disable_mmu
        bl init_clock
        bl init_sdram
        bl copy_to_ram
        bl init_stack
        bl clean_bss
        ldr pc, =gboot_main
    @    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 CLKDIVN 0x4c000014
    #define MPLLCON 0x4c000008
    #define MPLL_405MHZ ((127<<12)|(2<<4)|(1<<0))

    init_clock:
        ldr r0, =CLKDIVN
        mov r1, #0x5
        str r1, [r0]
        
        mcr p15,0,r0,c1,c0,0
        orr r0,r0,#0xc0000000
        mcr p15,0,r0,c1,c0,0
        
        ldr r0, =MPLLCON
        ldr r1, =MPLL_405MHZ
        str r1, [r0]
        mov pc, lr
        
    #define mem_contrl 0x48000000
    init_sdram:
        ldr r0, =mem_contrl
        add r3, r0, #4*13
        adrl r1, mem_data

    0:
        ldr r2, [r1], #4
        str r2, [r0], #4
        cmp r0, r3
        bne 0b
        mov pc, lr
        
    copy_to_ram:
        ldr r0, =0x0
        ldr r1, =0x30008000
        add r3, r0, #1024*4

    copy_loop:
        ldr r2, [r0], #4
        str r2, [r1], #4
        cmp r0, r3
        bne copy_loop
        mov pc, lr

    init_stack:
        ldr sp, =0x34000000
        mov pc ,lr

    clean_bss:
        ldr r0, =bss_start
        ldr r1, =bss_end
        cmp r0, r1
        moveq pc, lr

    clean_loop:
        mov r2, #0
        str r2, [r0], #4
        cmp r0, r1
        bne clean_loop
        mov pc, lr

    mem_data:
        .long 0x22000000
        .long 0x00000700
        .long 0x00000700
        .long 0x00000700
        .long 0x00000700
        .long 0x00000700
        .long 0x00000700
        .long 0x00018001
        .long 0x00018001
        .long 0x008c04f5
        .long 0x000000b1
        .long 0x00000030
        .long 0x00000030

    #define GPBCON 0x56000010
    #define GPBDAT 0x56000014
    light_led:
        ldr r0, =GPBCON
        mov r1, #0x400
        str r1, [r0]
        
        ldr r0, =GPBDAT
        mov r1, #0x0
        str r1, [r0]
        mov pc, lr

    3.main.c

    #define GPBCON (volatile unsigned long*)0x56000010
    #define GPBDAT (volatile unsigned long*)0x56000014

    int gboot_main()
    {
        *(GPBCON) = 0x400;
        *(GPBDAT) = 0x0;
        
        return 0;    
    }

    4.Makefile

    all: start.o main.o
        arm-linux-ld -Tgboot.lds -o gboot.elf $^
        arm-linux-objcopy -O binary gboot.elf gboot.bin
        
    %.o : %.S
        arm-linux-gcc -g -c $^
        
    %.o : %.c
        arm-linux-gcc -g -c $^
        
    .PHONY: clean
    clean:
        rm *.o *.elf *.bin


  • 相关阅读:
    游记&退役记
    Nothing to say
    学习知识点的比较好的blog
    计划做题列表
    后缀自动机小专题
    复数
    FFT学习
    P2900 [USACO08MAR]土地征用Land Acquisition
    # 数位DP入坑
    Hdu 4035 Maze(概率DP)
  • 原文地址:https://www.cnblogs.com/wxb20/p/6253649.html
Copyright © 2011-2022 走看看