📄 71x_vect.s79
字号:
;-----------------------------------------------------------------------------
; ?RESET
; 复位向量。通常INTVEC段被连接到0地址,为程序调试方便,也可以将其放在其它地址。
;-----------------------------------------------------------------------------
MODULE ?RESET
COMMON INTVEC:CODE:NOROOT(2)
EXTERN __program_start
CODE32
EIC_base_addr DEFINE 0xFFFFF800; EIC 基地址
CICR_off_addr DEFINE 0x04 ; 当前中断通道寄存器
IVR_off_addr DEFINE 0x18 ; 中断向量寄存器
IPR_off_addr DEFINE 0x40 ; 中断悬挂寄存器
;*******************************************************************************
; 导入异常句柄
;*******************************************************************************
IMPORT Undefined_Handler
IMPORT SWI_Handler
IMPORT Prefetch_Handler
IMPORT Abort_Handler
IMPORT FIQ_Handler
;*******************************************************************************
; 从71x_it.c文件导入IRQ异常句柄
;*******************************************************************************
IMPORT T0TIMI_IRQHandler ;Timer0 IRQ中断句柄
;需要时可以在此加入其它IRQ中断句柄
;*******************************************************************************
; 导出外设IRQ句柄表地址
;*******************************************************************************
EXPORT T0TIMI_Addr
EXPORT IRQHandler
;*******************************************************************************
; 异常向量
;*******************************************************************************
LDR PC, Reset_Addr
LDR PC, Undefined_Addr
LDR PC, SWI_Addr
LDR PC, Prefetch_Addr
LDR PC, Abort_Addr
NOP ;保留向量
LDR PC, IRQ_Addr
LDR PC, FIQ_Addr
;*******************************************************************************
; 异常句柄地址表
;*******************************************************************************
Reset_Addr DCD __program_start
Undefined_Addr DCD UndefinedHandler
SWI_Addr DCD SWIHandler
Prefetch_Addr DCD PrefetchAbortHandler
Abort_Addr DCD DataAbortHandler
DCD 0 ;保留向量
IRQ_Addr DCD IRQHandler
FIQ_Addr DCD FIQHandler
;*******************************************************************************
; 外设IRQ句柄地址表
;*******************************************************************************
T0TIMI_Addr DCD T0TIMIIRQHandler
;需要时可以在此定义其它外设IRQ句柄地址,如:FLASH_Addr DCD FLASHIRQHandler
;*******************************************************************************
; 异常句柄
;*******************************************************************************
;*******************************************************************************
;说明:SaveContext宏,用于进入异常句柄之前保存上下文(context)
;入口:需要保存的寄存器范围
;出口:无
;*******************************************************************************
SaveContext MACRO reg1,reg2
STMFD sp!,{reg1-reg2,lr} ;将当前工作区和返回地址进栈保存
MRS r1,spsr ;将spsr_mode保存到r1
STMFD sp!,{r1} ;保存spsr
ENDM
;*******************************************************************************
;说明:RestoreContext宏,用于恢复异常句柄上下文,使程序继续运行
;入口:需要恢复的寄存器范围
;出口:无
;*******************************************************************************
RestoreContext MACRO reg1,reg2
LDMFD sp!,{r1} ;将保存的spsr_mode恢复到r1
MSR spsr_cxsf,r1 ;恢复spsr_mode.
LDMFD sp!,{reg1-reg2,pc}^ ;返回
ENDM
;*******************************************************************************
;说明:UndefinedHandler函数,该函数在发生未定义指令异常时调用
;入口:无
;出口:无
;*******************************************************************************
UndefinedHandler
SaveContext r0,r12 ;保存工作区和当前返回地址lr_und及spsr_und
BL Undefined_Handler ;跳转到Undefined_Handler
RestoreContext r0,r12 ;恢复上下文,返回
;*******************************************************************************
;说明:SWIHandler函数,该函数在执行SWI指令时调用
;入口:无
;出口:无
;*******************************************************************************
SWIHandler
SaveContext r0,r12 ;保存工作区和当前返回地址lr_svc及spsr_svc
BL SWI_Handler ;跳转到SWI_Handler.
RestoreContext r0,r12 ;恢复上下文,返回
;*******************************************************************************
;说明:IRQHandler函数,该函数在进入IRQ异常时调用
;入口:无
;出口:无
;*******************************************************************************
IRQHandler
SUB lr,lr,#4 ;更新链接寄存器
SaveContext r0,r12 ;保存工作区和当前返回地址lr_irq及spsr_irq
LDR lr, =ReturnAddress ;读取返回地址
LDR r0, =EIC_base_addr
LDR r1, =IVR_off_addr
ADD pc,r0,r1 ;跳转到IRQ handler
ReturnAddress:
;清除EIC中的未决位(使用合适的IPRx)
LDR r0, =EIC_base_addr
LDR r2, [r0, #CICR_off_addr] ;获得IRQ通道号
MOV r3,#1
MOV r3,r3,LSL r2
STR r3,[r0, #IPR_off_addr] ;清除相应的IPR位
RestoreContext r0,r12 ;恢复上下文,返回
;*******************************************************************************
;说明:PrefetchAbortHandler函数,该函数在进入预取中止异常时调用
;入口:无
;出口:无
;*******************************************************************************
PrefetchAbortHandler
SUB lr,lr,#4 ;更新链接寄存器
SaveContext r0,r12 ;保存工作区和当前返回地址lr_abt及spsr_abt
BL Prefetch_Handler ;跳转到Prefetch_Handler.
RestoreContext r0,r12 ;恢复上下文,返回
;*******************************************************************************
;说明:DataAbortHandler函数,该函数在进入数据中止异常时调用
;入口:无
;出口:无
;*******************************************************************************
DataAbortHandler
SUB lr,lr,#8 ;更新链接寄存器
SaveContext r0,r12 ;保存工作区和当前返回地址lr_abt及spsr_abt
BL Abort_Handler ;跳转到Abort_Handler.
RestoreContext r0,r12 ;恢复上下文,返回
;*******************************************************************************
;说明:FIQHandler,该函数在进入FIQ异常时调用
;入口:无
;出口:无
;*******************************************************************************
FIQHandler
SUB lr,lr,#4 ;更新链接寄存器
SaveContext r0,r7 ;保存工作区和当前返回地址lr_ fiq及spsr_fiq
BL FIQ_Handler ;跳转到FIQ_Handler
RestoreContext r0,r7 ;恢复上下文,返回
;*******************************************************************************
;说明:IRQ_to_SYS宏,用于从IRQ模式切换到SYS模式
;入口:无
;出口:无
;*******************************************************************************
IRQ_to_SYS MACRO
MSR cpsr_c,#0x1F ;切换到SYS模式
STMFD sp!,{lr} ;保存链接寄存器
ENDM
;*******************************************************************************
;说明:SYS_to_IRQ宏,用于从SYS模式切换到IRQ模式,然后返回到IRQ句柄
;入口:无
;出口:无
;*******************************************************************************
SYS_to_IRQ MACRO
LDMFD sp!,{lr} ;恢复链接寄存器
MSR cpsr_c,#0xD2 ;切换到IRQ模式
MOV pc,lr ;返回到IRQHandler,清除未决位
ENDM
;*******************************************************************************
;说明:T0TIMIIRQHandler函数,用于在进入由71x_it.c文件定义的T0TIMI_IRQHandler
; 函数之前切换到SYS模式,当T0TIMI_IRQHandler结束时再返回到IRQ模式
;入口:无
;出口:无
;*******************************************************************************
T0TIMIIRQHandler
IRQ_to_SYS
BL T0TIMI_IRQHandler
SYS_to_IRQ
;*******************************************************************************
; 需要时在此定义其它函数
;*******************************************************************************
LTORG
ENDMOD
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -