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

📄 start.s

📁 nucleus 嵌入式系统文件Start.s
💻 S
📖 第 1 页 / 共 2 页
字号:
;**********************************************************************
;
;	Startup code for the 68332 family to initialize RAM
;	and call the user function main().
;
;
;**********************************************************************

;#define __ROM_128K
;#define __ROM_256K
#define __ROM_512K
;#define __ROM_1024K
#define		_ETHER_INI_

;**********************************************************************
;       本程序为 PSG-304A-A-2000,05 设计
;***************硬件摘要:
;	系统时钟:	20MHz
;   ROM地址:    000000H-03FFFFH	//ROM=256k
;   RAM地址:    700000H-7FFFFFH	//Debug && NoBDM 700000-7fffff
;	片内RAM定值:800000H-8007ffH	//Debug && NoBDM 800000-8007ff
;	FLASH地址:  200000H-300000H
;	DI地址:     FF8800H
;	HDI地址:    FF8000H
;   LAN地址:    410000H(data),412000(add)
;   HDI地址:    FFF000H
;***************中断设置摘要:
;   中断优先级:6-A/D同步中断(TPU0) 2-周期中断 3-SCI中断,
;              4-LAN中断,     -故障处理程序,  1-正常运行
;	中断裁决级别:SIM-7,QSM-A,TPU-F
;	中断向量: A/D同步中断(TPU0)-40H,SCI中断-51H,周期中断-60H
;**********************************************************************

;**********************************************************************
;	RAM地址常量设置
;**********************************************************************
D_RAM_CSBAR		EQU 0x7007 		//1M
D_IRAM_BAR      EQU 0x8000
D_RAM_ADD		EQU 0x700000
D_RAM_SIZE		EQU 0x100000
D_IRAM_ADD		EQU 0x800000

///////////////////////////////////////////////////////
	XDEF D_RAM_ADD
	XDEF D_RAM_SIZE
	XDEF D_IRAM_ADD

;**********************************************************************
;	全局标识符说明
;**********************************************************************
	XDEF	START,__brkp,__brksz,__exit
	XDEF	_INT_Vectors				; Nucleus USE

	XREF	DATA,_main
	XREF	STKTOP

	XREF	INT_TPU0
	XREF	_INT_User_0
	XREF	_INT_User_16
	XREF	_INT_Timer_Interrupt
	XREF	_INT_Level_4_Auto
	XREF    __ResetCpu

	.FDEF	_RegisterErrorProcess,0		;控制寄存器出错处理程序
	.FREF	BIOSInit,0					;BIOS初始化程序

#define GJ_ID	#$5AA5A30C
	XREF	__PutDoX
	XREF    __PutDoY

;**********************************************************************
;	包含文件说明
;**********************************************************************
	NOLIST
	INCLUDE "mc68332c.hs"
	INCLUDE "start.hs"
	LIST

;***********************************************************************
;	If C++ style startup code is not desired, then
;	define CPLUSPLUS to 0
;***********************************************************************
CPLUSPLUS	= 0

;***********************************************************************
;	If alloc memory function be used,then define
;	MALLOC_USED to 1;
;***********************************************************************
MALLOC_USED = 0

;**********************************************************************
;	Define variables to track memory allocations for mbrk().
;**********************************************************************
	SECTION	ram
__brkp	DS.L	1			; point to available memory
__brksz	DS.L	1			; number of available bytes

;***************************************************************
;	Bdm use area (4 BYTE,address:0x400);
;***************************************************************
	SECTION bdmuse
dBdmUseArea DC.L	0

;***************************************************************
;	The reset vector will point to this code (START).
;***************************************************************
	SECTION	code
	.STK	"none" 			; terminate call chain for -OG

;************************************************************
;	硬件复位向量
;************************************************************
START:
  .IF BDM_USED==1
	MOVE.L	#STKTOP,A7  	;初始化系统堆栈

	MOVE.L	#`BASE(reset),D0
	MOVEC	D0,VBR      	;初始化中断向量表基址

	MOVE.L	D0,A0

	MOVE.L	#INT_TPU0,($40*4,A0)			; TPU0
	MOVE.L	#_INT_User_16,($50*4,A0)		; SCI
    MOVE.L  #_INT_Timer_Interrupt,($60*4,A0)
	MOVE.L  #_INT_Level_4_Auto,($70,A0)

  .ENDIF

  .IF BDM_USED==0
