📄 44binitbackup.s
字号:
INCLUDE option.inc
INCLUDE memcfg.inc
;Memory Area
;GCS6 16M 16bit(2MB) DRAM/SDRAM(0xc000000-0xc7fffff)
;APP RAM=0xc000000~0xc1effff
;44BMON RAM=0xc7f0000-0xc7fffff
;STACK =0xc7ffa00
;Interrupt Control
INTPND EQU 0x01e00004
INTMOD EQU 0x01e00008
INTMSK EQU 0x01e0000c
I_ISPR EQU 0x01e00020
I_CMST EQU 0x01e0001c
PDATC EQU 0x01d20014
EXINTPND EQU 0x01d20054
;Watchdog timer
WTCON EQU 0x01d30000
;Clock Controller
PLLCON EQU 0x01d80000
CLKCON EQU 0x01d80004
LOCKTIME EQU 0x01d8000c
;Memory Controller
REFRESH EQU 0x01c80024
;BDMA destination register
BDIDES0 EQU 0x1f80008
BDIDES1 EQU 0x1f80028
;Pre-defined constants
USERMODE EQU 0x10
FIQMODE EQU 0x11
IRQMODE EQU 0x12
SVCMODE EQU 0x13
ABTMODE EQU 0x17
UNDMODE EQU 0x1b
SYSMODE EQU 0xff
MODEMASK EQU 0x1f
NOINT EQU 0xc0
;check if tasm.exe is used.
GBLL THUMBCODE
[ {CONFIG} = 16
THUMBCODE SETL {TRUE}
CODE32
|
THUMBCODE SETL {FALSE}
]
[ THUMBCODE
CODE32 ;for start-up code for Thumb mode
]
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Vector Macro;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MACRO
$HandlerLabel HANDLER $HandleLabel
$HandlerLabel
sub sp,sp,#4 ;decrement sp(to store jump address)
stmfd sp!,{r0} ;PUSH the work register to stack(lr does't push because it return to original address)
ldr r0,=$HandleLabel ;load the address of HandleXXX to r0
ldr r0,[r0] ;load the contents(service routine start address) of HandleXXX
str r0,[sp,#4] ;store the contents(ISR) of HandleXXX to stack
ldmfd sp!,{r0,pc} ;POP the work register and pc(jump to ISR)
MEND
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
IMPORT |Image$$RO$$Limit| ;End of ROM code (=start of ROM data)
IMPORT |Image$$RW$$Base| ;Base of RAM to initialise
IMPORT |Image$$ZI$$Base| ;Base and limit of area
IMPORT |Image$$ZI$$Limit| ;to zero initialise
IMPORT Main ;The main entry of mon program
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Code Begin;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AREA Init,CODE,READONLY
IMPORT isr_ADC
IMPORT isr_RTC
IMPORT isr_UTXD1
IMPORT isr_UTXD0
IMPORT isr_SIO
IMPORT isr_IIC
IMPORT isr_URXD1
IMPORT isr_URXD0
IMPORT isr_TIMER5
IMPORT isr_TIMER4
IMPORT isr_TIMER3
IMPORT isr_TIMER2
IMPORT isr_TIMER1
IMPORT isr_TIMER0
IMPORT isr_UERR01
IMPORT isr_WDT
IMPORT isr_BDMA1
IMPORT isr_BDMA0
IMPORT isr_ZDMA1
IMPORT isr_ZDMA0
IMPORT isr_TICK
IMPORT isr_EXINT4567
IMPORT isr_EXINT3
IMPORT isr_EXINT2
IMPORT isr_EXINT1
IMPORT isr_EXINT0
IMPORT isr_SWI
ENTRY
b ResetHandler ;for debug
b ResetHandler ;handlerUndef
b ResetHandler ;SWI interrupt handler
b ResetHandler ;handlerPAbort
b ResetHandler ;handlerDAbort
b . ;handlerReserved
b IsrIRQ ;使用非向量中断模式
; b HandlerIRQ
; b HandlerFIQ
b ResetHandler
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;非向量中断的处理 ;
;如果I_ISPC的使用不正确,此时I_ISPR可能为零 ;
;堆栈内容的变化 ;
; ;
;H sp |--| |--| |--| |--| sp |--| ;
; | | sp | | | | |ad|->pc | | ;
; | | | | |r9| |r9|->r9 | | ;
;L | | | | sp |r8| sp |r8|->r8 | | ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
IsrIRQ ;using I_ISPR register.
stmfd sp!,{lr} ;保存LR
ldr r9,=I_ISPR
ldr r9,[r9] ;载入I_ISPR
cmp r9, #0x0 ;If the IDLE mode work-around is used,r9 may be 0 sometimes.
beq %F2 ;无可处理中断,返回
mov r8,#0x0 ;r8为偏移量,清零
0
movs r9,r9,lsr #1 ;从右向左逐位检验
bcs %F1
add r8,r8,#4 ;偏移量累加
b %B0
1
ldr r9,=HandleADC ;中断处理表的首址
add r9,r9,r8 ;计算中断处理表的入口地址 r9+r8,即装载中断处理函数的指针
mov lr,pc
ldr pc,[r9] ;调用中断服务函数
2
ldmfd sp!,{pc}^ ;恢复r8,r9,并返回
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;复位中断处理函数 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ResetHandler
ldr r0,=WTCON ;禁止看门狗
ldr r1,=0x0
str r1,[r0]
ldr r0,=INTMSK
ldr r1,=0x07ffffff ;禁止所有中断
str r1,[r0]
;**************指令测试*********************/
; ldr r9,=0
; mov lr,pc
; ldr r9,=0x01
;0
; movs r9,r9,lsr #1
; bcs %F1
; b %B0
;1
; ldr r9,=0x02
;1
; mov r9,#0x00
; mov r10,#0x01
; tst r9,r10
; beq %B0
;***************************************/
;以下三段设置时钟控制寄存器
ldr r0,=LOCKTIME
ldr r1,=0xfff
str r1,[r0]
[ PLLONSTART
ldr r0,=PLLCON ;temporary setting of PLL
ldr r1,=((M_DIV<<12)+(P_DIV<<4)+S_DIV)
str r1,[r0]
]
ldr r0,=CLKCON
ldr r1,=0x7ff8 ;All unit block CLK enable
str r1,[r0]
;****************************************************
;change BDMACON reset value for BDMA *
;****************************************************
ldr r0,=BDIDES0
ldr r1,=0x40000000 ;BDIDESn reset value should be 0x40000000
str r1,[r0]
ldr r0,=BDIDES1
ldr r1,=0x40000000 ;BDIDESn reset value should be 0x40000000
str r1,[r0]
;****************************************************
;设定存储器控制寄存器 *
;****************************************************
ldr r0,=SMRDATA
ldmia r0,{r1-r13}
ldr r0,=0x01c80000 ;BWSCON Address
stmia r0,{r1-r13}
;****************************************************
;初始化堆栈 *
;****************************************************
ldr sp, =SVCStack+256 ;复位后为SVC模式
;----------------test sp---------
; ldmfd sp!, {r0}
;-------------------------------
bl InitStacks
;****************************************************
;设置中断处理 *
;****************************************************
ldr r0,=HandleADC ;将中断服务程序的地址存入预留的ram空间:0xc7fff00-0xc7fff68
ldr r1,=isr_ADC
str r1,[r0]
ldr r0,=HandleRTC
ldr r1,=isr_RTC
str r1,[r0]
ldr r0,=HandleUTXD1
ldr r1,=isr_UTXD1
str r1,[r0]
ldr r0,=HandleUTXD0
ldr r1,=isr_UTXD0
str r1,[r0]
ldr r0,=HandleSIO
ldr r1,=isr_SIO
str r1,[r0]
ldr r0,=HandleIIC
ldr r1,=isr_IIC
str r1,[r0]
ldr r0,=HandleURXD1
ldr r1,=isr_URXD1
str r1,[r0]
ldr r0,=HandleURXD0
ldr r1,=isr_URXD0
str r1,[r0]
ldr r0,=HandleTIMER5
ldr r1,=isr_TIMER5
str r1,[r0]
ldr r0,=HandleTIMER4
ldr r1,=isr_TIMER4
str r1,[r0]
ldr r0,=HandleTIMER3
ldr r1,=isr_TIMER3
str r1,[r0]
ldr r0,=HandleTIMER2
ldr r1,=isr_TIMER2
str r1,[r0]
ldr r0,=HandleTIMER1
ldr r1,=isr_TIMER1
str r1,[r0]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -