F28335BOOTROM引导模式和程序_第1页
F28335BOOTROM引导模式和程序_第2页
F28335BOOTROM引导模式和程序_第3页
F28335BOOTROM引导模式和程序_第4页
F28335BOOTROM引导模式和程序_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

28335使用串口烧写程序串口烧写是一种相对较方便的烧写方式,相对于仿真器或是CAN烧写,相对于仿真器或是USB转CAN的设备,串口是一种非常廉价的烧写方式,而且也不需要安装专业的集成开发环境CCS等,但是不能实现在线调试,因此也只适用于程序基本不用再调整或大批量的场合。F28335的存储器映射图如下:Stock

^tartAddnusOn-ChiphfleniQryEmImalNtsmaryscinitf。挥®(HOO。同040444OkMCMOOOkODQfiOOdkddacoaOhD<DDEDQ□hMZDDO□kM即IEOkMsoociggroaoOkHBDflO□mmMoaOkHMDO0x00BilOO^jeQDggQxOOMOO0HOflEDOO0w00iF(IMOkO1CHOO.<gUEdMEn^ap£

■G'liNnbluJMaM育J

亲畚T»«3OOCOOFFFSM340400血3$ODBC血3g(HQO晾龄0400W巽OBOOQH3FS40O味31=9000OzSFAOOOW3FBfllM<Dn-3F0004OtjcSFEO0Oflx3FFFCO。由aSpaceProgSp4C$Dita3融懿灯Prog5pec«MQ火叫w・R;AM(3W菁的)忡宇做胃VNAF=0]RMRffV^dMQSAR禹M桐N喜18gmMRAM炒XIGjiPvrlpM隐IFrsnidk0RqwrwdPIE地gr-RAMfEjnabkadifUM",,ENPIE-1>PierlpbaralFra™QR=K3hCiXIMTFZanad『戚x41土返亡|Pr<Mcctad,E>MA-Acc^x^ibki)P^rlphgralFramA*Prolcctcd|D^1AAcccssiblelgPefi^hertiFFrim*1(F«<HwLVil|PeriphmrBlFrantB2(Probefilfrd)LJQi£ARAM(4KmJ底SecureZoneDualMapped)LiSARAM|<KnSecureZjanclOualMjippcdlL2SARAM(4Kxi^.MicxjmNeirK.DualMapipcdJL3SARAM(4Kx1fi.SaCurtZeiK.DualM3pp«£9|L4SAFEAMDMAAcccuiblit]LS3AFU^(4KS1«,A&C4B«lbl4]165AFWM(4Kk1€,DM^Ac^eslble]L7SAFLAM(4MM115,DMAAcCC^SlbleJR-ti3*rM¥dXIMTFZdfleBMMM1牝XZ金部HQM内Acif靛W)XIWFZ<H1*7jlMHXZCZS7RDMAFr^SH〔2部株k1听.Secure-ZcHiej"IHM)IEPm&wwdkiHSCfV如RiHorvcdADCgmbeatim看R®BC-rw«jIlsurOTP(1K.m1t,SqcuthiZann)R«g«rw#f1iLO5ARAM[4KM1&,SecureM*口网卧LiSARAH(4Km11kSecureZfinoDualMapped)L2SARAH(4Kit1&.9HUF6ZOHSDUiM卧LJSARAM(4Ka.SecureZoneDmadM』ppcd|>RnserwedBmlROM[3Km16-)RRC站-叫站i:H?z用IEMblH-rVMAP二1.EMP1E=U)DX0D4KID倾原SOCIOQjcidCOOD如以口QQCignxitititHOOLEGEND:Only<Hieoftinmqvactormjips-MO[:tor.Pl£i/octor,Mvector-slwuldofiabtedatatim□.BOOTROM是一块8KX16的只读存储器,位于地址空间0x3FE000~0x3FFFFF,片内BOOTROM在出厂时固化了引导加载程序以及定点和浮点数据表,片上BOOTROM的存储映射如下图所示:figure1-1.MemoryMapofOn-ChipROMDataspaceIProgramspace-IQmathtablesFPUmathtablesReservedBootloadorfunctionsReservedROMversionROMchecksrnDataspaceIProgramspace-IQmathtablesFPUmathtablesReservedBootloadorfunctionsReservedROMversionROMchecksrnResetvector

CPUvectortsble3FE00D3FEBDC3FF27C3FF3化3FF9EE3FFFB93FFFC03FFFFF在BOOTROM中保留了4KX16位空间,用以存放浮点和IQ数据公式表,这些数据公式表有助于改善性能和节省SARAM空间。2.CPU向量表:CPU向量表位于ROM存储器0x3FE000~0x3FFFFF段内,如下图所示。复位后,当VMAP=1,ENPIE=0(PIE向量表禁止)时,该向量表激活。

Table1-1.VectorLacationsVectorLocmioninBoolROMContentsfLe.apoints^o)VectorLocationinBootROMCOTitemts(Lbl:,paintsIo)RESETCbcBFFFCOInilBoolRTOSINTOtiSFrFEO0x00ODSOINT10x3FFFC20x000M2ReservedthfSFFFH0x000065]NT20x3FFFC4OxOD0M4NMIChc3FFFE4OxODODMINT30x3FFFC6OUiOO0CM6ILLEGAL伽3FFFE6ITRAPlsrJNL10x3FFFCSgooooiaUSER1OxSFFFE00x000069IINT50x3FFFCA0x00DMAUSER2Qx3FFFEA0x00QC6AINT60x3FFFCC0x00OCMCUSERSFFEC0x000D6C1NT70x3FFFCE0x00CKMEUSERdOxSFFFEE0x00006EIINT80x3FFFIDO0x000050USERSQx3FFFFO0x00QD70IHT9OxSFFFD2CDiOO0052USERS0W3FFFF20x000D72INT10CuiSFFFDdOkOO0054USER7thf^FFFFd0x000074INT11Qx3FFFDS0r000056USERS(MFFFF60x00QD?6IINT120x3FFFD80x00oo&sUSERS伽3FFFF80x00DOTSJNT1S0x3FFFDA0x00OOBAUSER100x3FFFFA.0x00007A1NT140x3FFFOC0x00005CUSER11皿3FFFFC0x00007CDLOGINT0x3FFFDE0x00005EUSER"(M3FFFFE0x00OOTE在内部BOOTROM弓I导区中能够调用的唯一向量就是位于0X3FFFC0的复位向量。复位向量在出厂时被烧录为直接指向存储在BOOTROM空间中的InitBoot函数,该函数用于开启引导过程。然后通过通用I/O引脚上的检验判断,决定具体引导模式。引导模式与控制引脚之间的关系如下图所示:WTable3-6.BootModeSelectionMODEGPIOS7IXA15GPI096/XA14GPIOB5/XA.13GPI084/XA12MO&E111F1111JuimptoF妇shE1110SCl-Ab泊01101SPI-AI»atc1100I2C-AbrolBj011ciCAW-AboolA10!1QM瘀EtMK>t91G01JumplfiXlNTFribS1&Q0Jumpte-XINIFk327□111JUEplQ口TF60110P*raiMGPIOU。tool5D101P辨』旧XINTTFboot40100Jump切SARAN300-11Branchlocheckbcolmade20o-10Branch(qFls&hshipADCcHligticn10001BrarKhtoSAPAM,skpADCeallhratan00Q,00BfarKhto8CI,skipADCGellbratbn{TlAllfourGPIOpln&aninternalpullup.Bootloader特性:Bootloader是位于片上引导ROM中的在复位后执行的程序,用于在上电复位后,将程序代码从外部源转移到内部存储器。这允许代码暂时存储在掉电不丢失数据的外部存储器内,然后被转移到高速存储器中执行。引导ROM中的复位向量将程序执行重定向至InitBoot函数。执行器件初始化之后,bootloader将检查GPIO引脚的状态以确定您需要执行哪种引导模式。这些选项包括:甥龄至闪存、甥龄至SARAM、跳龄至OTP或调用其中一个片上引导加载例程。完成选择进程后,如果已完成所需的引导加载,处理器将在所选引导模式确定的应用起点继续执行。如果调用了bootloader,则由外设加载的输入流确定此应用起点地址。然而,如果选择直接引导至闪存、OTP或SARAM,这些存储器块中每一个存储器块的应用起点均已预定义。Figure2-1.Bo<>tload^rFlowDiagramReset

(power-onresetorwarmreset)

Siliconsetsthefallowing;PIEdisabled(ENPIE-0)VMAP=1OBJIV1CDE=0AMODE=0MOM1IV1AP=1IBootROMResetvectorfetchedfrombootROM

address0x3FFFCOJumptoInitBootfunctiontostart

bootprocessSelectBootMfJdefunction

PLLSTSpiVSEL]=2

