访问手机版页面
你的位置:老古开发网 > 51单片机的ISP > 正文  
P89C51RX+/RX2单片机及其ISP/IAP技术
内容导读:
P89C51RX+/RX2单片机 及其ISP/IAP技术 国家电力公司电力自动化研究院 梁合庆 摘要P89C51RX+/RX2是Philips公司推出的带有32KB\,64KB FLASH/EPROM的单片机。芯片上免费提供BOOT ROM固件,可实现在系统中编程(ISP)和在应用中编程(IAP)。本文详细介绍了它们的ISP和IAP技术,并给出了ISP记录格式和IAP函数调用功能一览表。 关键词P89C51RX+ISPIAP P89C51RC+和P89C51RD+两种单片机都是8位80C51单片机的派生产品。它们在完全保留80C51指令系统和硬件结构的大框架外,发生了多方面的加强、扩展、翻新和创新,最大限度地利用了80C51原有的结构。P89C51RD+将原有的外部数据存储器和程序存储器的16位寻址机制加以利用,把片上的RAM扩展到1KB,片上的FLASH/EPROM扩展到64KB,满足当今嵌入式高级语言对片上大容量存储器的需要。因为FLASH存储器的采用,使得ISP(在系统中编程)乃至IAP(在应用中编程)等先进技术有了实现的可能。芯片上免费提供BOOT ROM固件,并且巧妙地解决了固件和FLASH的地址覆盖和一些具体实现的细节问题,使它们的实现变得简单而现成。 实际上,P89C51RC+与P89C51RD+之间仅有存储器容量大小的不同:片上RAM,前者为512字节,后者为1024字节;片上FLASH/EPROM,前者为32KB,后者为64KB。为了叙述上的简化,下面将二者泛称为P89C51RX+(X=C,D)。将另外两个单片机P89C51RC2和P89C51RD2二者合并称为P89C51RX2(X=C,D)。至于P89C51RX+与P89C51RX2之间的区别仅在编程电压上有所不同,前者需要专供12V的编程电压,而后者由于使用5V的工作电压编程,故不再需专门的编程电压。为此,下面专门介绍P89C51RX+。除非特别说明,否则它们四者在所讨论的方面是一样的。 P89C51RX+/P89C51RD2的特色: · 时钟频率0~33MHz,全静态操作。另有一种提速芯片,其钟频为0~20MHz,但机器周期由原来12个时钟周期减少为6个,相当于有1倍的提速。 · 双DPTR指针。 · 片内程序存储器采用非易失FLASH,同时提供BOOT ROM固件,实现ISP和IAP。 · 四个I/O口均提供复用功能。 · 新增定时器2,有捕捉、自动重装+1/-1计数器、波特率发生器和可编程时钟输出等4种模式。 · 提供5个模块PCA(可编程计数器阵列)。各模块都支持上下沿捕捉、高速输出、PWM输出和软件定时器等4种模式。其中,第5个模块另增一个看门狗定时器模式。 · 增强的全双工UART串行口,提供硬件帧检错和地址自动识别电路。 · 嵌套中断系统增强为7源4优先级。 · 为降低EMI,无必要可不开放ALE脚上的信号。 · 支持0钟频模式、空闲模式、下电模式和ONCE仿真模式等。 一、 P89C51RX+的存储器结构 下面只介绍P89C51RX+(X=C,D)的存储器结构,P89C51RX2(X=C,D)仿此。 标准8051是哈佛结构的计算机,即将数据和程序截然分开,分别使用不同的物理存储器。数据存储器用于存放变量或运行中产生的数据;程序存储器用于存放程序和常量。 1. 数据存储器 (1) 内部数据存储器 ·低128字节RAM(00H~7FH),可直接寻址和间接寻址,如: 直接寻址 MOV7FH,#DATA 间接寻址 MOV〖〗R0,#7FH;用于地址<100H。R0也可改用R1〖〗MOV〖〗@R0,#DATA·高128字节RAM(80H~FFH),只能间接寻址,如: MOV〖〗R0,#0A0H;用于地址<100H。R0也可改用R1〖〗MOV〖〗@R0,#DATA·特殊功能寄存器SFR(80H~FFH),只能直接寻址,如: MOV0A0H,#DATA 以上与标准的8051内部数据存储器结构是完全相同的。 下面是P89C51RX+新增的内部数据存储器。 内部ERAM(扩展RAM):ERAM从地址100H开始向高端扩展,P89C51RC+扩展100H(256)字节(地址范围100H~200H),P89C51RD+扩展300H(768)字节(地址范围100H~3FFH)。内部ERAM必须使用间接寻址。 为区分是去内部ERAM还是去外部数据存储器寻址,须对特殊功能寄存器AUXR的位EXTRAM进行选择: EXTRAM=1寻址外部数据存储器 EXTRAM=0寻址内部扩展RAM(ERAM) 例1寻址ERAM地址0A0H: ANL〖〗AUXR, #0FDH;EXTRAM=0〖〗MOV〖〗R0, #0A0H;地址装入8位间址寄存器〖〗MOVX〖〗@R0, #DATA;寻址<100H。R0也可改用R1寻址>=100H地址, 必须使用16位间址寄存器DPTR。 例2寻址ERAM地址1A0H: ANL〖〗AUXR, #0FDH;EXTRAM=0〖〗MOV〖〗DPTR, #1A0H;地址装入16位DPTR〖〗MOVX〖〗@DPTR, #DATA;寻址>=100H(2) 外部数据存储器 可用地址空间为0000H~0FFFFH。具体使用的空间依物理存储器的多少而定。按8051的原定规则,外部数据存储器必须使用间接寻址。为区分去内部ERAM还是去外部数据存储器寻址,须先对特殊功能寄存器AUXR的位EXTRAM进行选择: EXTRAM=1寻址外部数据存储器 EXTRAM=0寻址内部扩展RAM(ERAM) 例3寻址外部数据存储器地址0A0H: ORL〖〗AUXR, #02H;EXTRAM=1〖〗MOV〖〗R0, #0A0H;地址装入8位间址寄存器〖〗MOVX〖〗@R0, #DATA;寻址<100H。R0也可改用R1寻址>=100H地址, 必须使用16位间址寄存器DPTR。 例4寻址外部数据存储器地址1A0H: ORL〖〗AUXR, #02H;EXTRAM=1〖〗MOV〖〗DPTR, #1A0H;地址装入16位DPTR〖〗MOV〖〗A, #DATA;用DPTR间址必须经累加 ;器传送〖〗MOVX〖〗@DPTR, A;寻址>=100H2. 程序存储器 标准8051的程序存储器结构分为片内部分和片外部分,片内、片外连续编址:片内部分放在低端,由0000H排起,终止于0FFFH(标准8051片内程序存储器规定为4KB);片外部分接续编址,从1000H排起,最多排到0FFFFH。所以,8051系列的程序存储器片内、片外加起来最多只能有64KB。标准8051又规定,片内的程序存储器空间可以转移到片外,只要把引脚*EA事先拉到低电平,然后启动单片机即可。P89C51RC+有片内程序存储器32KB,而P89C51RD+有64KB,并且分成8KB和16KB的存储块,如图1所示。P89C51RC+/P89C51RD+的片内程序存储器采用了最先进的FLASH(快闪)存储器,而未使用EPROM或EEPROM。 图1片内FLASH及引导ROM分布图和上电复位流程图FLASH(快闪)存储器与EPROM存储器相比,其改进之处是不仅可以读,而且可以用软件快速地擦除和写入,从而引出了ISP和IAP等新技术。 飞利浦公司在P89C51RX+/P89C51RX2(X=C,D)单片机的片内提供了一个名叫引导ROM(BOOT ROM)的1KB的固件。固件上有引导装载程序,可以接收主机经串口传来的命令和数据(如经PC机的RS232口)。这个固件放在64KB程序存储器的最高端,与片内FLASH地址0FC00H~0FFFFH相覆盖,需要用特殊功能寄存器AUXR1的ENBOOT位进行固件和FLASH之间的切换(见图1): ENBOOT=1 地址在0FC00H~0FFFFH范围,寻址到固件 ENBOOT=0 地址在0FC00H~0FFFFH范围,寻址到FLASH 由于BOOT ROM固件的存在,使得对P89C51RX+进行擦除和写入有3种方法:① 使用的商用编程器进行并行编程;② 使用BOOT ROM固件由主机进行串行的ISP;③ 在应用程序中调用BOOT ROM中的擦除、写入等子程序进行IAP。 3. 上电复位后,P89C51RX+执行代码的过程 P89C51RX+有两个特殊的FLASH寄存器(不在SFR之列,而在FLASH空间里):STATUS BYTE和BOOT VECTOR。复位RST,从有效正电平转入下降沿时,P89C51RX+自动检查STATUS BYTE的内容。如果是0,则转去0000H地址开始执行程序,这是正常运行方式;如果不是0,则去BOOT VECTOR寄存器取其内容作为程序计数器的高字节,低字节固定为00H。芯片出厂时给BOOT VECTOR寄存器预置为缺省值0FCH,对应于全地址0FC00H,因这个地址处于固件和FLASH所覆盖的空间,需要用特殊功能寄存器AUXR1的ENBOOT位进行选择: ENBOOT=1切入固件空间 ENBOOT=0切入FLASH空间 ENBOOT位可由软件或硬件来设置。有两种情况,会由硬件自动置1(见图1):一个是在复位时,因STATUS BYTE出厂时预置了非0的缺省值,导致ENBOOT位被硬件置成1;另一个是在RST转入下降沿时,遇下述三条引脚条件同时被满足时,ENBOOT位被置1: · PSEN被拉到低电平; · ALE浮空; · EA的电压>高电平(VIH)。 由于ENBOOT位被置1,0FC00H地址被映射到固件的入口,从而被引导进入ISP运行状态。进入ISP运行状态后,关键工作是:从主机将用户应用程序的最终目标代码,经串口写入FLASH,写完之后,再完成如下配置任务,即先将STATUS BYTE和BOOT VECTOR擦除,随后将BOOT VECTOR编程为缺省值0FCH,STATUS BYTE编程为0。关闭电源,再重新上电启动,芯片便从地址0000H开始执行应用程序的目标代码,系统进入正常运行方式。 图2RS232电平转换参考接线图进入正常运行方式后,如果再想转入ISP方式,只有采用上述3引脚加适当电平的手动控制进入。 用户也可不用BOOT ROM中提供的ISP编程程序,而使用自编的目标代码写入程序(即自定义编程程序)。这时,应将自定义编程程序放在合适的页界上,并把页界的高字节写入BOOT VECTOR中。 BOOT VECTOR中的地址,如果既非0FCH又非自定义编程程序的页界高地址,则上电复位时,程序必将跑飞。这时,惟一解决问题的办法只能使用商用编程器对BOOT VECTOR的内容进行并行地改写。 还有一点要注意:当对FLASH进行擦除时,FLASH寄存器STATUS BYTE和BOOT VECTOR也同时被擦除,所以,必须对它们重新编程。另外BOOT VECTOR未被擦除前,STATUS BYTE无法被擦除。 二、 P89C51RX+ 在系统中编程(ISP) ISP编程需要使用芯片的5条引脚:TXD,RXD,VCC,VSS和VPP。为了和主机进行RS232串口通信,还需要将单片机串口的电平用RS232驱动芯片(如MAX232CPE)转换电平并用DB9型小插座与PC机相连,如图2所示。 串口ISP的通信,只接受Intel\ Hex记录格式。Intel\ Hex记录格式中的数据使用16进制数,在具体传送时换为ASCII符(即1个字节的16进制数换为2个ASCII符)。Intel\ Hex记录的格式如下: ∶NNAAAARRDD…DDCC 其中:“∶”——Intel\ Hex记录的头标。 NN——记录中的字节数,规定不超过16(10H)字节。 AAAA——记录中数据域首字节的存放地址。如果记录中数据域字节为0,则将AAAA置为0000H。 RR——记录的类型号,见表1。 DD——数据域,数据域字节可为0,最多为10H。 CC——校验和。 编程时所用的记录类型如表1所列。表1ISP所用Intel\ Hex记录格式类型一览表 记录 类型〖〗功能〖〗命令或数据00〖〗传编程数据并完成编程〖〗格式:nnaaaa00dd…ddcc 其中:nn=记录中所传数据字节数,16进制表示 aaaa=编程数据首字节地址 dd…dd=ASCII码的编程字节数据 cc=校验和 例:10000800AF5F67F0602703E0322CFA92007780C3FD01〖〗传文件结束符(EOF)〖〗格式:xxxxxx01cc 其中:xxxxxx=域空间占满,值无所谓 cc=校验和 例:00000001FF02〖〗指定振荡器频率〖〗格式:01xxxx02ddcc 其中:xxxx=域空间占满,值无所谓 dd=振荡器频率,取频率(MHz)的整数值 cc=校验和 例:0100000210EDdd=10H(频率在16.0~16.9MHz间均取此值)03〖〗杂项编程功能(指对FLASH寄存器、FLASH加密位的先擦除再编程)同时含各FLASH块的擦除〖〗格式:nnxxxx03ffssddcc 其中:nn=记录中所传数据字节数,16进制表示 xxxx=域空间占满,值无所谓 03=杂项编程功能及块擦除 ff=子功能码 ss=选择码 dd=写入数据(需要时才有,不需要没有) cc=校验和 1. 擦除FLASH块 子功能码ff=01 选择码ss=00H,20H,40H,80H或C0H 00H选FLASH块0对应地址0000H~1FFFH 20H选FLASH块1对应地址2000H~3FFFH 40H选FLASH块2对应地址4000H~7FFFH 80H选FLASH块3对应地址8000H~BFFFH C0H选FLASH块4对应地址C000H~FFFFH 例:0200000301C03A擦除FLASH块4 2. 擦除BOOT VECTOR和STATUS BYTE 子功能码ff=04 选择码ss=值无所谓,域空间占满 例:020000030400F7擦除两个FLASH寄存器 3. 编程加密位 子功能码ff=05 选择码ss=00,01或02 00对加密位1编程,禁止写FLASH 01对加密位2编程,禁止校验FLASH 02对加密位3编程,禁止外部执行FLASH代码 例:020000030501F5对加密位2编程 4. 编程BOOT VECTOR和STATUS BYTE 子功能码ff=06 选择码ss=00或01 00对STATUS BYTE 编程 01对BOOT VECTOR编程 例:010000030601FCF7BOOT VECTOR编程为0FCH 5. 擦除全芯片FLASH(包括各FLASH块、加密位、FLASH寄存器)及设置STATUS BYTE和对BOOT VECTOR置缺省值(仅P89C51RX2有此项功能,而P89C51RX+无) 子功能码ff=07 选择码ss=无 例:0100000307F5FLASH全擦并置FLASH寄存器为缺省值ISP编程的具体步骤建议如下: (1) 进入ISP运行模式,用前述出厂缺省方法或手动方法; (2) 由主机向芯片发送一个大写“U”字符,供自动确定波特率使用; (3) 由主机向芯片发送一个记录,指定振荡器频率; (4) 由主机向芯片发送一个记录,擦除指定的存储块; (5) 由主机向芯片发送对FLASH编程的目标记录,重复直到目标程序送完; (6) 发送一个记录,擦除BOOT VECTOR和STATUS BYTE的内容; (7) 若欲继续使用固件引导进行ISP编程的话,再发送一个记录,将BOOT VECTOR编程为缺省值0FCH; (8) 发送一个记录,将STATUS BYTE编程为00H,使下次上电复位时,进入正常运行模式。 ISP可以在宽广的范围内适应用户的波特率(基于片上振荡器频率或外加频率)。它通过首次接收到的单个字符实现对位时间的测量,并用这个信息给基于振荡器频率的计数器进行波特率设定。为此,主机初始须向芯片发送一个大写“U”字符,以备对波特率进行设定。作为回音的“U”字符由固件上的程序完成。续表1 记录 类型〖〗功能〖〗命令或数据04〖〗显示指定地址段FLASH的数据或做空白检查(显示由收到主机任意字符开始,将数据经串口送出,显示格式为地址后跟10H字节数据,中途收到主机任意字符停止送数据。加密位2被编程,LASH数据不外送〖〗05=记录中所传数据字节数,16进制表示 xxxxx=域空间占满,值无所谓 04=显示指定地址段FLASH的数据或做空白检查 ssss=起始地址 eeee=结束地址 ff=子功能码: 00或01 00=显示FLASH数据 01=空白检查 cc=校验和 例:0500000440004FFF0069显示4000~4FFFFLASH段05〖〗各种读功能〖〗格式:02xxxx05ffsscc 其中:02=记录中所传数据字节数,16进制表示 xxxx=域空间占满,值无所谓 05=各种读功能 ffss=子功能和选择码: 0000=读签名字节—生产厂id(15H) 0001=读签名字节—芯片id #1(c2H) 0000=读签名字节—芯片id #2 0700=读加密位 0701=读STATUS BYTE 0702=读BOOT VECTOR cc=校验和 例:020000050001F8读签名字节—设备id #106〖〗直接装载波特率(仅P89C51RX2有此项功能,而P89C51RX+无)〖〗格式:02xxxx06hhllcc 其中:02=记录中所传数据字节数,16进制表示 xxxx=域空间占满,值无所谓 06=直接装载波特率功能码 hh=定时器2计数值高字节 ll=定时器2计数值低字节 cc=校验和 例:02000006F500F3定时器2计数值F500完成了波特率的设定后,ISP固件即可正常接受Intel\ Hex格式的记录。P89C51RX+收到记录后先计算记录的校验和,如与校验字节值不相符,则向主机发出“X“回应,表示接收错;如相符,则向主机发出“.”回应,表示妥收。随后按照类型号完成指定的操作(见表1)。对于编程的记录与上稍有不同。除收到记录,经计算与校验,若不符,向主机发出“X”回应;如相符,则并不立即向主机发“.”回应,而是即刻按收到的记录对FLASH开始编程写入。若发生字节编程出错,则向主机发出“R”字符的回应,仅在全部字节编程正确之后,才向主机发出“.”回应,表示编程成功。主机收到回应“R”,知道编程的定时有问题,应发02号记录,为芯片规定振荡器频率。ISP设计时,并不要求指定振荡器频率。希望依赖自身能够确定可用的波特率和编程脉冲的定时。但是,现时证明未能实现正确定时时,可辅之以指定振荡器频率,即用02号记录实现。 P89C51RX+是根据Intel\ Hex记录的类型号知道应完成的任务,才调用BOOT ROM固件中相应的子程序完成相应的操作。所以,在微控制器一侧,只要用户把RS232的联线接好,并保证启动能进入ISP运行模式之外,几乎没有工作要做。如果主机侧使用的是PC机,且使用Windows 95以上的操作系统,还可以编写Windows图形界面的通用ISP程序,从而使主机一侧的工作变成只需用鼠标点击,就可轻松地完成各种记录的发送。事实上,如果真的使用PC机,那么,连程序都不用编,因为可以从Internet网上,免费下载飞利浦公司提供的名为WinISP的应用软件。下载网址为:www.semiconductors.philips.com。 三、 P89C51RX+在应用中编程(IAP) IAP是指在用户的应用程序中对FLASH块、FLASH寄存器、加密位等实现擦除和编程等操作。事实上,BOOT ROM固件中已经固化有上述擦除和编程等子程序,只要应用程序来调用即可。为了调用的方便,给各种功能子程序一个共用的函数调用入口,名为PGM\ MTP,具体地址为0FFF0H。至于各项子程序,则用数字表示的功能码标识,并作为参数通过R1寄存器带入;至于返回参数,则放在ACC中。擦除和编程所用的振荡器频率,经下舍弃为整数值后,也作为输入参数,规定放于寄存器R0,其余参数如表2所列。使用时可加以套用,下面举例说明。表2IAP函数调用的功能一览表 序号〖〗调用功能〖〗输入/返回参数01〖〗擦除FLASH块〖〗输入参数: R0=振荡器频率(下舍弃为整数) R1=01H;擦除FLASH块功能码 DPTR=0000H,2000H,4000H,8000H,C000H 0000H擦除FLASH块0,对应0000H~1FFFH 2000H擦除FLASH块1,对应2000H~3FFFH 4000H擦除FLASH块2,对应4000H~7FFFH 8000H擦除FLASH块3,对应8000H~BFFFH C000H擦除FLASH块4,对应C000H~FFFFH ACC=欲编程字节内容 返回参数:无 函数调用例: ;函数入口(各功能共用):PGM\ MTP(0FFF0H) ;功能名:ERSBLK ERSBLK: MOV AUXR1,#20H ;AUXR1的位ENBOOT ;置1 MOV R0,#11;假定fosc=11.0592MHz,取11 MOV R1,#01H;字节编程功能码 MOV DPTR,#blk-addr;欲编程地址 CALLPGM-MTP;调用 RET02〖〗字节编程〖〗输入参数: R0=振荡器频率(下舍弃为整数) R1=02H;字节编程功能码 DPTR=欲编程字节地址 ACC =欲编程字节内容 返回参数:ACC =0(调用成功),非0(调用失败) 函数调用例: ;函数入口(各功能共用):PGM\ MTP ;功能名:WRDATA WRDATA: MOV AUXR1,#20H;AUXR1的位ENBOOT ;置1 MOV R0,#11;假定fosc=11.0592MHz,取11 MOV R1,#02H;字节编程功能 MOV DPTR,#address;欲编程地址 MOV ACC,#mydata;欲编程内容 CALLPGM\ MTP;调用 RET03〖〗读FLASH字节〖〗输入参数: R0=振荡器频率(下舍弃为整数) R1=03H;读字节功能码 DPTR=欲读字节地址 返回参数:ACC=读出字节内容 函数调用例: ;函数入口(各功能共用):PGM\ MTP ;功能名:RDDATA RDDATA: MOV AUXR1,#20H;AUXR1的位ENBOOT ;置1 MOV R0,#11;假定fosc=11.0592MHz,取11 MOV R1,#03H;读字节功能 MOV DPTR,#address;欲读字节地址 CALLPGM\ MTP;调用 RET04〖〗擦除BOOT VECTOR (BV)和 STATUS BYTE (SB)〖〗输入参数: R0=振荡器频率(下舍弃为整数) R1=04H;擦除BV和SB功能码 DPH=00H DPL=无关紧要 返回参数:无 函数调用例: ;函数入口(各功能共用):PGM\ MTP ;功能名:ERBVSB ERBVSB: MOV AUXR1,#20H;AUXR1的位ENBOOT ;置1 MOV R0,#11;假定fosc=11.0592MHz,取11 MOV R1,#04H;字节编程功能 MOV DPH,#00H;欲编程地址 CALLPGM\ MTP;调用 RET05〖〗加密位编程〖〗输入参数: R0=振荡器频率(下舍弃为整数) R1=05H;加密位编程功能码 DPH=00H DPL=00,01或02 00对加密位1编程,禁止写FLASH 01对加密位2编程,禁止校验FLASH 02对加密位3编程,禁止外部执行 FLASH代码 返回参数:无 函数调用例: ;函数入口(各功能共用):PGM\ MTP ;功能名;WRSB1(将加密位1置位) ;WRSB2(将加密位2置位) ;WRSB3(将加密位3置位) WRSB1: MOV AUXR1,#20H;AUXR1的位ENBOOT ;置1 MOV R0,#11;假定fosc=11.0592MHz,取11 MOV R1,#05H;加密位编程功能 MOV DPTR,#0000H;欲编程加密位1 CALLPGM\ MTP;调用 RET WRSB2: MOV AUXR1,#20H;AUXR1的位ENBOOT ;置1 MOV R0,#11;假定fosc=11.0592MHz,取11 MOV R1,#05H;加密位编程功能 MOV DPTR,#0001H;欲编程加密位2 CALLPGM\ MTP;调用 RET WRSB3: MOV AUXR1,#20H;AUXR1的位ENBOOT ;置1 MOV R0,#11;假定fosc=11.0592MHz,取11 MOV R1,#05H;加密位编程功能 MOV DPTR,#0002H;欲编程加密位3 CALLPGM\ MTP;调用 RET续表2 序号〖〗调用功能〖〗输入/返回参数06〖〗STATUS BYTE和 BOOT VECTOR 编程〖〗输入参数: R0=振荡器频率(下舍弃为整数) R1=06H;SB和BV编程功能码 DPH=00H DPL=00,01 00对STATUS BYTE编程 01对BOOT VECTOR编程 ACC=欲编程内容 返回参数:ACC=已编程内容 函数调用例: ;函数入口(各功能共用):PGM\ MTP ;功能名;WRSB(对STATUS BYTE编程) ;WRBV(对BOOT VECTOR编程) WRSB: MOV AUXR1,#20H;AUXR1的位ENBOOT ;置1 MOV R0,#11;假定fosc=11.0592MHz,取11 MOV R1,#06H;SB和BV编程功能 MOV DPTR,#0000H;欲编程SB MOV A,#new-sb;欲编程值 CALLPGM-MTP;调用 RET WRBV: MOV AUXR1,#20H;AUXR1的位ENBOOT ;置1 MOV R0,#11;假定fosc=11.0592MHz,取11 MOV R1,#06H;SB和BV编程功能 MOV DPTR,#0001H;欲编程BV MOV A,#new-bv;欲编程值 CALLPGM\ MTP;调用 RET07〖〗读各加密位、SB、BV内容〖〗输入参数: R0=振荡器频率(下舍弃为整数) R1=07H;读加密位、SB、BV功能码 DPH=00H DPL=00,01,02 00读各加密位内容 01读STATUS BYTE内容 02读BOOT VECTOER内容 返回参数: ACC=读出内容(读出各加密位内容放2~0位) 函数调用例: ;函数入口(各功能共用):PGM\ MTP ;功能名:RDSBITS(读各加密位内容) ;RDSB(读STATUS BYTE内容) ;RDBV(读BOOT VECTOER内容) RDSBITS: MOV AUXR1,#20H;AUXR1的位ENBOOT ;置1 MOV R0,#11;假定fosc=11.0592MHz,取11 MOV R1,#07H;读加密位、SB、BV功能码 MOV DPTR,#0000H;读各加密位内容 CALLPGM\ MTP;调用 RET RDSB: MOV AUXR1,#20H;AUXR1的位ENBOOT ;置1〖3〗MOV R0,#11;假定fosc=11.0592MHz,取11 MOV R1,#07H;读加密位、SB、BV功能码 MOV DPTR,#0001H;读SB内容 CALLPGM\ MTP;调用 RET RDBV: MOV AUXR1,#20H;AUXR1的位ENBOOT ;置1 MOV R0,#11;假定fosc=11.0592MHz,取11 MOV R1,#07H;读加密位、SB、BV功能码 MOV DPTR,#0002H;读BV内容 CALLPGM\ MTP;调用 RET08〖〗擦除全芯 片FLASH (包括擦除 各FLASH 块、FLASH 寄存器、加密位)并随后将SB和BV置为缺省值(仅P89 C51RX2有此项功能,而P89C51RX+无)〖〗输入参数: R0=振荡器频率(下舍弃为整数) R1=08H;擦除全芯片FLASH及置缺省值 DPH=无用 DPL=无用 返回参数:无 函数调用例: ;函数入口(各功能共用):PGM\ MTP ;功能名:FCE(全芯片擦除,含置必要缺省值) FCE: MOV AUXR1,#20H;AUXR1的位ENBOOT ;置1 MOV R0,#11;假定fosc=11.0592MHz,取11 MOV R1,#08H;擦除全芯片FLASH CALLPGM\ MTP;调用 RET09〖〗读ID〖〗输入参数: R0=振荡器频率(下舍弃为整数) R1=00H;读ID功能码 DPH=00H DPL=00H,01H,02H 00H(生产厂ID) 01H(芯片ID #1) 02H(芯片ID #2) 返回参数:ACC=读出内容 函数调用例: ;函数入口(各功能共用):PGM\ MTP ;功能名:RDMID(读生产厂ID内容) ;RDDID1(读芯片ID #1内容) ;RDDID2(读芯片ID #2内容) RDMID: MOV AUXR1,#20H;AUXR1的位ENBOOT ;置1 MOV R0,#11;假定fosc=11.0592MHz,取11 MOV R1,#00H;读ID功能码 MOV DPTR,#0000H;读生产厂ID内容 CALLPGM\ MTP;调用 RET RDDID1: MOV AUXR1,#20H;AUXR1的位ENBOOT ;置1 MOV R0,#11;假定fosc=11.0592MHz,取11 MOV R1,#00H;读ID功能码续表2 序号〖〗调用功能〖〗输入/返回参数〖3〗MOV DPTR,#0001H;读芯片ID #1内容 CALLPGM\ MTP;调用 RET RDDID2: MOV AUXR1,#20H;AUXR1的位ENBOOT ;置1 MOV R0,#11;假定fosc=11.0592MHz,取11 MOV R1,#00H;读ID功能码 MOV DPTR,#0002H;读芯片ID #2内容 CALLPGM\ MTP;调用 RET例5 擦除FLASH块 输入参数: R0=振荡器频率(下舍弃为整数) R1=01H;擦除FLASH块功能码 DPTR=0000H,2000H,4000H,8000H,C000H; 0000H擦除FLASH块0,对应0000H~1FFFH; 2000H擦除FLASH块1,对应2000H~3FFFH; 4000H擦除FLASH块2,对应4000H~7FFFH; 8000H擦除FLASH块3,对应8000H~BFFFH; C000H擦除FLASH块4,对应C000H~FFFFH。 ACC=欲编程字节内容 返回参数:无 函数调用例: ;函数入口(各功能共用):PGM\ MTP(0FFF0H) ;功能名:ERSBLK ERSBLK: MOV AUXR1,#20H;AUXR1的位ENBOOT置1 MOV R0,#11;假定fosc=11.0592MHz,取11 MOV R1,#01H;字节编程功能码 MOV DPTR,#blk-addr;欲编程地址 CALLPGM\ MTP;调用 RET 例6字节编程 输入参数: R0=振荡器频率(下舍弃为整数) R1=02H;字节编程功能码 DPTR=欲编程字节地址 ACC=欲编程字节内容 返回参数:ACC=0(调用成功),非0(调用失败) 函数调用例: ;函数入口(各功能共用):PGM\ MTP ;功能名:WRDATA WRDATA: MOV AUXR1,#20H;AUXR1的位ENBOOT置1 MOV R0,#11;假定fosc=11.0592MHz,取11 MOV R1,#02H;字节编程功能 MOV DPTR,#address;欲编程地址 MOV ACC,#mydata;欲编程内容 CALLPGM\ MTP;调用 RET
标签:
来源:单片机与嵌入式系统应用 作者:国家电力公司电力自动化研究院 梁合庆 时间:2006/2/12 0:00:00
相关阅读
推荐阅读
阅读排行
最近更新
商品推荐