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

📄 2410init.s

📁 三星ARM2410的WDT看门狗程序实验
💻 S
📖 第 1 页 / 共 2 页
字号:
		;// Set GPF4=0 GPF5=1 GPF6=1 GPF7=1
		LDR	R0, =GPFDAT
		LDR	R1, =0xE0
		STR	R1, [R0]
	]
	
	;// Check weather the boot is caused by the wake-up from POWER_OFF mode
	LDR	R1, =GSTATUS2
	LDR	R0, [R1]
	TST	R0, #0x2
    
    ;// In case of the wake-up from POWER_OFF mode, go to POWER_OFF_WAKEUP handler.
	BNE	WAKEUP_POWER_OFF
	
StartPointAfterPowerOffWakeUp
	
	;// Setup memory control registers
	LDR	R0, =SMRDATA
	LDR	R1, =BWSCON				;// BWSCON Address
	ADD	R2, R0, #52				;// End address of SMRDATA
	
Ram_Init
	LDR	R3, [R0], #4
	STR	R3, [R1], #4
	CMP	R2, R0
	BNE	Ram_Init
	
	[ NAND_FLASH_BOOT
		
		;// We boot from NAND Flash
		LDR	R0,	=_RAMBASE		;// Destination
		LDR	R1,	=0x0			;// Start position in NAND Flash
		LDR	R2,	=|Image$$RW$$Limit|
		LDR	R3,	=|Image$$RW$$Base|
		SUB	R2,	R2,	R3
		LDR	R3,	=|Image$$RO$$Limit|
		ADD	R2,	R2,	R3
		LDR	R3,	=|Image$$RO$$Base|
		SUB	R2,	R2,	R3
		BL	nand_copy			;// Copy to RAM
	|
		;// We boot from NOR Flash
		LDR	R0,	=|Image$$RO$$Base|
		LDR	R1,	=|Image$$RO$$Limit|
		LDR	R2,	=_RAMBASE
		
		;// Copy RO area to RAM
Copy_RO_Area
		CMP		R0,	R1
		LDRLS	R3,	[R0],	#4
		STRLS	R3,	[R2],	#4
		BLS		Copy_RO_Area
	]
	
	;// "Reboot" without init from RAM
	LDR		PC,	=_RAMBASE

StartfromRam
	
	;// Initialize stacks
	BL	InitStacks
	
	;// Setup IRQ handler
	LDR	R0, =HandleIRQ
	LDR	R1, =IsrIRQ
	STR	R1, [R0]
	
	;// Copy RW area and clear ZI
	
StartcopyRW
	LDR	R0, =|Image$$RO$$Limit|		;// Get pointer to RW data area ( RW source base )
	LDR	R1, =|Image$$RW$$Base|		;// RW destination base
	LDR	R2, =|Image$$ZI$$Base|		;// Zero base
	LDR	R3, =|Image$$ZI$$Limit|		;// Limit of zero init segment
	
	[ NAND_FLASH_BOOT
		;// We've copy RO to ram. So RO now is RO + _RAMBASE
		LDR	R4,	=_RAMBASE
		ADD	R0,	R0,	R4
	]
	
	;// Skip copy RW?
	CMP	R0,	R1
	BEQ	Init_Zero_Start
	
	;// Copy RW area
Copy_RW_Area
	CMP		R1,	R2
	LDRLS	R4,	[R0],	#4
	STRLS	R4,	[R1],	#4
	BLS		Copy_RW_Area
	
Init_Zero_Start
	LDR		R4,	=0x00
	
Init_Zero
	;// Zero area initialize
	CMP		R2, R3
	STRLS	R4, [R2],	#4
	BLS		Init_Zero
	
Startmain
	[ {CONFIG} = 16
		;// Change mode to Thumb
		ORR	LR, PC, #1
		BX	LR
		THUMB
		B	main
		ARM
	|
		[ DEBUGLEDS_TYPE = 1
			;// Set GPG8=1 GPG9=1
			LDR	R0, =GPGDAT
			LDR	R1, =0x0000
			STR	R1, [R0]
		]
		[ DEBUGLEDS_TYPE = 2
			;// Set GPF4=0 GPF5=0 GPF6=0 GPF7=0
			LDR	R0, =GPFDAT
			LDR	R1, =0x0000
			STR	R1, [R0]
		]
		B	main
	]
	
;//---------------------------------------------------------------------------
;// Function: Initializing stacks
;//---------------------------------------------------------------------------
InitStacks
	
	MRS	R0, CPSR
	BIC	R0, R0, #MODEMASK
	
	;// Undef Mode stacks
	ORR	R1, R0, #UNDEFMODE|NOINT
	MSR	cpsr_cxsf, R1
	LDR	SP, =UndefStack
	
	;// Abort Mode stack
	ORR	R1, R0, #ABORTMODE|NOINT
	MSR	cpsr_cxsf, R1
	LDR	SP, =AbortStack
	
	;// IRQ Mode stack
	ORR	R1, R0, #IRQMODE|NOINT
	MSR	cpsr_cxsf, R1
	LDR	SP, =IRQStack
	
	;// FIQ Mode stack
	ORR	R1, R0, #FIQMODE|NOINT
	MSR	cpsr_cxsf, R1
	LDR	SP, =FIQStack
	
	;// Service Mode stack
	BIC	R0,	R0,	#MODEMASK|NOINT
	ORR	R1 ,R0, #SVCMODE
	MSR	cpsr_cxsf, R1
	LDR	SP, =SVCStack
	
	;// User mode has not be initialized.
	
	;// The LR register won't be valid if the current mode is not Service mode.
	MOV	PC, LR
	
	LTORG
	
