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