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

📄 44binitbackup.s

📁 ARM-s3c44b0_B2开发板通用非向量IRQ中断的实现.
💻 S
📖 第 1 页 / 共 2 页
字号:
    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 + -