;************************************************************
;	Initialize SIM Register for hardware setting
;************************************************************

/*MCR 设置:%1000 0000 1100 0111
CLKOUT disable
freeze'signle no disable software and bus monitor,
Slave mode disable,
SIM reside suppervisor space,
MM set to reside SIM at $fffa00-$ffffff
IARB SET %0111
*/
	MOVE.W	#$80c7,SIM_BASE+SIM_MCR

;SYNCR 设置:  因使用外部振荡器,该寄存器不使用

/*系统保护控制寄存器设置: 1100 1100
软件WATCHDOG溢出时间52毫秒
HALT MOITOR 开放
BUS MONITOR 溢出时间64时钟周期
*/
	MOVE.B	#$DC,SIM_BASE+SIM_SYPCR
;	MOVE.B	#$5C,SIM_BASE+SIM_SYPCR

	MOVE.L	#`BASE(reset),D0
	MOVEC	D0,VBR

  .ENDIF


;清软件WatchDog计数器
	MOVE.B	#$55,SIM_BASE+SIM_SWSR
	MOVE.B	#$AA,SIM_BASE+SIM_SWSR

;************************************************************
;	I/0口设置:
;************************************************************

;PE口数据寄存器设置为%0100 0000
	MOVE.B  #$40,SIM_BASE+SIM_PORTE				//PE.6=C\O\N\V\S\T=1

;PE口方向寄存器设置为%1111 1111(1-OUTPUT,0-INPUT)
	MOVE.B  #$FB,SIM_BASE+SIM_DDRE			;WAAA_NEW PE.2=0  0FB=1111 1011

;PE口分配寄存器设置为%0000 0000(1-FUNCTION,0-I/O)
	MOVE.B	#$04,SIM_BASE+SIM_PEPAR			;WAAA_NEW

;PF口数据寄存器设置为%1110 1110
	MOVE.B  #$EE,SIM_BASE+SIM_PORTF 			//PF.4=LAN_IR=0,PF.0=GND=0


;PF口方向寄存器设置为%1110 1110(1-OUTPUT,0-INPUT)
	MOVE.B  #$EE,SIM_BASE+SIM_DDRF

;PF口分配寄存器设置为%0001 0001(1-FUNCTION,0-I/O)
	MOVE.B  #$11,SIM_BASE+SIM_PFPAR

	#ifdef _ETHER_INI_
	MOVE.B  #$01,SIM_BASE+SIM_PFPAR 		

	#endif

;PC口数据寄存器设置为%1111 1111
	MOVE.B	#$FF,SIM_BASE+SIM_PORTC


;************************************************************
;	片选线设置
;************************************************************

;片选分配寄存器设置:CSPAR0- %0011 1010 1010 1010
;                   CSPAR1- %0000 0011 1111 1101
;CS3,CS4,为8位片选
;CSBOOT,CS0-CS2,CS5,CS7,CS8,CS9,CS10(NOT USED)为16位片选
;CS6为A19
    MOVE.W  #$3AFF,SIM_BASE+SIM_CSPAR0
    MOVE.W  #$03FD,SIM_BASE+SIM_CSPAR1

;Boot ROM 片选基址寄存器设置:Addr=$000000, #$0005: Size=256K


		#ifdef __ROM_128K
D_ROM_SIZE	EQU		0X0004
		#endif
		#ifdef __ROM_256K
D_ROM_SIZE	EQU		0X0005
		#endif
		#ifdef __ROM_512K
D_ROM_SIZE	EQU		0X0006
		#endif
		#ifdef __ROM_1024K
D_ROM_SIZE	EQU		0X0007
		#endif

    MOVE.W  #D_ROM_SIZE,SIM_BASE+SIM_CSBARBT		;ROM读128k,256K,512K,1024K

;Boot ROM 片选控制寄存器设置:异步,双字节,地址选通,S/U空间,不插入等待状态
;IPL=0,AVEC禁止   #$6830
	MOVE.W	#$6830,SIM_BASE+SIM_CSORBT			;读:%0110 1000 0011 0000

;RAM 片选基址寄存器设置:Addr=$0C0000,size=128k
	MOVE.W	#D_RAM_CSBAR,SIM_BASE+SIM_CSBAR0	;RAM写
	MOVE.W	#D_RAM_CSBAR,SIM_BASE+SIM_CSBAR1	;RAM读
	MOVE.W	#D_RAM_CSBAR,SIM_BASE+SIM_CSBAR2	;

;FLASH 片选基址寄存器设置:Addr=$200000,Size=1M
	MOVE.w	#$2007,SIM_BASE+SIM_CSBAR3 			;FLASH读
	MOVE.w	#$2007,SIM_BASE+SIM_CSBAR4 			;FLASH写

;DI  片选基址寄存器设置:Addr=$FF8800,size=2k
	MOVE.W 	#$FF88,SIM_BASE+SIM_CSBAR5

;LAN 片选自动向量基址寄存器设置:Addr=$FFF000,size=64k
	MOVE.W 	#$FFF3,SIM_BASE+SIM_CSBAR6

;HDI  片选基址寄存器设置:Addr=$FF8000,size=2k
	MOVE.W 	#$FF80,SIM_BASE+SIM_CSBAR7

;LAN(data)  片选基址寄存器设置:Adr=$410000,$412000,size=8k
    MOVE.W  #$4101,SIM_BASE+SIM_CSBAR8

;AD(add)   片选基址寄存器设置:Addr=$FF000,$FFF800,size=2k
    MOVE.W  #$FFF0,SIM_BASE+SIM_CSBAR9
	MOVE.W  #$0006,SIM_BASE+SIM_CSBAR10

;RAM 片选控制寄存器设置:
;MODE=0异步,BYTE=单字节,R/W=10写,STRB=0地址选通,DSACK=0000不插入等待状态,SPACE=11S/U空间,IPL=0,AVE=0外部中断
    MOVE.W  #$5030,SIM_BASE+SIM_CSOR0		;RAM高写:%0101 0000 0011 0000
    MOVE.W  #$3030,SIM_BASE+SIM_CSOR1		;RAM低写:%0011 0000 0011 0000
    MOVE.W  #$6830,SIM_BASE+SIM_CSOR2		;RAM  读:%0110 1000 0011 0000

;FLASH 片选控制寄存器设置:
;MODE=0异步,BYTE=11双字节,R/W=10写,STRB=0地址选通,DSACK=0000不插入等待状态,SPACE=11S/U空间,IPL=0,AVE=0外部中断
	MOVE.W	#$7030,SIM_BASE+SIM_CSOR3			;写:%0111 0000 0011 0000
;MODE=0异步,BYTE=11双字节,R/W=01读,....
	MOVE.W	#$6830,SIM_BASE+SIM_CSOR4			;读:%0110 1000 0011 0000

;DI 片选控制寄存器设置:
;MODE=0异步,BYTE=11双字节,R/W=01读,STRB=0地址选通,DSACK=0000不插入等待状态,SPACE=11S/U空间,IPL=0,AVE=0外部中断
	MOVE.W	#$6830,SIM_BASE+SIM_CSOR5			;%0110 1000 0011 0000

;LAN 片选自动向量控制寄存器设置:
;MODE=0异步,BYTE=01低字节,R/W=01读,STRB=0地址选通,DSACK=0000不插入等待状态,SPACE=00CPU空间,IPL=4,AVE=1内部中断
	MOVE.W 	#$2809,SIM_BASE+SIM_CSOR6

;HDI 片选控制寄存器设置:
;MODE=0异步,BYTE=11双字节,R/W=01读,STRB=0地址选通,DSACK=0000不插入等待状态,SPACE=11S/U空间,IPL=0,AVE=0外部中断
	MOVE.W	#$6830,SIM_BASE+SIM_CSOR7			;%0110 1000 0011 0000

;LAN,CS8900 片选控制寄存器设置:
;MODE=0异步,BYTE=11双字节,R/W=11读写,STRB=0地址选通,DSACK=0001插入1等待状态,SPACE=11S/U空间,IPL=0,AVE=0外部中断
	MOVE.W	#$7870,SIM_BASE+SIM_CSOR8			;%0111 1000 0111 0000

;AD7865AS 片选控制寄存器设置:
;MODE=0异步,BYTE=11双字节,R/W=01读,STRB=0地址选通,DSACK=0000不插入等待状态,SPACE=11S/U空间,IPL=0,AVE=0外部中断
    MOVE.W  #$6830,SIM_BASE+SIM_CSOR9			;%0111 0000 0011 0000

;CS10 片选控制寄存器设置: Disable
 	MOVE.W	#$7030,SIM_BASE+SIM_CSOR10			;%0000 0000 0000 0000

