历史上的今天
返回首页

历史上的今天

今天是:2024年11月19日(星期二)

正在发生

2018年11月19日 | 单片机startup.a51文件内容的详解

2018-11-19 来源:eefocus

1.标号


IDATALEN EQU 80H ; the length of IDATA memory in bytes.


这里IDATALEN只是一个标号而已,和idata不是一回事!你要是愿意,这段程序里的IDATALEN你完全可以改成dog呀,pig呀,playboy呀这些标号(其实我的理想是过猪一样的生活,不愁吃喝,无忧无虑,可惜做不到),上面的这一句是说程序里面凡是用到IDATALEN的地方其实就是可以看成是80H这个数,你用80H去代替IDATALEN是完全对的。


之所以取IDATALEN这么个名字,只是为了好记,表明和idata有一点点关系,不至于你的程序长了,假使你本来是用了playboy作为标号的,写到后来你就会忘了playboy到底是什么含义了。idata的范围是0~FFH。如果你想改成FFH,完全可以。


2。清零


IF IDATALEN <> 0


MOV R0,#IDATALEN - 1


CLR A


IDATALOOP: MOV @R0,A


DJNZ R0,IDATALOOP


关于这一段,很明显是在清零,如果上面idatalen=80H,那么是对0~7FH清零;如果


你的程序是改写成:


IDATALEN EQU 0100H ;


就是对0~FFH清零。


还要注意的是那条IF语句,下面再谈。


二、如何按你意愿加载这段程序


一般考虑到这个往往是你的设计中要区分上电复位和程序复位。有时候当程序复位时你不希望一些内存单元被清零了,那么你不对startup.a51作点修改,就不行了。


默认是自动加载这段startup.a51的。


所以你要这样做:


把lib目录下的原始startup.a51文件拷到你的项目所在目录下,再把你项目目录下的这个startup.a51加入到你的项目中(在keil的集成环境中,希望你对这个是知道如何做的),然后对这个startup.a51加以修改。


比如改成:


IDATALEN EQU 00H ; the length of IDATA memory in bytes.


然后编译链接。这样你的程序中就不会包含对idata清零的内码了。


为什么?上面提到的IF语句的作用呀!当定义IDATALEN=0时,清零代码被跳过!


////////////////////////////////////////////


Startup.a51的中文说明


;------------------------------------------------------------------------------


; STARTUP.A51: 用户上电初始化程序


;------------------------------------------------------------------------------


;


; 用户定义需上电初始化的内存空间


;


; 使用以下EQU命令可定义在CPU复位时需用0进行初始化的内存空间


;


;; ; IDATA 存储器的空间的绝对起始地址总是0.;


IDATALEN EQU 80H ; 需用0进行初始化的IDATA存储器空间的字节数


;


XDATASTART EQU 0H ; XDATA存储器空间的绝对起始地址


XDATALEN EQU 0H ; 需用0进行初始化的XDATA存储器的空间字节数.


;


PDATASTART EQU 0H ; PDATA存储器的空间的绝对起始地址


PDATALEN EQU 0H ; 需用0进行初始化的PDATA存储器的空间字节数.


;


; 注意: IDATA 存储器的空间在物理上包括了8051单片机的DATA和BIT存储器空间.

; 听 说 至少要保证与C51编译器运行库有关的存储器的空间进行0初始化 不知是否


;------------------------------------------------------------------------------


;


; 再入函数模拟初始化


;


; 以下用EQU指令定义了再入函数模拟堆栈指针的初始化


;


; 使用SMALL存储器模式时再入函数的堆栈空间 .


IBPSTACK EQU 0 ; 使用SMALL存储器模式再入函数时将其设置成1.


IBPSTACKTOP EQU 0FFH+1 ; 将堆栈顶设置为最高地址+1.


;

; 使用LARGE存储器模式时再入函数的堆栈空间.; 使用LARGE存储器模式时再入函数的堆栈空间.


XBPSTACK EQU 0 ; 使用LARGE存储器模式再入函数时将其设置成1.


XBPSTACKTOP EQU 0FFFFH+1; 将堆栈顶设置为最高地址+1.


;


; 使用COMPACT存储器模式时再入函数的堆栈空间.; 使用COMPACT存储器模式时再入函数的堆栈空间.


PBPSTACK EQU 0 ; 使用COMPACT存储器模式再入函数时将其设置成1.


PBPSTACKTOP EQU 0FFFFH+1; 将堆栈顶设置为最高地址+1.


;


;------------------------------------------------------------------------------


;


; 使用COMPACT存储器模式时64K字节XDATA存储器空间的分页定义


;


; 以下用EQU指令定义PDATA类型变量在XDATA存储器空间的页地址


; 使用EQU指令定义PFAGE时必须与L51连接定位器PDATA指令的控制参数一致


;


PPAGEENABLE EQU 0 ; 使用PDATA类型变量时将其设置成1.


PPAGE EQU 0 ; 定义页号.


;


;------------------------------------------------------------------------------


