📄 44binit.s
字号:
# *********************************************************
# 文 件 名: 44binit.s
# 作 者: 张人柏
# 说 明: S3c44b0x启动文件
# 技术支持:zhangrenbai@163.com
# 使用说明:必须在别的文件或脚码中定义:只读代码的开始地址 只读区域大小 可读写存储区域起始地址
# 清零区域起始地址 清零区域大小 C语言入口 详见 外部变量声明
# *********************************************************
#============================================
# 寄存器定义及其位定义
#============================================
# 中断控制
.equ INTPND, 0x01e00004
.equ INTMOD, 0x01e00008
.equ INTMSK, 0x01e0000c
.equ I_ISPR, 0x01e00020
.equ I_CMST, 0x01e0001c
# 看门狗控制器
.equ WTCON, 0x01d30000
# 时钟控制器
.equ PLLCON, 0x01d80000
.equ CLKCON, 0x01d80004
.equ LOCKTIME, 0x01d8000c
# 存储器控制器
.equ REFRESH, 0x01c80024
# BDMA 目的寄存器
.equ BDIDES0, 0x1f80008
.equ BDIDES1, 0x1f80028
# 预定义常量
.equ USERMODE, 0x10
.equ FIQMODE, 0x11
.equ IRQMODE, 0x12
.equ SVCMODE, 0x13
.equ ABORTMODE, 0x17
.equ UNDEFMODE, 0x1b
.equ MODEMASK, 0x1f
.equ NOINT, 0xc0
.equ IRQ_MODE, 0x40 @ (IRQ)
.equ FIQ_MODE, 0x80 @ (FIQ)
#============================================
# 中断处理宏
#============================================
.macro HANDLER HandleLabel
sub sp, sp, # 4 @ 栈空间递减保存跳转地址
stmfd sp!,{r0} @ 保存工作寄存器r0到栈
ldr r0, =\HandleLabel @ 载入中断入口地址所在位置到r0
ldr r0, [r0] @ 载入中断入口地址到r0
str r0, [sp,# 4] @ 保存中断入口地址到栈
ldmfd sp!,{r0,pc} @ 恢复工作寄存器并跳转到中断函数
.endm
#============================================
# 声明外部变量
#============================================
.extern Image_RO_Base @ 只读代码的开始地址
.extern Image_RO_Limit @ 只读区域大小
.extern Image_RW_Base @ 可读写存储区域起始地址
.extern Image_ZI_Base @ 清零区域起始地址
.extern Image_ZI_Limit @ 清零区域大小
.extern Main @ C语言入口
#============================================
# 程序代码
#============================================
.text
ENTRY:
b ResetHandler @ 调试及复位用 于
b HandlerUndef @ 自定义
b HandlerSWI @ SWI 中断管理
b HandlerPabort @ handlerPAbort
b HandlerDabort @ handlerDAbort
b . @ 保留
ldr pc, =HandlerIRQ
b HandlerFIQ
VECTOR_BRANCH:
ldr pc, =HandlerEINT0 @mGA
ldr pc, =HandlerEINT1 @
ldr pc, =HandlerEINT2 @
ldr pc, =HandlerEINT3 @
ldr pc, =HandlerEINT4567 @
ldr pc, =HandlerTICK @mGA
b .
b .
ldr pc, =HandlerZDMA0 @mGB
ldr pc, =HandlerZDMA1 @
ldr pc, =HandlerBDMA0 @
ldr pc, =HandlerBDMA1 @
ldr pc, =HandlerWDT @
ldr pc, =HandlerUERR01 @mGB
b .
b .
ldr pc, =HandlerTIMER0 @mGC
ldr pc, =HandlerTIMER1 @
ldr pc, =HandlerTIMER2 @
ldr pc, =HandlerTIMER3 @
ldr pc, =HandlerTIMER4 @
ldr pc, =HandlerTIMER5 @mGC
b .
b .
ldr pc, =HandlerURXD0 @mGD
ldr pc, =HandlerURXD1 @
ldr pc, =HandlerIIC @
ldr pc, =HandlerSIO @
ldr pc, =HandlerUTXD0 @
ldr pc, =HandlerUTXD1 @mGD
b .
b .
ldr pc, =HandlerRTC @mGKA
b . @
b . @
b . @
b . @
b . @mGKA
b .
b .
ldr pc,=HandlerADC @mGKB
b . @
b . @
b . @
b . @
b . @mGKB
b .
b .
ldr pc, =EnterPWDN
.align
HandlerFIQ: HANDLER HandleFIQ
HandlerIRQ: HANDLER HandleIRQ
HandlerUndef: HANDLER HandleUndef
HandlerSWI: HANDLER HandleSWI
HandlerDabort: HANDLER HandleDabort
HandlerPabort: HANDLER HandlePabort
HandlerADC: HANDLER HandleADC
HandlerRTC: HANDLER HandleRTC
HandlerUTXD1: HANDLER HandleUTXD1
HandlerUTXD0: HANDLER HandleUTXD0
HandlerSIO: HANDLER HandleSIO
HandlerIIC: HANDLER HandleIIC
HandlerURXD1: HANDLER HandleURXD1
HandlerURXD0: HANDLER HandleURXD0
HandlerTIMER5: HANDLER HandleTIMER5
HandlerTIMER4: HANDLER HandleTIMER4
HandlerTIMER3: HANDLER HandleTIMER3
HandlerTIMER2: HANDLER HandleTIMER2
HandlerTIMER1: HANDLER HandleTIMER1
HandlerTIMER0: HANDLER HandleTIMER0
HandlerUERR01: HANDLER HandleUERR01
HandlerWDT: HANDLER HandleWDT
HandlerBDMA1: HANDLER HandleBDMA1
HandlerBDMA0: HANDLER HandleBDMA0
HandlerZDMA1: HANDLER HandleZDMA1
HandlerZDMA0: HANDLER HandleZDMA0
HandlerTICK: HANDLER HandleTICK
HandlerEINT4567:HANDLER HandleEINT4567
HandlerEINT3: HANDLER HandleEINT3
HandlerEINT2: HANDLER HandleEINT2
HandlerEINT1: HANDLER HandleEINT1
HandlerEINT0: HANDLER HandleEINT0
#============================================
# IRQ中断服务程序入口判别
#============================================
ISR_IRQ:
sub sp, sp, #4 @ 为PC保留
stmfd sp!, {r8-r9}
# 查看中断挂起位,跳到挂起的中断服务程序中去
ldr r9, =I_ISPR
ldr r9, [r9]
cmp r9, #0x0 @ 如果没有中断挂起位为1则返回
beq l2
mov r8, #0x0
l0:
movs r9, r9, lsr #1
bcs l1
add r8, r8, #4
b l0
l1:
ldr r9, =HandleADC
add r9, r9, r8
ldr r9, [r9]
str r9, [sp,#8]
ldmfd sp!, {r8-r9,pc}
l2:
ldmfd sp!, {r8-r9}
add sp, sp, #4
subs pc, lr, #4
# ****************************************************
# * 程序开始执行点
# ****************************************************
ResetHandler:
ldr r0, =WTCON @ 看门狗禁止
ldr r1, =0x0
str r1, [r0]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -