微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > keil提供的启动代码解析(STARTUP.A51)

keil提供的启动代码解析(STARTUP.A51)

时间:11-20 来源:互联网 点击:

//如果有外部数据区,则把外部数据区中从XDATASTART到XDATASTART+ XDATALEN的区域清零

//由于51的储存区类型和编译模型比较多,下面的代码就是根据不同的配置把相应的区域清零

IF XDATALEN <> 0

MOV DPTR,#XDATASTART

MOV R7,#LOW (XDATALEN)

IF (LOW (XDATALEN)) <> 0

MOV R6,#(HIGH (XDATALEN)) +1

ELSE

MOV R6,#HIGH (XDATALEN)

ENDIF

CLR A

XDATALOOP: MOVX @DPTR,A

INC DPTR

DJNZ R7,XDATALOOP

DJNZ R6,XDATALOOP

ENDIF

IF PPAGEENABLE <> 0

MOV PPAGE_SFR,#PPAGE

ENDIF

IF PDATALEN <> 0

MOV R0,#LOW (PDATASTART)

MOV R7,#LOW (PDATALEN)

CLR A

PDATALOOP: MOVX @R0,A

INC R0

DJNZ R7,PDATALOOP

ENDIF

IF IBPSTACK <> 0

EXTRN DATA (?C_IBP)

MOV ?C_IBP,#LOW IBPSTACKTOP

ENDIF

IF XBPSTACK <> 0

EXTRN DATA (?C_XBP)

MOV ?C_XBP,#HIGH XBPSTACKTOP

MOV ?C_XBP+1,#LOW XBPSTACKTOP

ENDIF

IF PBPSTACK <> 0

EXTRN DATA (?C_PBP)

MOV ?C_PBP,#LOW PBPSTACKTOP

ENDIF

//该处是初始化堆栈指针

MOV SP,#?STACK-1

; This code is required if you use L51_BANK.A51 with Banking Mode 4

; EXTRN CODE (?B_SWITCH0)

; CALL ?B_SWITCH0 ; init bank mechanism to code bank 0

LJMP ?C_START

END

从上面一段代码,我们已经发现了一些与ATmega8初始化代码相同的操作:初始化堆栈和bss区。由于AT89C51的存储空间和寻址模式比ATmega8复杂,所以初始代码中增加了许多根据不同配置而进行初始化的代码

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top