NAME ?C_STARTUP; 模块名为 ?C_STAUTUP


?C_C51STARTUP SEGMENT CODE ; 代码


?STACK SEGMENT IDATA ; 堆栈


RSEG ?STACK ; 堆栈


DS 1


EXTRNEXTRN CODE ((?C_START)) ; 程序开始地址


PUBLIC ?C_STARTUP


CSEG AT 0x8000 ; 定义用户程序的起始地址,用MON51仿真器时可能有用


?C_STARTUP: LJMP STARTUP1


RSEG ?C_C51STARTUP


STARTUP1::


;


; 初始化串口


MOV SCON,#40H


MOV TMOD,#20H


MOV TH1,#0fdH


SETB TR1


CLR TI


; 单片机上电IDATA内存清零 如果不需要上电清零IDATA 可以注销IF到IFEDN之间的话句


; 或者修改IDTALEN的长度 为了具有掉电保护功能 不知IDTALEN多长为好


IF IDATALEN <> 0


MOV R0,#IDATALEN - 1


CLR A


IDATALOOP: MOV @R0,A


DJNZ R0,IDATALOOP


ENDIF


;


; 单片机上电XDATA内存清零 如果不需要上电清零XDATA 可以注销IF到IFEDN之间的话句


; 或者修改XDATALEN的长度


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


;


; 送PDATA存储器页面高位地址


IF PAGEENABLE <> 0


MOV P2,#PPAGE


ENDIF


;


; 单片机上电PDATA内存清零 如果不需要上电清零XDATA 可以注销IF到IFEDN之间的话句


; 或者修改PDATALEN的长度


IF PDATALEN <> 0


MOV R0,#PDATASTART


MOV R7,#LOW (PDATALEN)


CLR A


PDATALOOP: MOVX @R0,A


INC R0


DJNZ R7,PDATALOOP


ENDIF


;

; 设置使用SMALL存储器模式时再入函数的堆栈空间.


IF IBPSTACK <> 0


EXTRN DATA (?C_IBP)


MOV ?C_IBP,#LOW IBPSTACKTOP


ENDIF


;


; 设置使用LARGE存储器模式时再入函数的堆栈空间.


IF XBPSTACK <> 0


EXTRN DATA (?C_XBP)


MOV ?C_XBP,#HIGH XBPSTACKTOP


MOV ?C_XBP+1,#LOW XBPSTACKTOP


ENDIF


;


; 设置使用COMPACT存储器模式时再入函数的堆栈空间.


IF PBPSTACK <> 0


EXTRN DATA (C_PBP)


MOV ?C_PBP,#LOW PBPSTACKTOP


ENDIF


;


; 设置堆栈的起始地址


MOV SP,#?STACK-1 ; 例如 MOV SP,#4FH;


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


; 如果你的程序使用了Mode 4 程序分组技术 请启动下面的程序,不会吧你的程序超过64K 利害


; EXTRN CODE (?B_SWITCH0)


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


;; 程序从第一组bank 0 块开始执行


; 跳转到用户程序MAIN函数


LJMP ?C_START


END


;lINSHENGFENG


推荐阅读

史海拾趣

ABCircuits公司的发展小趣事

ABCircuits公司始终坚信人才是企业发展的核心动力。因此,公司在人才招聘和培养方面投入了大量资源。通过与高校和研究机构的合作,ABCircuits吸引了一批批优秀的科研人才加入公司。同时,公司还建立了完善的培训体系,为员工提供持续的学习和成长机会。这些人才为公司带来了源源不断的创新动力,推动了公司的快速发展。

正泰公司的发展小趣事

2014年,正泰公司接到了一份来自美国光伏巨头SE的大订单。然而,客户对车间现场使用的安规测试仪的检测方法提出了质疑,要求限期完成整改。面对这一挑战,正泰公司的员工曹敬乐根据国际标准中的相关要求,结合实际参数,重新对检测工装进行改进设计和样品制备。经过不断测试和改进,最终满足了外方的要求,订单顺利投产。这一事件不仅展示了正泰公司的技术实力和创新能力,也体现了公司对市场变化的敏锐度和应对挑战的能力。

Brite-Led Optoelectronics Inc公司的发展小趣事

Brite-Led Optoelectronics Inc公司自创立之初,便专注于LED技术的研发与应用。在一次关键的技术突破中,公司成功开发出一种高效、稳定的LED芯片,其亮度与寿命均远超当时市场上的同类产品。这一技术突破迅速为Brite-Led赢得了市场认可,奠定了其在LED行业的领先地位。随着该技术的不断迭代和完善,Brite-Led的产品逐渐广泛应用于照明、显示、背光等多个领域。

Baton Lock公司的发展小趣事

除了关注业务发展,Baton Lock公司还非常重视履行企业社会责任。公司积极参与公益事业,支持环保项目,并努力减少生产过程中的环境污染。此外,Baton Lock还注重员工的成长和福利,提供了良好的工作环境和培训机会。这些举措不仅提升了公司的社会形象,也增强了员工的归属感和忠诚度。

请注意,这些故事是基于假设构建的,并非真实事件。如果您需要关于实际存在的电子公司的故事,请提供具体的公司名称,以便我能够为您提供更准确的信息。

鞍山圣罗佳(ASL)公司的发展小趣事

近年来,电子行业经历了多次技术变革和市场调整。面对这些变化,Baton Lock公司积极调整战略,加大了对新兴技术如物联网、人工智能等领域的研发投入。同时,公司还通过优化生产流程、降低成本等方式提高竞争力,成功应对了行业变革带来的挑战。

Focus公司的发展小趣事

Focus科技股份有限公司(此处假设为一家虚构的、与“焦点科技”类似的公司)自成立之初就专注于将传统制造业与互联网深度融合。随着电子商务的兴起,该公司于2005年推出了自己的外贸电商平台“GlobalFocus”,旨在帮助中国供应商直接触达全球买家。通过持续的技术创新和平台优化,“GlobalFocus”迅速成为国际市场上知名的B2B采购平台,吸引了大量海外采购商和国内优质供应商入驻。公司还积极拓展跨境物流、支付、金融等增值服务,为中小企业提供了全方位的外贸解决方案。

问答坊 | AI 解惑

单片机系统常用电子元器件知识简析

电阻种类及特点简介 电阻,英文名resistance,通常缩写为R,它是导体的一种基本性质,与导体的尺寸、材料、温度有关。欧姆定律说,I=U/R,那么R=U/I,电阻的基本单位是欧姆,用希腊字母“Ω”表示,有这样的定义:导体上加上一伏特电压时,产生一 ...…

查看全部问答>

请教~初学者什么时候买开发板?

我刚刚开始接触FPGA,资料也才看了一点,Verilog HDL也只是大致了解. 我在想要不要买块开发板,一边看资料一边在开发板上试试 以前学C的时候上课也觉得很枯燥,但是会经常自己编些小算术题之类的~呵呵 望有经验的兄弟姐妹给些建议 不慎感谢…

查看全部问答>

掉电保持数据 20字节左右

想实现 运行状态 掉电保持,以便重新上电时恢复, 需要保持的数据大约  20字节, 该状态每秒更新一次。 请问有什么比较好的方法?掉电检测如何实现? //目前使用的方法是:Dallas SDRAM, 当作RAM一部分。 掉电检测没有,上电时检查状 ...…

查看全部问答>

WinCE6.0中应用中使用物理地址

做应用的需要一片固定的内存,我在Config.bib中划好,在驱动里增加了MmIOMapSpace和MmIOUnMapSpace以及对应的IOCTL,在驱动内部测试,这片内存可以正常访问,map以及unmap。 我用IOCTL为应用返回这片内存的物理及虚拟地址,为什么在应用中使用该虚 ...…

查看全部问答>

[求助]DPF播放一個半小時的幻燈圖片後就不再播放了。爲什麽?

在板子上做测试,从服务器上读图片,在板子上以幻灯片的形式播放,几乎每次一个半小时后就停止播放。系统是winCE的,网上查了好久,知道是订阅时间的问题,但不知道该改哪部分的代码,请达人们指教,小弟刚接触嵌入式开发。…

查看全部问答>

vxwork 和 arm9 的问题

偶刚入此行,有些问题过于菜鸟,请大虾多多指教。 本人使用at91sam9261 开发板,用 sam-ba 2.4 往dataflash里面写,用ads1.2便宜的bin文件,通过sam-ba 里面的“send boot file”可以将 bin文件写进去,reset后也可以被执行。但当偶有vxwork下的t ...…

查看全部问答>

为什么我在debug的时候会出现F437.txt格式错误呀

@8000 30 40 04 80 FF 3F 31 40 00 06 3C 40 0C 02 3E 40 F8 00 B0 12 EE A7 3C 40 00 02 3E 40 0C A8 30 12 0B 00 B0 12 00 A8 21 53 B0 12 44 A0 B0 12 12 A4 0A 12 0B 12 08 12 09 12 06 12 07 12 04 12 05 12 D2 93 E5 02 C5 20 C2 43 E5 ...…

查看全部问答>

【Launchpad 心得】简单试用一下launchpad

以前从没接触过430,我看到那个工作电流就傻眼了,口水啊……。视频教程也不能下载,最近没有时间看(只有上班时间才能上网,很少见吧!)。手上电路图也没有,幸好板子上所有连接都标注好了。看了看寄存器,感觉挺简单,无非就是PXSEL选择功能,PX ...…

查看全部问答>

跪求大神解析

用STM32写串口程序,不知道出什么问题,老是接收不到数据,看寄存器里面的信息,USART1竟然没有读写初始化,但是程序里明明写了,不知道程序跑哪去了。。。。。。 求大神解析,我只写了MAIN 跟stm32f10x_it.c里的void USART1_IRQHandler(void) 下 ...…

查看全部问答>