73x_vect.s
来自「最新版IAR FOR ARM(EWARM)5.11中的代码例子」· S 代码 · 共 1,404 行 · 第 1/4 页
S
1,404 行
;******************** (C) COPYRIGHT 2005 STMicroelectronics ********************
;* File Name : 73x_vect.s
;* Author : MCD Application Team
;* Date First Issued : 09/27/2005 : V1.0
;* Description : This File used to initialize the exception and IRQ
;* vectors, and to enter/return to/from exceptions handlers.
;*********************************************************************************
; History:
; 09/27/2005 : V1.0
;*********************************************************************************
; THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS WITH
; CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
; AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, INDIRECT
; OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE CONTENT
; OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING INFORMATION
; CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
;********************************************************************************/
MODULE ?RESET
SECTION .intvec:CODE(2)
CODE32
EIC_base_addr DEFINE 0xFFFFFC00 ; EIC base address
CICR_off_addr DEFINE 0x04 ; Current Interrupt Channel Register
IVR_off_addr DEFINE 0x18 ; Interrupt Vector Register
IPR0_off_addr DEFINE 0x40 ; Interrupt Pending Register
IPR1_off_addr DEFINE 0x44 ; Interrupt Pending Register
;*******************************************************************************
; Import the __iar_program_start from 73x_init.s
;*******************************************************************************
IMPORT __iar_program_start
;*******************************************************************************
; Import exception handlers
;*******************************************************************************
IMPORT Undefined_Handler
IMPORT SWI_Handler
IMPORT Prefetch_Handler
IMPORT Abort_Handler
IMPORT FIQ_Handler
;*******************************************************************************
; Import IRQ handlers from 73x_it.c
;*******************************************************************************
IMPORT PRCCUCMU_IRQHandler
IMPORT EXTIT01_IRQHandler
IMPORT EXTIT02_IRQHandler
IMPORT EXTIT03_IRQHandler
IMPORT EXTIT04_IRQHandler
IMPORT EXTIT05_IRQHandler
IMPORT EXTIT06_IRQHandler
IMPORT EXTIT07_IRQHandler
IMPORT EXTIT08_IRQHandler
IMPORT EXTIT09_IRQHandler
IMPORT EXTIT10_IRQHandler
IMPORT EXTIT11_IRQHandler
IMPORT EXTIT12_IRQHandler
IMPORT EXTIT13_IRQHandler
IMPORT EXTIT14_IRQHandler
IMPORT EXTIT15_IRQHandler
IMPORT DMATRERR_IRQHandler
IMPORT TIM1_IRQHandler
IMPORT TIM2_IRQHandler
IMPORT TIM3_IRQHandler
IMPORT TIM4_IRQHandler
IMPORT TB0_IRQHandler
IMPORT TB1_IRQHandler
IMPORT TB2_IRQHandler
IMPORT TIM5_IRQHandler
IMPORT TIM6_IRQHandler
IMPORT TIM7_IRQHandler
IMPORT TIM8_IRQHandler
IMPORT TIM9_IRQHandler
IMPORT UART2_IRQHandler
IMPORT UART3_IRQHandler
IMPORT FLASHEOP_IRQHandler
IMPORT PWM0_IRQHandler
IMPORT PWM1_IRQHandler
IMPORT PWM2_IRQHandler
IMPORT PWM3_IRQHandler
IMPORT PWM4_IRQHandler
IMPORT PWM5_IRQHandler
IMPORT WIU_IRQHandler
IMPORT WDGWUT_IRQHandler
IMPORT BSPI0_IRQHandler
IMPORT BSPI1_IRQHandler
IMPORT BSPI2_IRQHandler
IMPORT UART0_IRQHandler
IMPORT UART1_IRQHandler
IMPORT I2C0ITERR_IRQHandler
IMPORT I2C1ITERR_IRQHandler
IMPORT I2C0ITDDC_IRQHandler
IMPORT I2C1ITDDC_IRQHandler
IMPORT CAN0_IRQHandler
IMPORT CAN1_IRQHandler
IMPORT CAN2_IRQHandler
IMPORT DMA0_IRQHandler
IMPORT DMA1_IRQHandler
IMPORT DMA2_IRQHandler
IMPORT DMA3_IRQHandler
IMPORT ADC_IRQHandler
IMPORT RTC_IRQHandler
;*******************************************************************************
; Export Peripherals IRQ handlers table address
;*******************************************************************************
EXPORT PRCCUCMU_Addr
;*******************************************************************************
; Exception vectors
;*******************************************************************************
LDR PC, Reset_Addr
LDR PC, Undefined_Addr
LDR PC, SWI_Addr
LDR PC, Prefetch_Addr
LDR PC, Abort_Addr
NOP ; Reserved vector
LDR PC, IRQ_Addr
LDR PC, FIQ_Addr
;*******************************************************************************
; Exception handlers address table
;*******************************************************************************
Reset_Addr DCD __iar_program_start
Undefined_Addr DCD UndefinedHandler
SWI_Addr DCD SWIHandler
Prefetch_Addr DCD PrefetchAbortHandler
Abort_Addr DCD DataAbortHandler
DCD 0 ; Reserved vector
IRQ_Addr DCD IRQHandler
FIQ_Addr DCD FIQHandler
;*******************************************************************************
; Peripherals IRQ handlers address table
;*******************************************************************************
PRCCUCMU_Addr DCD PRCCUCMUIRQHandler
EXTIT01_Addr DCD EXTIT01IRQHandler
EXTIT02_Addr DCD EXTIT02IRQHandler
EXTIT03_Addr DCD EXTIT03IRQHandler
EXTIT04_Addr DCD EXTIT04IRQHandler
EXTIT05_Addr DCD EXTIT05IRQHandler
EXTIT06_Addr DCD EXTIT06IRQHandler
EXTIT07_Addr DCD EXTIT07IRQHandler
EXTIT08_Addr DCD EXTIT08IRQHandler
EXTIT09_Addr DCD EXTIT09IRQHandler
EXTIT10_Addr DCD EXTIT10IRQHandler
EXTIT11_Addr DCD EXTIT11IRQHandler
EXTIT12_Addr DCD EXTIT12IRQHandler
EXTIT13_Addr DCD EXTIT13IRQHandler
EXTIT14_Addr DCD EXTIT14IRQHandler
EXTIT15_Addr DCD EXTIT15IRQHandler
DMATRERR_Addr DCD DMATRERRIRQHandler
TIM1_Addr DCD TIM1IRQHandler
TIM2_Addr DCD TIM2IRQHandler
TIM3_Addr DCD TIM3IRQHandler
TIM4_Addr DCD TIM4IRQHandler
TB0_Addr DCD TB0IRQHandler
TB1_Addr DCD TB1IRQHandler
TB2_Addr DCD TB2IRQHandler
TIM5_Addr DCD TIM5IRQHandler
TIM6_Addr DCD TIM6IRQHandler
TIM7_Addr DCD TIM7IRQHandler
TIM8_Addr DCD TIM8IRQHandler
TIM9_Addr DCD TIM9IRQHandler
DCD 0
DCD 0
UART2_Addr DCD UART2IRQHandler
UART3_Addr DCD UART3IRQHandler
FlashEOP_Addr DCD FLASHEOPIRQHandler
PWM0_Addr DCD PWM0IRQHandler
PWM1_Addr DCD PWM1IRQHandler
PWM2_Addr DCD PWM2IRQHandler
PWM3_Addr DCD PWM3IRQHandler
PWM4_Addr DCD PWM4IRQHandler
PWM5_Addr DCD PWM5IRQHandler
WIUI_Addr DCD WIUIRQHandler
WDGWUT_Addr DCD WDGWUTIRQHandler
BSPI0_Addr DCD BSPI0IRQHandler
BSPI1_Addr DCD BSPI1IRQHandler
BSPI2_Addr DCD BSPI2IRQHandler
UART0_Addr DCD UART0IRQHandler
UART1_Addr DCD UART1IRQHandler
I2C0ITERR_Addr DCD I2C0ITERRIRQHandler
I2C1ITERR_Addr DCD I2C1ITERRIRQHandler
DCD 0
DCD 0
I2C0ITDDC_Addr DCD I2C0ITDDCIRQHandler
I2C1ITDDC_Addr DCD I2C1ITDDCIRQHandler
DCD 0
DCD 0
CAN0_Addr DCD CAN0IRQHandler
CAN1_Addr DCD CAN1IRQHandler
CAN2_Addr DCD CAN2IRQHandler
DMA0_Addr DCD DMA0IRQHandler
DMA1_Addr DCD DMA1IRQHandler
DMA2_Addr DCD DMA2IRQHandler
DMA3_Addr DCD DMA3IRQHandler
ADC_Addr DCD ADCIRQHandler
RTC_Addr DCD RTCIRQHandler
;*******************************************************************************
; Exception Handlers
;*******************************************************************************
;*******************************************************************************
;* Macro Name : SaveContext
;* Description : This macro used to save the context before entering
; an exception handler.
;* Input : The range of registers to store.
;* Output : none
;*******************************************************************************
SaveContext MACRO reg1,reg2
STMFD sp!,{reg1-reg2,lr} ; Save The workspace plus the current return
; address lr_ mode into the stack.
MRS r1,spsr ; Save the spsr_mode into r1.
STMFD sp!,{r1} ; Save spsr.
ENDM
;*******************************************************************************
;* Macro Name : RestoreContext
;* Description : This macro used to restore the context to return from
; an exception handler and continue the program execution.
;* Input : The range of registers to restore.
;* Output : none
;*******************************************************************************
RestoreContext MACRO reg1,reg2
LDMFD sp!,{r1} ; Restore the saved spsr_mode into r1.
MSR spsr_cxsf,r1 ; Restore spsr_mode.
LDMFD sp!,{reg1-reg2,pc}^; Return to the instruction following...
; ...the exception interrupt.
ENDM
;*******************************************************************************
;* Function Name : UndefinedHandler
;* Description : This function called when undefined instruction
; exception is entered.
;* Input : none
;* Output : none
;*******************************************************************************
UndefinedHandler
SaveContext r0,r12 ; Save the workspace plus the current
; return address lr_ und and spsr_und.
ldr r0, =Undefined_Handler
ldr lr,=Undefined_Handler_end
bx r0 ; Branch to Undefined_Handler
Undefined_Handler_end:
RestoreContext r0,r12 ; Return to the instruction following...
; ...the undefined instruction.
;*******************************************************************************
;* Function Name : SWIHandler
;* Description : This function called when SWI instruction executed.
;* Input : none
;* Output : none
;*******************************************************************************
SWIHandler
SaveContext r0,r12 ; Save the workspace plus the current
; return address lr_ svc and spsr_svc.
ldr r0, =SWI_Handler
ldr lr,=SWI_Handler_end
bx r0 ; Branch to SWI_Handler
SWI_Handler_end:
RestoreContext r0,r12 ; Return to the instruction following...
; ...the SWI instruction.
;*******************************************************************************
;* Function Name : IRQHandler
;* Description : This function called when IRQ exception is entered.
;* Input : none
;* Output : none
;*******************************************************************************
IRQHandler
SUB lr,lr,#4 ; Update the link register
SaveContext r0,r12 ; Save the workspace plus the current
; return address lr_ irq and spsr_irq.
LDR lr, =ReturnAddress; Read the return address.
LDR r0, =EIC_base_addr
LDR r1, =IVR_off_addr
ADD pc,r0,r1 ; Branch to the IRQ handler.
ReturnAddress
; Clear pending bit in EIC (using the proper IPRx)
LDR r0, =EIC_base_addr
LDR r2, [r0, #CICR_off_addr] ; Get the IRQ channel number
CMP r2,#31
SUBHI r2, r2, #32
MOV r3,#1
MOV r3,r3,LSL r2
STRHI r3,[r0, #IPR1_off_addr] ; Clear the corresponding IPR bit.
STRLS r3,[r0, #IPR0_off_addr] ; Clear the corresponding IPR bit.
RestoreContext r0,r12 ; Restore the context and return to the...
; ...program execution.
;*******************************************************************************
;* Function Name : PrefetchAbortHandler
;* Description : This function called when Prefetch Abort
; exception is entered.
;* Input : none
;* Output : none
;*******************************************************************************
PrefetchAbortHandler
SUB lr,lr,#4 ; Update the link register.
SaveContext r0,r12 ; Save the workspace plus the current
; return address lr_abt and spsr_abt.
ldr r0, =Prefetch_Handler
ldr lr,=Prefetch_Handler_end
bx r0 ; Branch to Prefetch_Handler.
Prefetch_Handler_end:
RestoreContext r0,r12 ; Return to the instruction following that...
; ...has generated the prefetch abort exception.
;*******************************************************************************
;* Function Name : DataAbortHandler
;* Description : This function is called when Data Abort
; exception is entered.
;* Input : none
;* Output : none
;*******************************************************************************
DataAbortHandler
SUB lr,lr,#8 ; Update the link register.
SaveContext r0,r12 ; Save the workspace plus the current
; return address lr_ abt and spsr_abt.
ldr r0, =Abort_Handler
ldr lr,=Abort_Handler_end
bx r0 ; Branch to Abort_Handler.
Abort_Handler_end:
RestoreContext r0,r12 ; Return to the instruction following that...
; ...has generated the data abort exception.
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?