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

📄 vectors.s

📁 嵌入式开发
💻 S
字号:
;/*
;*********************************************************************************************************
;* 文件: Vectors.s
;* 描述: 异常向量入口及部分与异常相关的函数.
;* 编写: 深思 (001-12345@sohu.com).
;*********************************************************************************************************
;*/

        IMPORT  __main
        IMPORT  PLLInit
        IMPORT  InitStack
        IMPORT  SoftwareInterrupt

;/*
;*********************************************************************************************************
;* 描述: 异常向量入口, Section = startup.
;*********************************************************************************************************
;*/
        AREA    startup,CODE,READONLY
        CODE32
        ENTRY

Startup
        LDR     PC,     ResetAddr
        LDR     PC,     UndefinedAddr
        LDR     PC,     SWI_Addr
        LDR     PC,     PrefetchAddr
        LDR     PC,     DataAbortAddr
        DCD     0xb8a06f58
        LDR     PC,     IRQ_Addr
        LDR     PC,     FIQ_Addr

ResetAddr       DCD     Reset
UndefinedAddr   DCD     Undefined
SWI_Addr        DCD     SoftwareInterrupt
PrefetchAddr    DCD     PrefetchAbort
DataAbortAddr   DCD     DataAbort
nouse           DCD     0
IRQ_Addr        DCD     IRQ_Handler
FIQ_Addr        DCD     FIQ_Handler

;/*
;*********************************************************************************************************
;* 描述: 完成最底成的系统初始化,并切换到主函数 __main.
;*********************************************************************************************************
;*/
Reset
        BL      REMAPS                              ; 异常向量入口映射,实现 RAM 异常调试.
        BL      InitStack                           ; 初始化堆栈.
        BL      PLLInit                             ; 设置 PLL. VPB. MAM. 等功能器件.
        B       __main                              ; 完成 main 函数前的其它系统初始化.

;/*
;*********************************************************************************************************
;* 描述: 未定义指令, 证明程序中有错误存在.
;*********************************************************************************************************
;*/
Undefined
        B       .

;/*
;*********************************************************************************************************
;* 描述: 取指令中止.
;*********************************************************************************************************
;*/
PrefetchAbort
        B       .

;/*
;*********************************************************************************************************
;* 描述: 取数据中止.
;*********************************************************************************************************
;*/
DataAbort
        B       .

;/*
;*********************************************************************************************************
;* 函数: IRQ_Handler.
;* 描述: IRQ 中断入口函数, 具体 IRQ 中断服务功能函数在相应服务函数中实现(参考 OSTickISR 函数).
;*********************************************************************************************************
;*/
        IMPORT  OSTCBCur                            ; 指向当前任务TCB的指针
        IMPORT  OSTCBHighRdy                        ; 指向将要运行的任务TCB的指针
        IMPORT  OSIntCtxSw2                         ; 中断级任务切换函数.

VICVectAddr         EQU         0xFFFFF030          ; IRQ 中断向量地址.

IRQ_Handler
        SUB     LR,     LR, #4                      ; 计算返回地址.
        STMFD   SP!,    {R0-R12, LR}

        LDR     LR,     =IRQ_Handler01              ; 设置服务程序返回地址.
        LDR     R0,     =VICVectAddr
        LDR     PC,     [R0]                        ; IRQ 中断矢量跳转至服务程序.
IRQ_Handler01
        LDR     R0,     =OSTCBHighRdy               ; 判断是否需要切换任务.
        LDR     R0,     [R0]
        LDR     R1,     =OSTCBCur
        LDR     R1,     [R1]
        CMP     R0,     R1
        LDMEQFD SP!,    {R0-R12, PC}^               ; 不进行任务切换.

        LDMFD   SP!,    {R0-R12, LR}
        LDR     PC,     =OSIntCtxSw2                ; 进行中断级任务切换.

;/*
;*********************************************************************************************************
;* 函数: FIQ_Handler.
;* 描述: FIQ 中断入口函数, 具体 FIQ 中断服务功能函数在 FIQ.C 中实现.
;* 主意: FIQ 中断不受系统控制,所以不能调用系统服务函数.
;*********************************************************************************************************
;*/
        IMPORT  FIQ_ISR                             ; 快速中断异常处理程序

FIQ_Handler
        SUB     LR,     LR, #4                      ; 计算返回地址.
        STMFD   SP!,    {R0-R7, LR}
        BL      FIQ_ISR
        LDMFD   SP!,    {R0-R7, PC}^

;/*
;*********************************************************************************************************
;* 函数: REMAPS.
;* 描述: 异常向量地址映射到 RAM 的 0x4000 0000 处.
;*********************************************************************************************************
;*/
MEMMAP          EQU     0xE01FC040                  ; REMAP控制寄存器.

REMAPS
        MOV	    R2,     #0x40000000                 ; 复制中断向量代码,设置目标地址.
        LDR     R1,     =Startup                    ; 设置源地址.
        LDMIA   R1!,    {R3-R10}                    ; 共复制16个字(64字节).
        STMIA   R2!,    {R3-R10}
        LDMIA   R1!,    {R3-R10}
        STMIA   R2!,    {R3-R10}

        LDR     R2,     =MEMMAP                     ; REMAP操作.
        MOV     R1,     #0x02
        STR     R1,     [R2]
        MOV     PC,     LR

;/*
;*********************************************************************************************************
        END
;*********************************************************************************************************
;*/

⌨️ 快捷键说明

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