;//---------------------------------------------------------------------------
;// Function: Wakeup from POWER_OFF Mode
;//---------------------------------------------------------------------------
WAKEUP_POWER_OFF
	
	;// Release SCLKn after wake-up from the POWER_OFF mode
	LDR	R1, =MISCCR
	LDR	R0, [R1]
	BIC	R0, R0, #( 7 << 17 )	;// SCLK0:0->SCLK SCLK1:0->SCLK SCKE:L->H
	STR	R0, [R1]
	
	;// Set memory control registers
	LDR	R0, =SMRDATA
	LDR	R1, =BWSCON				;// BWSCON Address
	ADD	R2, R0, #52				;// End address of SMRDATA
	
Wakeup_Ram_Init
	LDR	R3, [R0], #4
	STR	R3, [R1], #4
	CMP	R2, R0
	BNE	Wakeup_Ram_Init
	
	;// Wait for 256 until the SelfRefresh is released
	MOV	R1, #256
Wakeup_Wait
	SUBS	R1, R1, #1
	BNE	Wakeup_Wait
	
	;// Restore PC
	LDR	R1, =GSTATUS3			;// GSTATUS3 has the start address just after POWER_OFF wake-up
	LDR	R0, [R1]
	MOV	PC, R0
	
	LTORG

;//============================================================================
;// SDRAM control register value table
;//============================================================================
SMRDATA
	
	;// Notice:
	;// 1. If you are bootting from NAND Flash. THE FOLLOWING DATA MUST BE IN THE 4K RANGE.
	;// 2. If you want to change memory config parameters, see memconfig.inc
	;// 3. Memory configuration should be optimized for best performance
	;//    The following parameter is not optimized
	;// 4. Memory access cycle parameter strategy:
	;//    The memory settings is safe parameters even at HCLK = 75Mhz
	;//    SDRAM refresh period is for HCLK = 75Mhz	
	
	DCD	(0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON<<20)+(B6_BWSCON<<24)+(B7_BWSCON<<28))	;//BWSCON
	
	DCD	((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC))	;// BANKCON0
	DCD	((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC))	;// BANKCON1
	DCD	((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC))	;// BANKCON2
	DCD	((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC))	;// BANKCON3
	DCD	((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC))	;// BANKCON4
	DCD	((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC))	;// BANKCON5
	DCD	((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN))														;// BANKCON6
	DCD	((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN))														;// BANKCON7
	
	DCD	((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT)							;// REFRESH
	DCD	((BURST_EN<<7)+(SCKE_EN<<5)+(SCLK_EN<<4)+BK76MAP)											;// BANKSIZE
	DCD	((B6_WBL<<9)+(B6_TM<<7)+(B6_CL<<4)+(B6_BT<<3)+B6_BL)										;// MRSRB6
	DCD	((B7_WBL<<9)+(B7_TM<<7)+(B7_CL<<4)+(B7_BT<<3)+B7_BL)										;// MRSRB7
	
	ALIGN
	
;//============================================================================
;// Interrupt Handlers table in RAM ( Use for C/C++ to set interrupt function )
;//============================================================================
	AREA RamData, DATA, READWRITE
	
	;// Notice:
	;// 1. The following data is in the RW part.
	;// 2. The following data is used for C/C++ to set interrupt handler function address.
	;// 3. The following data WON'T BE USED DIRECTLY, but call by a light weight interrupt handler
	;//    which is used jump to the handler function.
	^	_ISR_STARTADDRESS
	;// Internal interrupts
HandleReset		#	4
HandleUndef		#	4
HandleSWI		#	4
HandlePabort	#	4
HandleDabort	#	4
HandleReserved	#	4
HandleIRQ		#	4
HandleFIQ		#	4
	;// External interrupts
HandleEINT0		#	4
HandleEINT1		#	4
HandleEINT2		#	4
HandleEINT3		#	4
HandleEINT4_7	#	4
HandleEINT8_23	#	4
HandleRSV6		#	4
HandleBATFLT	#	4
HandleTICK		#	4
HandleWDT		#	4
HandleTIMER0	#	4
HandleTIMER1	#	4
HandleTIMER2	#	4
HandleTIMER3	#	4
HandleTIMER4	#	4
HandleUART2		#	4
HandleLCD		#	4
HandleDMA0		#	4
HandleDMA1		#	4
HandleDMA2		#	4
HandleDMA3		#	4
HandleMMC		#	4
HandleSPI0		#	4
HandleUART1		#	4
HandleRSV24		#	4
HandleUSBD		#	4
HandleUSBH		#	4
HandleIIC		#	4
HandleUART0		#	4
HandleSPI1		#	4
HandleRTC		#	4
HandleADC		#	4

	END

⌨️ 快捷键说明

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