Bootdeternnin&dbythestateofI/OpinsCallADC_calroutinein

TilreservedmemoryBeginexecutionatEntryPointasdeterminedbyselectedbootmade

上图显示了引导进程的概述。以下引导模式不掉用bootloader,他们会甥&转至存储器中的预定义位置:1.甥龄至闪存中的分支指令:在此模式下,引导ROM软件将针对28x操作配置器件,然后直接分支至闪存的0X33FFF6位置。此位置刚好是128位代码安全模块(CSM)密码位置之前。您需要预先在0X33FFF6位置处编写分支指令,以将代码执行重定向至定制的boot-loader或应用代码。在仅有RAM的器件上,"引导至闪存"将甥K转到保留存储器,因此不应当使用此选项。2.跳转至M0SARAM

在此模式下,BOOTROM将针对28x操作配置器件,然后直接分支至0x000000,即M0SARAM存储器块中的第一个地址。3.跳龄至OTP存储器在此模式下直接分支至0x380400,即OTP存储器块中的第一个地址ReseiFigure2-6.FlowDiagramofJump-to-OTPMemoryTable3-1ReseiFigure2-6.FlowDiagramofJump-to-OTPMemoryADDRESSRAMGEANDDATASFACF0x300000-0x307FFFSectorH(32KxIE}0x306QQQ-ps3QFFFFSectorG(MKn1辩0k310000-0x317FFFSectorF陞Kx1fi)□k31E000-0x31FFFFSectorE{32K*16)WOO-0x357FFFSeefcirD(32Kx1哥0x326000-0x32FFFFSectorG(32Ks16}0x33oaao-oi33tfffSectorB(3ZKk1岫口心fiOOO-0x33FF7FSacfewA(32Kk1fi)敬33FF80-Dx33FFF5ProgramtoOx.0000whenusingtheCadeSecurityModule□133FFF自-0x33FFF7Add1-td-FInfillEriitfy(programbranchinstrudionhere)0x33FFF0・0j33FFFFSecurilyPasswond(12a-Brt)(DoNotProgramtoallzeros)以下引导模式将调用一个用于将数据流从外设加载至存储器的引导加载例程:SCI-A(注意此处的SCI-A对应的是GPIO28和GPIO29)SPI-AI2C-AeCAN-AGPIO0-GPIO15并行引导。如果使用SCI或者其他弓I导的话,首先需要将启动模式选择相关的弓I脚配置成对应的模式,然后器件退出复位状态之后,首先从复位向量处开始运行,即从0X3FFFC0处,该地址存放着BOOTROM中的第一个汇编初始引导程序InitBoot程序的入口地址,程序甥龄至0X3FFC00执行InitBoot程序。该程序主要初始化F28335器件工作的目标模式。然后读取安全保护模块的密码,如果CSM密码被擦除(全部等于0XFFFF)则自动解锁,否则CSM仍被锁定。对CSM密码读取完成后,初始化例程调用模式选择功能函数(SelectBoot),该函数根据GPIO的状态确定处理器引导的方式。一旦完成SelectMode将会把入口地址返回给初始化引导。然后初始化引导函数调用回复CPU寄存器的退出例程(ExitBoot)并退出到由引导模式确定的程序入口地址。因此我们在使用SCI升级程序时可以分两个步骤,第一个步骤是我们需要一个Bootloader程序,第二个就是我们要升级的程序,BootLoader程序就是我们在选择引导SCI模式之后,SelectBoot之后通过串口加载的第一个程序,待ExitBoot之后会跳转到我们这个bootloader指定的地址开始执行(即将控制权交给我们的这个BootLoader程序),因此我们的BootLoader程序就肩负着串口接收我们的应用程序并将应用程序烧写到FLASH的任务。第二个就是我们的应用程序,这个跟平常的应用程序一样,没有任何区别。1.BootLoader程序由上面的介绍明显知道我们的Bootloader程序是运行在RAM里面的,所以使用CCS在编写该程序的时候使用的是RAM_Link的CMD,而且该程序除了串口的处理还有包括FLASH操作的API函数,而这些函数必须要运行在RAM里面,而且在进行FLASH操作的时候要将中断全部都关掉,FLASH的API有相关的例程是烧进FLASH的还要拷贝到RAM,我们这里正好还免去了拷贝的过程,因为我们整个程序都是运行在RAM中的。Bootloader数据流的结构:Table2-3.GeneralStructureOfSourceProgramDataStreamIn16-BitModeWordContents1234510AA{KeyValueformemoryuiidlh=16bits)RegisterinitializationvalueorreservedforfutureuseRegisterinitializatjonvalueorreservedforfutureuseRegisterinitializationvalueorreservedforfutureuseRegisterinitializationvalueorreservedforfutureuse6789RegisterinitializationvalueorreservedforfutureuseRegisterinrtializationvalueorreservedforfuiureuseRegisterinrtializationvalueorreservedforfuiureuseRegisterinitializationvalueorreservedforfuiureuse101112EntrypointPC(22:16JEntrypointPC(15:01Block»ze(numberofsords)ofthefirstblockofdatatotoad.Iftheblocksizeis0.thisindicatestheendofth©sourceprogramOtherwisoanothersectionfollows.1314DestinationaddressoffirstblockAdd(t31:16JDestinationaddressoffirstblockAdd(t15:0]15••••••Firstwordofthefirstblockinthesourcebeingloaded•••Lastwordofthefirstblockofth©sourcebeingloadedBlocksizeofth©2ndblocktoloadDestinationaddressofsecondblockAddr[31:16JDestinationaddressofsecondblockAddr[15:0]FirstwordofthesecondblockinthesourcebeingloadedLastwordofthesecondblockofthesourcebeingloadedBlocksizeofthelastblocktoloadDestinationaddressoflastblockAddr[31:16]DestinationaddressoflastblockAddr[150]••••••nn*1Firstwordofth©lastblockinthesourcebeingloaded••••••LastwordofthetestblockofthesourcebeingloadedBlocksizoof0000h•indicatesendofthesourceprogramTable24LSB/MSBLoadingSequenceinS-BitDataStreamByteLSBByteLSB(FirstH/teof彩12LSB1AA{KeyVelueformemorywkith=Bbte>34LSB:Roglsisririitializatuanvaluoorr&ssrvod56LSB.RegIslerinitialization妇lu日br海ivM7SILSH:IRegislerinitializaliDnvalueorreservedConlent^MS日(SecandB^teaf2}MSB:D8h(Ke^Valueformemorywicitti=Bbits)MSB*RogisterinrtiHizaQionormseiwdMSB:R日gis囱InitiaJizallon监Imof但MSB:RegisterinitjalizalionvaluenrreservedMSB:MSWdestinatonadcress,fiirstblockAddr[31:24]MSB:MSB:MSWdestinatonadcress,fiirstblockAddr[31:24]MSB:LSWU&slinaliQnaddress,firstblockAddr(i5.8]MSB:FirstwordofthefirstblockbeingloadedLSB-LaatwordofthefirstWeektoloadLSB:BlacksizeoftheSMondblockLSB.MSWd@£tiinatlDnsecondbtockAddr|23.1fl|LSB.LS'A1destinationaidklr也⑤secondblockAddr(7:0;ILSE:Firstwordofthesecondblockbeingload&dLSB-Las«:wordofthesecondOiockLSB:BacksizeofthGlastblMkLSB.MSWofd&stinalloinaddrsKofIasiblockAOdrfiS.ie]ILSH:LSWdestinationaddresiE,lastWeekAddrp』LSB-FirsturordoftheleatWeekbeingloactedMSB:Lastwoirdoftfiefirstbbc>?totoedMSB:Blocksizeoftr>esecondbl&ckMSB:MSWdestinaLonMilr^ss,gecmdblockAddrt31:24]MSB:LSWd&stinmlicrimddi■第g.ee-condbtaCkA£lli3f[15:8]MSB:Firs!wordnFtlissecondblockb&ingloadedMSB:LastwordofthesecondblockMSB:BlocksizeatmlastblockMSB:MSW而stigbm如mss,testblockAddrpl.24]MSB:LSWdesiin^limaddress,laatblockAddr[1£:8|MSB:FinstwordoFtfielastblockbeirgtaadedLSB:Lastwordofthslastblock:MSB:LastwordoftinelastDlockcin+1)LSB:00hMSB:DOh-indi'^aLesitieendoftnasource1718LSB-RegislerinidializaftionvaluearreservedMSB:Regisrterirrtializalionvalueorreserved1920LSB:UpparhalfofEntrypointPC[23:16JMSB:UppsrlharfafentrypointPC[31:24](AlwaysOxOQ)2122LSB.Low^rhalfofEntrypointPC|7.0]MSB:LowsrhahfofEnlrypointPCflS.B]2324LSB:Blackseeinword?ofthefirstbtocktnload.HftheblocksizeisD,thfeindicateE1heendoftheEounzeprognam.OtherwiManai^erblockfollows.Far&xampla,abkscksizeofOxDDOAwouldindicate10'^rdsor20bytesinttieblockMSB:blocksize26LSB:MSWdestiimationiaddres3Bfirs咱locKAddr[23:16J2728LSB.LSWd&stifiatlon白削舶$&rirsLblockAddr[7.0]30LSB:Firstvrardofthe^irstblockt>eingloaded上图就是BootLoader数据流的结构,数据流的第一个16位字称为键值,该键值用来指向Bootloader指示流入的数据流的宽度:8位或16位(在这里SCI就是8位),对于8位数据流,键值为0X08AA,如果bootloader收到一个无效的键值,加载则中止。则直接跳龄到FLASH开始执行。接下来的8个字(2-9)用于初始化寄存器直,如果bootloader不使用这些值,则将这些值留作将来使用。第10个和第11个字组成了22位应用起点地址,此地址用于在完成引导加载后初始化PC,也就是我们程序的起点。第12个字表示传输的第一个数据块的大小。对于8位和16位数据流格式,该数据块的大小均定义为块中的16位字个数,例如,要从8位数据流中传输一个包含20个8位数据值的数据块,该块大小将为0X000A,表示有10个16位字。

第13和14个字表示程序的目的地址,后面跟的就是程序的字,直到遇到数据块长度为0的则传输结束。W2:W1^OxOEJAAW1^0x1OAAFigure2-9.BootloaderBasicTransferProcedureBInS-bilmodetheW2:W1^OxOEJAAW1^0x1OAAFigure2-9.BootloaderBasicTransferProcedureBInS-bilmodetheLSBoFdie16-bitwordisn&adlirslfbllouvedby:heMSB.fi-bitandIG-bittramsFersarenotvalidforallbootmodes.Secihcnfospecifictoaparticularbootloaderfaranylimitation&.TransferRwords<?FdatafromstxjrMlodeslinalionRftajdsecondword(W2)anddiscardupper3-bitsDataformaterrorReturnFLASH_ENTF?Y_POINTReacfirslword(W1)RsaciEntryPoinladdress8-blt□ataSizc16-bitdataReadBlock;琵(R}Rs^dBlDckAddressReturnEnLryPaint上图为BOOTLoader传输流程,如果不相等会自动退出引导程序,系统会从内部FLASH存储器执行程序。这里需要讲一下,我们的Bootloader数据流如何得到,我们正常的使用CCS编译链接得到了xx.out文件,然后使用hex2000.exe-boot-sci8--map=xx.map-oxx.hex-ixx.out(详细解释可参考TMS320C28x-Assembly-Language-Tools-User's-Guide-v6.1.pdf),当然你可以将这些命令参数写成脚本xx.cmd,然后直接执行hex2000.exexx.cmd即可。这就会生成Intel格式的hex文件,我们需要自己对这个hex文件解析,对于生成的Hex文件都是以冒号开始,后面一个字节是数据长度,2-3字节是地址,第4字节是数据类型(00表示数据记录,01表示文件结束记录,02表示扩展段地址记录,04表示扩展线性地址记录)首先需要一个将两个字符转换为一个字节量函数:CharTOByAchargchar'BYTE*PByscharh」;hnpcharoJ;llpcharE;llloLe_selll-a+oxa;e_seif(vH、>8L8lAsIII-A+0X2if(hvno、381X19、)hnyoLe-seif(hvn、a、8一8一hAHJhnhla+oxa;e-seif(hvn、>8l8lh§3hn7>+oxa;*PByreH(BYTE)h*16+If(fopen—S(8lmy\3IT0)prmrfs^M丰漫昴»一wh=e(一feof(myF=e))++-eafgerc(myF=e);}〃将文件长度计算出来用于申请存储数据的缓冲区rewind(myFile);outBuf=(BYTE*)malloc(len/2);memset(outBuf,0xff,len/2);while(!feof(myFile)){if(fgetc(myFile)==‘:7)//:号表示一行的开始{//一行的头两个字符为该行包含的数据长度data[0]=fgetc(myFile);data[1]=fgetc(myFile);CharToByte(data,&datalen);//一行的第3、4个字符为数据存储起始地址的高位data[0]=fgetc(myFile);data[1]=fgetc(myFile);CharToByte(data,&addresshigh);//一行的5、6个字符为数据存储起始地址的低位data[0]=fgetc(myFile);data[1]=fgetc(myFile);CharToByte(data,&addresslow);〃一行的7、8个字符为数据类型data[0]=fgetc(myFile);data[1]=fgetc(myFile);CharToByte(data,&dataType);if(dataType==0x00)//表示普通数据{for(i=0;i<datalen;i++){data[0]=fgetc(myFile);data[1]=fgetc(myFile);CharToByte(data,&byteData);outBuf[adressHigh*256+adresslow+i]=byteData;}}if(dataType==0x01){printfC'文件结束记录!”);}if(dataType==0x02){printf('不支持扩展段地址记录!”);return;}if(dataType==0x04)//本行包含扩展线性地址记录{〃表示的是extended地址高位和低位data[0]=fgetc(my

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论