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

📄 startup.s

📁 点菜系统 内置很多功能
💻 S
字号:

;/*******************************************************************************************************
;* 文件名:Startup.s
;* 功  能:开发板启动代码。包含异常向量表,当异常(包括复位)发生时,程序将从异常向量表取指进行跳转。还包
;*         含对各模式系统堆栈的初始化代码,接着调用开发板初始化代码,最后跳转到C语言main()函数入口处。
;*         另外,开/关IRQ中断和FIQ中断采用SWI的方式实现,处理程序也在本文件中。
;* 作  者:POWER
;* 日  期:2006年5月25号
;* 斯凯科技主页:www.armsky.net
;* 斯凯科技论坛:www.armsky.net/bbs
;********************************************************************************************************/

;/*定义堆栈的大小*/
SVC_STACK_LEGTH         EQU         0
FIQ_STACK_LEGTH         EQU         0
IRQ_STACK_LEGTH         EQU         256
ABT_STACK_LEGTH         EQU         0
UND_STACK_LEGTH         EQU         0


NoInt       EQU 0x80                ;// Bit7,I位

NoFIQ		EQU	0x40                ;// Bit6,F位

USR32Mode   EQU 0x10                ;// M[4:0]=10000,用户模式
SVC32Mode   EQU 0x13                ;// M[4:0]=10011,管理模式
SYS32Mode   EQU 0x1f                ;// M[4:0]=11111,系统模式
IRQ32Mode   EQU 0x12                ;// M[4:0]=10010,IRQ中断
FIQ32Mode   EQU 0x11                ;// M[4:0]=10001,快速中断



    IMPORT __use_no_semihosting_swi
   

;/* 引入的外部标号在这声明 */
    IMPORT  FIQ_Exception           ;// 快速中断异常处理程序 
    IMPORT  __main                  ;// C语言主程序入口      
    IMPORT  TargetResetInit         ;// 开发板基本初始化     

;/* 给外部使用的标号在这声明 */
    EXPORT  bottom_of_heap
    EXPORT  StackUsr
    
    EXPORT  Reset
    EXPORT __user_initial_stackheap
    

    CODE32

    AREA    vectors,CODE,READONLY
        ENTRY

;/* 中断向量表 */
Reset
        LDR     PC, ResetAddr                   ;// 0x00000000,复位
        LDR     PC, UndefinedAddr               ;// 0x00000004,未定义地址
        LDR     PC, SWI_Addr                    ;// 0x00000008,软件中断
        LDR     PC, PrefetchAddr                ;// 0x0000000c,预取指中止
        LDR     PC, DataAbortAddr               ;// 0x00000010,数据中止
        DCD     0xb9205f80                      ;// 0x00000014,保留  
        LDR     PC, [PC, #-0xff0]               ;// 0x00000018,IRQ中断
        LDR     PC, FIQ_Addr                    ;// 0x0000001c,FIQ中断

ResetAddr           DCD     ResetInit           ;// 复位初始化处理程序地址
UndefinedAddr       DCD     Undefined           ;// 未定义指令处理程序地址
SWI_Addr            DCD     SoftwareInterrupt   ;// 软件中断处理程序地址
PrefetchAddr        DCD     PrefetchAbort       ;// 预取指中止处理程序地址
DataAbortAddr       DCD     DataAbort           ;// 数据中止处理程序地址
Nouse               DCD     0                   ;// 未使用
IRQ_Addr            DCD     0                   ;// IRQ中断,已在"LDR PC,[PC,#-0xff0]"中处理
FIQ_Addr            DCD     FIQ_Handler         ;// FIQ中断处理程序地址

;/* 未定义指令 */
Undefined
        B       Undefined                       ;// 死循环

;/* 软中断,中断号0~3已经占用 */
SoftwareInterrupt			
                             
        CMP     R0, #4                          ;// 判断传过来的参数是否大于4
        LDRLO   PC, [PC, R0, LSL #2]            ;// 小于4(参数正确),进行查表
        MOVS    PC, LR                          ;// 大于或等于4(参数出错),则返回

SwiFunction                                    
        DCD     IRQDisable                      ;// 0号调用,禁止IRQ中断 
        DCD     IRQEnable                       ;// 1号调用,使能IRQ中断
        DCD		FIQDisable		                ;// 2号调用,禁止FIQ中断       
        DCD		FIQEnable		                ;// 3号调用,使能FIQ中断

IRQDisable
        ;/* 禁止IRQ中断 */
        MRS     R0, SPSR                        ;// 读取SPSR的值
        ORR     R0, R0, #NoInt                  ;// 置位I位,设置关IRQ中断
        MSR     SPSR_c, R0                      ;// 回写SPSR
        MOVS    PC, LR                          ;// 返回

IRQEnable
        ;/* 使能IRQ中断 */
        MRS     R0, SPSR                        ;// 读取SPSR的值                  
        BIC     R0, R0, #NoInt                  ;// 清零I位,设置开IRQ中断
        MSR     SPSR_c, R0                      ;// 回写SPSR
        MOVS    PC, LR                          ;// 返回 
        
FIQDisable
        ;/* 禁止FIQ中断 */  
        MRS     R0, SPSR                        ;// 读取SPSR的值 
        ORR     R0, R0, #NoFIQ                  ;// 置位F位,设置关FIQ中断
        MSR     SPSR_c, R0                      ;// 回写SPSR
        MOVS    PC, LR                          ;// 返回 

FIQEnable
        ;/* 使能FIQ中断 */                       
        MRS   R0, SPSR                          ;// 读取SPSR的值
        BIC   R0, R0, #NoFIQ                    ;// 清零F位,设置开FIQ中断               
        MSR   SPSR_c, R0                        ;// 回写SPSR 
        MOVS    PC, LR                          ;// 返回 


;/* 取指令中止 */
PrefetchAbort
        B       PrefetchAbort                   ;// 死循环

;/* 取数据中止 */
DataAbort
        B       DataAbort                       ;// 死循环

;/* 快速中断 */
FIQ_Handler
        STMFD   SP!, {R0-R3, LR}                ;// 寄存器R0~R3,LR入栈
        BL      FIQ_Exception                   ;// 调用FIQ处理程序(在target.c中)
        LDMFD   SP!, {R0-R3, LR}                ;// 寄存器R0~R3,LR出栈
        SUBS    PC,  LR,  #4                    ;// 计算返回地址
        
        
        
        

;/*********************************************************************************************************
;* 函数名称:InitStack
;* 功能描述:初始化堆栈
;* 入口参数:无
;* 出口参数:无
;* 注    意:当进行初始化堆栈时,处理器状态为ARM状态(T=0

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -