您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 8051单片机BOOT设计方案
8051单片机BOOT设计方案第1页共11页8051单片机BOOT设计方案CDMA事业部支撑软件部周志雄张彦春【摘要】本文论述了8051单片机BOOT的功能、设计方法、设计流程,内外接口等。【关键词】8051单片机,BOOT,Flash1引言现在我们公司的单片机系统都要求能够实现远程的软件下载,同时为了生产和调试的方便,要求单片机系统在脱离机框的情况下也能够通过调试口下载。公司现阶段采用的可下载单片机主要有3款:SST的89V/E564RD、ATMEL的T89C51RD2、Winbond的W78LE516P,CDMA事业部同时采用了这3款芯片,要求这三款芯片的BOOT对外接口完全一致,以简化硬件设计和接口软件设计。本设计方案支持多路数据下载,动态检测下载的数据通道,完成消息握手,数据交互,校验,写并校验Flash,BOOT和版本程序互相切换等操作。本方案仅仅在操作flash的地方根据不同的单片机作了改动即满足了要求,方便向更多的单片机移植。下面主要以T89C51RD2作为范例描述BOOT的设计方法。2BOOT_T89C51RD22.1设计思想Atmel公司的T89C51RD2有64K的FLASH,256字节的内部RAM,1K字节的外部RAM,自带BOOT。缺省情况下,BOOT大小为1K字节,位于FLASH的FC00H-FFFFH空间范围内。由于这个BOOT中有读写Flash,更改状态字的API函数的入口,而且芯片的状态字也包含在这块Flash区间内,所以我们必须保留这个默认的BOOT程序。由于这款芯片没有为BOOT提供一个单独的Flash区间,BOOT程序和用户的版本程序在同一块64K的Flash空间内,因此,对FLASH区进行重新规划。重新规划后的FLASH区分配如下图:出于安全性的考虑,3G中要求单板启动后首先进入BOOT,在等待一段时间后,如果没有软件下载的握手消息,BOOT自动跳入用户的版本程序执行。考虑到调试的方便,BOOT必须同时支持调试口软件下载。为了上电后进入BOOT,T89C51RD2提供了两种方式:硬件方式和软件方式。如图中所示,采用硬件方式只能从0xFC00处,即芯片自带的BOOT启动。所以我们采用软件方式进入BOOT,如图中蓝线所示。如果在等待一段时间后,没有软件下载的握手消息,BOOT沿红线自动跳入用户的版本程序执行。整个过程不需要硬件的参与,完全由软件来实现正常状态与BOOT状态的互相转换。T89C51RD2自带的BOOT程序(0xFC00~0xFFFF)我们的BOOT程序(0xF000~0xFBFF)版本程序(0x0000~0xEFFF)8051单片机BOOT设计方案第2页共11页在烧录器上烧录文件时的步骤:打开烧录器,选择设备为Atmel的T89C51RD2连续载入厂家自带的BOOT,我们的BOOT,版本程序三个HEX文件,每次载入时选择UnusedBytes都是Don’tCare在Config设置中将SoftwareBootVector由FC改为F0,将BootLoaderJumpBit打勾选中用Auto烧录BOOT的启动流程图:ResetFallingEdgeHardWareCondition?BLJB=1?Jumpto0xFC03BSB=0?SBV=0xFC?Jumpto0xXX00CustomBootLoaderJumpto0x0000UserApplicationJumpto0xFC00DeflautBootLoaderYES(PSEN=0;EA=1;ALE=1ornotconnected)YESYESYESSBV=0xXXHardWareSoftWare8051单片机BOOT设计方案第3页共11页2.2对外接口流程说明:单板应用程序收到软件下载进程或调试后台发来的E_O_R_MCUDownloadVerReq下载版本请求消息后,保存参数(若需要),然后复位重启,进入BOOT;BOOT程序启动后,同时向片内串口和ST16C550回E_R_O_MCUDownloadVerAck消息,表示进入下载等待状态。然后开始计时并同时监听片内串口和ST16C550上来的数据,如果超时,跳入用户版本程序;软件下载进程或调试后台通过E_O_R_MCUVerData消息将版本数据传送至单板BOOT,BOOT一旦从一个通道检测到第一个正确包,则不再监听另一个通道;BOOT在收到正确的版本数据后,回E_R_O_MCUVerDataAck消息给软件下载进程或调试后台,消息体中含需要的下一帧数据的帧号,为上次帧号加1;若BOOT收到错误的版本数据后,回E_R_O_MCUVerDataAck消息给软件下载进程,消息体中含需要的下一帧数据的帧号,帧数与上一次相同;以上两步周而复始,直至下载到最后一帧。软件下载进程或调试后台在发送最后一帧数据时,将帧号改为0xFFFE,表示这是最后一帧,BOOT接收到后,如果一切成功,回应帧号0xFFFF,然后跳入用户程序,如果接收或写Flash错误,需要重传,向后台回应帧号仍然为上次回应的帧号(不是0xFFFE)。软件下载进程或调试后台在收到帧号0xFFFF的帧后,表示下载完成。P_R_VersionMgtUser_ApplicationResetandBootControltheMCUdcbaE_O_R_MCUDownloadVerReqE_R_O_MCUVerDataAckE_O_R_MCUVerDataE_R_O_MCUDownloadVerAckJumptoUserApplication8051单片机BOOT设计方案第4页共11页消息结构说明:E_O_R_MCUDownloadVerReq消息结构typedefstructtagT_M_MCUDownloadVerReq{WORDModuleType;BYTESlotID;/*0xff表示广播消息,其他为指定下载*/}T_M_MCUDownloadVerReq;E_R_O_MCUDownloadVerAck消息结构typedefstructtagT_M_MCUDownloadVerAck{WORDModuleType;BYTESlotID;BYTEAckFlag;/*0:SUCCESS,1:Failure*/}T_M_MCUDownloadVerAck;E_O_R_MCUVerData消息结构typedefstructtagT_M_MCUVerData{WORDSequence;//包序号,0:第一包;1:第二包,0xfffe最后一包。WORDLength;/*本包实际数据长度MCUData_BufArrayBuf;BYTEChecksum;/*消息数据校验和:Buf中所有字节的累加和,只保最后字节,越界进位丢弃*/}T_M_MCUVerData;#defineMAXMCUDATA128typedefBYTEMCUData_BufArray[MAXMCUDATA];E_R_O_MCUVerDataAck消息typedefstructtagT_M_MCUVerDataAck{WORDNextSequence;/*下一帧序号,E_O_R_MCUVerData消息结构Sequence+1,接受错误则,返回Sequence再次请求上一帧;*/BYTEAckFlag;/*失败原因:0:SUCCESS,1:接收失败,2:写FLASH失败/}T_M_MCUVerDataAck;2.3软件设计为了实现预定的功能,我们总结BOOT需要完成的具体软件功能:读写Flash同时监听片内串口和外接的ST16C550,申请和释放485总线,完成数据收发处理485帧格式能够跳到用户的版本程序8051单片机BOOT设计方案第5页共11页喂狗BOOT版本号的处理由于整个下载过程中采用发送——接收——处理——回应的方式工作,故整个程序采用一个完全串行化的处理流程。主程序流程如图所示:开始向片内串口和ST16C550分别发送E_R_O_MCUDownloadVerAck消息系统初始化下载结束?接收485数据帧处理485数据根据处理情况发送回应帧跳转至用户版本程序否是否有握手消息否由于BOOT程序的特殊性,考虑到T89C51RD2的芯片特性,我们需要注意以下几个问题:因为BOOT程序和用户版本在同一块64K的Flash中,所以在BOOT程序中要避免使用中断(中断服务程序的入口地址在用户版本程序的空间中),所有的中断(包括时钟中断、串口中断、外部中断)都使用查询方式进行。因为BOOT程序的起始地址为0xF000,所以必须更改程序启动的初始位置为0xF000,故STARTUP.A1文件必须重载。方法为从KeilC的“..\C51\LIB\”目录中得到STARTUP.A1,将第91行的“CSEGAT00000H”改为“CSEGAT0F000H”,并将新文件加入工程。为了保证BOOT程序的安全性,程序不能使用片外RAM。由于为了接收长帧,必须开一个比较大的缓冲区,所以必须使用芯片内部的XRAM。由于BOOT和版本程序在同一块Flash中,所以在BOOT态和正常态转换时只需要将所有的特殊寄存器清零,退出2级中断,然后跳到0x0000执行即可(虽然BOOT中没有使用中断,但是保险起见,需要调用2次RETI退出中断嵌套)。BOOT版本号的处理:在BOOT程序中将版本号作为一个常量定义,每次BOOT在启动的时候将这个BOOT版本号放在SRAM的最高点,初定为0x7FFD-0x7FFF共3个字节,版本软件启动后从这个内存区间中读出BOOT版本号。8051单片机BOOT设计方案第6页共11页2.3.1系统初始化系统初始化的主要工作是将需要用到的设备和全局变量进行初始化。具体的初始化步骤:串口初始化:采用定时器1作为波特率发生器,采用外部晶振为11.0592MHz,采用的波特率为19200bps,具体单板根据自身采用的晶振和485总线波特率的不同自行更改。ST16C550初始化:采用外部晶振为11.0592MHz,采用的波特率为19200bps,具体单板根据自身采用的晶振和与后台通讯波特率的不同自行更改。ST16C550的地址采用杜江编写的3G单板统一编址。时钟初始化:定时器0采用模式1的16位定时器。开始串口初始化关闭中断,设置内存映射位(改用片内XRAM)结束ST16C550初始化时钟初始化(用于计算超时)全局变量初始化2.3.2数据收发为了方便调试,BOOT既支持通过片内串口的485通讯,又支持通过ST16C550的232通讯。因此数据的收发有2条通道。在BOOT刚刚启动的时候,并不知道当前是哪个通道需要下载,故向2个通道都打出握手消息,然后用查询方式监听2个通道,同时开始计时。如果哪个通道有正确的数据上来,关闭计时,关闭另一个通道,开始在这个通道上收发数据。2个通道的数据收发都采用查询方式。2条通路都采用同样的数据帧格式,即3G485通讯协议。8051单片机BOOT设计方案第7页共11页2.3.3读写FlashT89C51RD2的64Kflash的读写采用API函数的方式进行。Atmel公司提供了flash_api.h、flash_api.c、flash_lib.asm共三个源程序供用户使用。我们首先将这3个文件加入我们的工程,然后进行定制。flash_api.h文件:我们需要使用Flash页写功能,故打开#define__API_WR_CODE_PAGE。flash_lib.asm文件:__API_FILL_FF_PAGE函数必须在处在64Kflash的低31k空间中,与我们BOOT程序的区域划分存在矛盾,故注释掉相关代码。flash_api.c文件:在我们使用的__api_wr_code_page函数中调用了__API_FILL_FF_PAGE函数,需要注释掉。3BOOT_SST89V564RD3.1设计思想SST89V564RD提供了2块Flash区间用于分别存放用户版本程序和BOOT程序,即64K的Bloc
本文标题:8051单片机BOOT设计方案
链接地址:https://www.777doc.com/doc-2897663 .html