汇编之启动代码

DISABLE_IRQ_ALL EQU (1<<6 :OR: 1<<7)    ;把IRQ中断和FIQ

    GET    2440addr.inc
    IMPORT    main
    IMPORT    PLL_init
    IMPORT    BANK_Init
    IMPORT    STACK_init
    IMPORT    RORWZI_init
    PRESERVE8
    AREA  boot, CODE, READONLY    ;定义启动代码区域
    ENTRY
    CODE32


vector  ;异常向量入口
    B    ResetHandler    ;复位异常,程序一上电就进入该模式
    B    UndefHandler    ;未定义异常,程序出现未知异常的时候进入
    B    SVIHandler        ;软中断异常,操作系统里系统调试使用
    B    PAbortHandler    ;预取指异常,当取指令有问题的时候进入进行修复
    B    DAbortHandler    ;取数据异常,当CPU取数据的时候发生问题时进入修正
    B    .                ;保留,ARM公司预留没用的异常
    B    IRQHandler        ;普通中断
    B    FIQHandler        ;快中断                                 
         
ResetHandler    PROC
      ;关闭看门狗
      LDR R0,=WTCON    ;定义一个指针 *pwtcon
      LDR R1,=0x0    ;初始化R1,也就是看门狗的配置值,0表示关闭看门狗功能
      STR R1,[R0]    ;*pwrcon = R1

      ;屏蔽中断
      MRS R0,CPSR    ;先读取CPSR内容,R0=CPSR
      ORR R0,#DISABLE_IRQ_ALL     ;把R0的6 7位置1,也就是屏蔽IRQ和FIQ
      MSR CPSR_c,R0                 ;把R0的第八位写回到CPSR第八位,实现屏蔽中断
      
      ;配置时钟
      BL    PLL_init
      
      ;内存配置
      BL    BANK_Init
      
      ;配置堆栈
      BL    STACK_init
      
      ;配置RORWZI初始数据
      BL    RORWZI_init

       ;打开中断
      MRS R0,CPSR    ;先读取CPSR内容,R0=CPSR
      BIC R0,#DISABLE_IRQ_ALL     ;  把R0的6 7清0,也就是屏蔽IRQ和FIQ
      MSR CPSR_c,R0    ;把R0的第八位写回到CPSR第八位,实现打开中断

      BL main
      
      
      ENDP

Beep_init PROC;蜂鸣器
     LDR R0,=GPBCON
     LDR R1,[R0]
     ORR R1, R1,#(1 << 0)
     BIC R1, R1,#(1 << 1)
     STR R1,[R0]
     
     BX LR   ;子函数返回
     ENDP
Beep_set    PROC
     LDR R4, =GPBDAT
     LDR R1, [R4]
     CMP R0,#0
     BICEQ    R1, #(1 << 0)
     ORRNE    R1, #(1 << 0)
     STR R1,[R4]    
     BX    LR
     ENDP

delay_ms    PROC 
    LDR R1, =12000
loop_delay
    SUB R1,R1,#1
    CMP R1,#0
    BHI loop_delay
    SUB R0,#1
    CMP R0,#0
    BHI    delay_ms
    BX LR
    
    ENDP

UndefHandler    PROC
    B    UndefHandler
    ENDP
SVIHandler    PROC
    B    SVIHandler
    ENDP
PAbortHandler    PROC
    B    PAbortHandler
    ENDP
DAbortHandler    PROC
    B    DAbortHandler
    ENDP
    IMPORT irq_dispatch
    ;IMPORT    key_irq     
    ;IMPORT  key_led
IRQHandler    PROC
    ;压栈过程
    SUB LR,LR, #4
    STMFD SP!,{R0-R12,LR};入栈,!表示SP指针自动变
    
    ;中断处理过程
    ;BL key_irq     
    ;BL key_led
    BL irq_dispatch
    
    ;出栈
    LDMFD SP!,{R0-R12,PC}^    ;出栈,同时调回断点,^表示同时恢复中断的SP SR值到SVC模式的CPSR
    ENDP
FIQHandler    PROC
    B    FIQHandler
    ENDP
    
    END
 

猜你喜欢

转载自blog.csdn.net/Gaodes/article/details/81737990