📄 startup.s
字号:
AND R12, #0x1f ;防止32个中断序号越界,在此可再做序号越界处理(可省略)
ELSE
AND R12, #0x0f ;防止16个中断序号越界,在此可再做序号越界处理(可省略)
ENDIF
ADD R12, #0x02; ;取偏移量---晕到~~~有中断号该多好呀
LDR R12, [PC, R12, LSL #2];散转到用户真正的向量中断地址
STR R12, [SP, #0x04];将中断向量地址R12写入事先保存的那个LR空间
LDMFD SP!, {R12, PC};恢复R12,同时PC跳入中断向量地址执行
ELSE;只需要堆栈保护运算变量
LDR R12, VIC_Vect_Addr;取VICVectAddr物理地址,LDR R12,[PC, -xxx]指令寻址越界
LDR R12, [R12] ;取出取VICVectAddr内实际向量中断号(非地址)
IF Vectors_ARTX + Vectors_DEFVIC <> 0
AND R12, #0x1f ;防止32个中断序号越界,在此可再做序号越界处理(可省略)
ELSE
AND R12, #0x0f ;防止16个中断序号越界,在此可再做序号越界处理(可省略)
ENDIF
LDR PC, [PC, R12, LSL #2];散转到用户真正的向量中断地址
ENDIF
;VICVectAddr物理地址(内存VICVectAddr0~VICVectAddr15的当前中断向量值!!!)
VIC_Vect_Addr DCD 0xFFFFF030;VICVectAddr物理地址
;用户ROM当前中断向量地址VIC_Vect_Addr0~VIC_Vect_Addr15
; IMPORT UserVic_Handler
VIC_Vect_Addr0 DCD Reset_Handler
; IMPORT UserVic_Handler
VIC_Vect_Addr1 DCD Reset_Handler
; IMPORT UserVic_Handler
VIC_Vect_Addr2 DCD Reset_Handler
; IMPORT UserVic_Handler
VIC_Vect_Addr3 DCD Reset_Handler
; IMPORT UserVic_Handler
VIC_Vect_Addr4 DCD Reset_Handler
; IMPORT UserVic_Handler
VIC_Vect_Addr5 DCD Reset_Handler
; IMPORT UserVic_Handler
VIC_Vect_Addr6 DCD Reset_Handler
; IMPORT UserVic_Handler
VIC_Vect_Addr7 DCD Reset_Handler
; IMPORT UserVic_Handler
VIC_Vect_Addr8 DCD Reset_Handler
; IMPORT UserVic_Handler
VIC_Vect_Addr9 DCD Reset_Handler
; IMPORT UserVic_Handler
VIC_Vect_Addr10 DCD Reset_Handler
; IMPORT UserVic_Handler
VIC_Vect_Addr11 DCD Reset_Handler
; IMPORT UserVic_Handler
VIC_Vect_Addr12 DCD Reset_Handler
; IMPORT UserVic_Handler
VIC_Vect_Addr13 DCD Reset_Handler
; IMPORT UserVic_Handler
VIC_Vect_Addr14 DCD Reset_Handler
IF Vectors_ARTX <> 0
; ARTX节拍中断装载物理地址
IMPORT os_clock_interrupt
VIC_Vect_Addr15 DCD os_clock_interrupt;ARTX节拍中断向量地址位置
ELSE
; 非ARTX某模块中断装载物理地址
; IMPORT UserVic_Handler
VIC_Vect_Addr15 DCD Reset_Handler
ENDIF
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
IF Vectors_ARTX <> 0
; 非ARTX非中断向量非典装载物理地址
; IMPORT UserVic_Handler
VIC_Vect_Addr16 DCD Reset_Handler
; IMPORT UserVic_Handler
VIC_Vect_Addr17 DCD Reset_Handler
; IMPORT UserVic_Handler
VIC_Vect_Addr18 DCD Reset_Handler
; IMPORT UserVic_Handler
VIC_Vect_Addr19 DCD Reset_Handler
; IMPORT UserVic_Handler
VIC_Vect_Addr20 DCD Reset_Handler
; IMPORT UserVic_Handler
; ARTX向量中断非典防御装载物理地址(游客禁入!!!)
VIC_Vect_Addr21 NOP
VIC_Vect_Addr22 NOP
VIC_Vect_Addr23 NOP
VIC_Vect_Addr24 NOP
VIC_Vect_Addr25 NOP
VIC_Vect_Addr26 NOP
VIC_Vect_Addr27 NOP
VIC_Vect_Addr28 NOP
VIC_Vect_Addr29 NOP
VIC_Vect_Addr30 NOP
; ARTX默认中断非典装载物理地址
IMPORT os_def_interrupt;UserDefVic_Handler
VIC_Vect_Addr31 DCD os_def_interrupt;UserDefVic_Handler
ELSE
IF Vectors_DEFVIC <> 0
; 非ARTX非中断向量非典装载物理地址
; IMPORT UserVic_Handler
VIC_Vect_Addr16 DCD Reset_Handler
; IMPORT UserVic_Handler
VIC_Vect_Addr17 DCD Reset_Handler
; IMPORT UserVic_Handler
VIC_Vect_Addr18 DCD Reset_Handler
; IMPORT UserVic_Handler
VIC_Vect_Addr19 DCD Reset_Handler
; IMPORT UserVic_Handler
VIC_Vect_Addr20 DCD Reset_Handler
; IMPORT UserVic_Handler
VIC_Vect_Addr21 DCD Reset_Handler
; IMPORT UserVic_Handler
VIC_Vect_Addr22 DCD Reset_Handler
; IMPORT UserVic_Handler
VIC_Vect_Addr23 DCD Reset_Handler
; IMPORT UserVic_Handler
VIC_Vect_Addr24 DCD Reset_Handler
; IMPORT UserVic_Handler
VIC_Vect_Addr25 DCD Reset_Handler
; IMPORT UserVic_Handler
VIC_Vect_Addr26 DCD Reset_Handler
; IMPORT UserVic_Handler
VIC_Vect_Addr27 DCD Reset_Handler
; IMPORT UserVic_Handler
VIC_Vect_Addr28 DCD Reset_Handler
; IMPORT UserVic_Handler
VIC_Vect_Addr29 DCD Reset_Handler
; IMPORT UserVic_Handler
VIC_Vect_Addr30 DCD Reset_Handler
; 非ARTX默认中断非典装载物理地址!!!
IMPORT DEF_Handler
VIC_Vect_Addr31 DCD DEF_Handler
ENDIF
ENDIF
ENDIF
ENDIF
; Reset Handler
EXPORT Reset_Handler
Reset_Handler
; Setup VPBDIV
IF VPBDIV_SETUP <> 0
LDR R0, =VPBDIV
LDR R1, =VPBDIV_Val
STR R1, [R0]
ENDIF
; Setup PLL
IF PLL_SETUP <> 0
LDR R0, =PLL_BASE
MOV R1, #0xAA
MOV R2, #0x55
; Configure and Enable PLL
MOV R3, #PLLCFG_Val
STR R3, [R0, #PLLCFG_OFS]
MOV R3, #PLLCON_PLLE
STR R3, [R0, #PLLCON_OFS]
STR R1, [R0, #PLLFEED_OFS]
STR R2, [R0, #PLLFEED_OFS]
; Wait until PLL Locked
PLL_Loop LDR R3, [R0, #PLLSTAT_OFS]
ANDS R3, R3, #PLLSTAT_PLOCK
BEQ PLL_Loop
; Switch to PLL Clock
MOV R3, #(PLLCON_PLLE:OR:PLLCON_PLLC)
STR R3, [R0, #PLLCON_OFS]
STR R1, [R0, #PLLFEED_OFS]
STR R2, [R0, #PLLFEED_OFS]
ENDIF ; PLL_SETUP
; Setup MAM
IF MAM_SETUP <> 0
LDR R0, =MAM_BASE
MOV R1, #MAMTIM_Val
STR R1, [R0, #MAMTIM_OFS]
MOV R1, #MAMCR_Val
STR R1, [R0, #MAMCR_OFS]
ENDIF ; MAM_SETUP
; Memory Mapping (when Interrupt Vectors are in RAM)
MEMMAP EQU 0xE01FC040 ; Memory Mapping Control
IF :DEF:REMAP
LDR R0, =MEMMAP
IF :DEF:RAM_MODE
MOV R1, #2
ELSE
MOV R1, #1
ENDIF
STR R1, [R0]
ENDIF
; Initialise Interrupt System
; ...
; Setup Stack for each mode
LDR R0, =Stack_Top
; Enter Undefined Instruction Mode and set its Stack Pointer
MSR CPSR_c, #Mode_UND:OR:I_Bit:OR:F_Bit
MOV SP, R0
SUB R0, R0, #UND_Stack_Size
; Enter Abort Mode and set its Stack Pointer
MSR CPSR_c, #Mode_ABT:OR:I_Bit:OR:F_Bit
MOV SP, R0
SUB R0, R0, #ABT_Stack_Size
; Enter FIQ Mode and set its Stack Pointer
MSR CPSR_c, #Mode_FIQ:OR:I_Bit:OR:F_Bit
MOV SP, R0
SUB R0, R0, #FIQ_Stack_Size
; Enter IRQ Mode and set its Stack Pointer
MSR CPSR_c, #Mode_IRQ:OR:I_Bit:OR:F_Bit
MOV SP, R0
SUB R0, R0, #IRQ_Stack_Size
; Enter Supervisor Mode and set its Stack Pointer
MSR CPSR_c, #Mode_SVC:OR:I_Bit:OR:F_Bit
MOV SP, R0
SUB R0, R0, #SVC_Stack_Size
; Enter User Mode and set its Stack Pointer
MSR CPSR_c, #Mode_USR:OR:(I_Bit*UserIRQEnable):OR:(F_Bit*UserFIQEnable)
MOV SP, R0
SUB SL, SP, #USR_Stack_Size
; Enter the C code
IMPORT __main
LDR R0, =__main
BX R0;跳入主程序程序
IF :DEF: EN_CRP
IF . >= 0x1fc
INFO 1,"\nThe data at 0x000001fc must be 0x87654321.\nPlease delete some source before this line."
ENDIF
CrpData
WHILE . < 0x1fc
DCD 0xffffffff
WEND
CrpData1
DCD 0x87654321 ;/*When the Data is 为0x87654321,user code be protected. 当此数为0x87654321时,用户程序被保护 */
ENDIF
; User Initial Stack & Heap
AREA |.text|, CODE, READONLY
IMPORT __use_two_region_memory
EXPORT __user_initial_stackheap
__user_initial_stackheap
LDR R0, = Heap_Mem
LDR R1, =(Stack_Mem + USR_Stack_Size)
LDR R2, = (Heap_Mem + Heap_Size)
LDR R3, = Stack_Mem
BX LR
;void IAP_Execute (struct sIAP *pIAP);
AREA |.text|, CODE, READONLY
EXPORT iap_execute
iap_execute STMFD SP!,{LR} ; Save Return Address
ADD R1,R0,#0x14 ; R0 = &IAP.cmd, R1 = &IAP.stat
ADR LR,iap_exit ; Return Address
LDR R2,=0x7FFFFFF1 ; IAP Entry (Thumb Mode)
BX R2 ; Execute IAP Command
iap_exit LDMFD SP!,{LR} ; Restore Return Address
MOV PC,LR ; Return
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -