⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 startup.s

📁 Keil UV3中自带操作系统ARTX的应用例程
💻 S
📖 第 1 页 / 共 2 页
字号:
				    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 + -