;片内RAM区设置:正常操作模式,位于S/U空间,地址100000H,RAM阵列允许
	MOVE.W #$0000,SIM_BASE+RAM_MCR
	MOVE.W #D_IRAM_BAR,SIM_BASE+RAM_BAR


RAMCHECK:
	MOVE.L	#`BASE(ram),D0
	MOVE.L	#STKTOP,D1
	SUB.L	D0,D1
	LSR.L	#2,D1
	MOVEA.L	D0,A0

NEXTCHECK:
	MOVE.B	#$55,SIM_BASE+SIM_SWSR
	MOVE.B  #$AA,SIM_BASE+SIM_SWSR

	MOVE.B	SIM_BASE+SIM_PORTE,D3
	BTST	#7,D0
	BNE		SETHIGH
	ANDI.B	#$7F,D3
	BRA.B	OUTPORTE
SETHIGH:
	ORI.B	#$80,D3
OUTPORTE:
	MOVE.B	D3,SIM_BASE+SIM_PORTE

	CMPI.L	#0,D1
	BEQ.S	QUITCHECK
	MOVE.L	(A0),D2
	MOVE.L	#$5A5A5A5A,(A0)
	CMPI.L	#$5A5A5A5A,(A0)
	BNE.S	ERRORRAM
	MOVE.L	#$A5A5A5A5,(A0)
	CMPI.L	#$A5A5A5A5,(A0)
	BNE.S	ERRORRAM
	MOVE.L	#0,(A0)+

	SUBI.L	#1,D1
	BRA		NEXTCHECK
ERRORRAM:
	
	MOVE.L	GJ_ID,D0
	MOVE.L	D0,-(A7)
	BSR.L	__PutDoX

	MOVE.L	GJ_ID,D0
	MOVE.L	D0,-(A7)
	BSR.L	__PutDoY
	JMP.L	__ResetCpu

QUITCHECK:

;************************************************************
;	TPU 初始化程序:
;************************************************************

;TPU_TMCR设置:STOP=0,TCR1P=00,TCP2P=00,EMU=0,T2CG=0,STF=0,SUPV=1,PSCK=1,IARB=1111
;TCR1时钟源为1/4系统时钟(5MHZ)
    MOVE.W	#$00CE,SIM_BASE+TPU_TMCR			;%0000 0000 1100 1111

  .IF	BDM_USED==1
;TPU_DSCR设置:FRZ=11(Freeze at Next Time-Slot Boundary),others set 0
	MOVE.W	#$0180,SIM_BASE+TPU_DSCR
  .ELSE
	MOVE.W	#$0000,SIM_BASE+TPU_DSCR
  .ENDIF

;TPU_CISR清零
	AND.W	#$0000,SIM_BASE+TPU_CISR

;清TPU中断允许字节
	MOVE.W	#$0000,SIM_BASE+TPU_CIER

;设置TPU中断优先级为6,中断向量为40H-4FH
	MOVE.W	#$0640,SIM_BASE+TPU_TICR

;TPU各通道功能设置:
;TPU0为A/D采样中断,用于读取TCR1值,设置为OC输出比较,优先级为高
;TPU1-TPU12 为分离输出,优先级为低,并初始化为低电平
;TPU13,TPU14,TPU15 ,设置为ITC输入捕捉,优先级为中
  .IF	BDM_USED==1
	MOVE.W	#$AAAE,SIM_BASE+TPU_CFSR0	;A:ITC
  .ELSE
	MOVE.W	#$AAA8,SIM_BASE+TPU_CFSR0	;A:ITC
  .ENDIF
  	MOVE.W	#$8888,SIM_BASE+TPU_CFSR1	;8:DIO
	MOVE.W	#$8888,SIM_BASE+TPU_CFSR2
	MOVE.W	#$888E,SIM_BASE+TPU_CFSR3	;E:OC

;TPU_HSQR设置:
;TPU0=%01(只读TCR1和TCR2)
;TPU1-TPU12=%00(该字段在通道为分离输出时不使用)
;TPU13,14,15=%01(连续,无LINK)
		MOVE.W	#$5400,SIM_BASE+TPU_HSQR0		;0101 0100 0000 0000
        MOVE.W  #$0000,SIM_BASE+TPU_HSQR1       ;0000 0000 0000 0010

;TPU_RAM设置:
;TPU0:%0000 0000 100 011 11不强迫任何状态,符合时翻转,捕捉TCR1,比较TCR1

⌨️ 快捷键说明

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