MSP430F5438A串口升級程序方法_第1頁
MSP430F5438A串口升級程序方法_第2頁
MSP430F5438A串口升級程序方法_第3頁
MSP430F5438A串口升級程序方法_第4頁
MSP430F5438A串口升級程序方法_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、MSP430F5438A串口升級程序方法1、內(nèi)存映射關(guān)系如下(可查看相應(yīng)datasheet):MSP430F5438A內(nèi)部flash0X45BFBANKA0X400000X3FFFBANKD(64K)0X300000X2FFFBANKC(64K)0X200000X1FFF_BANKB(64K)0X100000XFFFFBANKA0X5C0C正常情況1LAS分配情況I-0XFFFF0XFF8C0XFF7F0X5C00硬件中斷向量區(qū)代碼區(qū)BootLoad應(yīng)用下內(nèi)存分配用戶中斷向量用戶程序BOOTLoaderBANKA也為64KRESETS址為xFFFERESETS址為xFCFE2、修改升級程序和應(yīng)

2、用程序的xcl文件:原來的xcl文件:/Code/-Z(CODE)CSTART,ISR_CODE=5C00-FF7F/Constantdata/-Z(CONST)DATA16_C,DATA16_ID,DIFUNCT,CHECKSUM=5C00-FF7F/Allmemory0-FFFFF/Code/-P(CODE)CODE=5C00-FF7F,10000-45BFF-Z(CODE)CODE_ID/Constantdata/-Z(CONST)DATA20_C,DATA20_ID=5C00-FF7F,10000-45BFF/Interruptvectors/-Z(CODE)INTVEC=FF80-F

3、FFF-Z(CODE)RESET=FFFE-FFFF升級程序的xcl文件:/Code/-Z(CODE)CSTART,ISR_CODE=5C00-6BFF/Constantdata/-Z(CONST)DATA16_C,DATA16_ID,DIFUNCT,CHECKSUM=5C00-FF7F/Allmemory0-FFFFF/Code/-P(CODE)CODE=5C00-6BFF-Z(CODE)CODE_ID/Constantdata/-Z(CONST)DATA20_C,DATA20_ID=5C00-6BFF/Interruptvectors/-Z(CODE)INTVEC=FF80-FFFF-Z(

4、CODE)RESET=FFFE-FFFF應(yīng)用程序的xcl文件:/Code/-Z(CODE)CSTART,ISR_CODE=6C00-FF7F/*/Constantdata/-Z(CONST)DATA16_C,DATA16_ID,DIFUNCT,CHECKSUM=6C00-FF7F/Allmemory0-FFFFF/Code/-P(CODE)CODE=6C00-FF7F,10000-45BFF-Z(CODE)CODE_ID/Constantdata/-Z(CONST)DATA20_C,DATA20_ID=6C00-FF7F,10000-45BFF/Interruptvectors/-Z(CODE

5、)INTVEC=FC80-FCFF-Z(CODE)RESET=FCFE-FCFF3、將應(yīng)用程序生成txt文件,然后通過串口助手發(fā)送文件形式下發(fā):6C003140005C3C40001C3D406800B013906EB013A46DB013A26E3F141F42DE05E00F8B3C013C893C5E42CC057E90750084203C4000FA0D43B0132C6E3C403C6DB0137A6EF2D0100043020F43013C1F533F93FD2B0F43013C1F533F93FD2B0F43013C1F533F93FD2B0F43013C1F533F93FD2B

6、0F43013C1F533F93FD2B0F43013C1F533F93FD2B0F43013C1F533F93FD2B0F43013C1F533F93FD2B0F43013C1F533F93FD2B0F43013C1F533F93FD2B0F43013C1F533F93FD2B0F43013C1F533F93FD2B0F43013C1F533F93FD2B0F43013C1F533F93FD2B0F43013C1F533F93FD2B0F43013C1F533F93FD2B0F43013C1F533F93FD2B0F43013C1F533F93FD2B0F43013C1F533F93FD2B

7、0F43013C1F533F93FD2B0F43013C1F533F93FD2B0F43013C1F533F93FD2B0F43013C1F533F93FD2B0F43013C1F533F93FD2B3C1600137521006D40F2D00C004A02F2D003006A0292C36C01B2C000016C014E43023C03435E537E906400FB2BB2F0F0FF6E01A2C302014E43013C5E537E906400FC2B0343A2B30201F12F1F426C013FF0FF3F3F500040824F6C01B2F03FFF6C01B24055

8、00680182436A0110010D43B240805A5C01B013EC6DB013406DB013566E32D2F2D0100082020D43013C1D533D93FD2BF2C0200082023F40041C824F021C824F001CF2D010004302F2C010004302F93F0343F2D030002A02F2D010002402D2424B024B02F2D010004502F2C010004302D2426A026A02E2D26402E2C26202F2C020008A02F2D030008402F2F0CF008202100132C2034392

9、B34401FD2FB24000A54401B24002A54001CC43000092B34401FD2FB24010A5440132D21001D2D3C005F2D04000C005F2400300C605C243C705F2400600C805D2C3C005D2D3DC051001033CE24CCE051C53E2B3DD05FD2BCC930000F72310010F4C0F5D033CCC4300001C530C9FFB2310018000AA6EFF3F03438000A66EFCF2186CFCFE006Cq其中開頭的為將要寫入FLASH的地址,q為結(jié)束標(biāo)識,其它為填入FL

10、SH的數(shù)據(jù)。這些數(shù)據(jù)從串口下發(fā)的時(shí)候是ASCII碼,因此需要將其變成十六進(jìn)制的形式才能寫入FLASH,并將其中的空格,換行,回車等摒棄。4、如果升級程序的串口通訊采用中斷方式,將會發(fā)生進(jìn)中斷后程序跑飛的情況,為避免這個(gè)問題,在執(zhí)行應(yīng)用程序時(shí)先將硬件中斷向量區(qū)中的升級程序的中斷向量表保存至FLASH,并將應(yīng)用程序的中斷向量表寫入硬件中斷向量區(qū);當(dāng)執(zhí)行升級程序時(shí)再將升級程序的中斷向量表寫入硬件中斷向量區(qū)。因此,在應(yīng)用程序區(qū)隔出兩個(gè)區(qū),0XFA00-OXFA01用于存升級標(biāo)識0 xAA55,0 xF800-0XF9FF用于存儲升級程序的中斷向量表:BootLoade應(yīng)用下內(nèi)存分配正常情況下LASH分

11、配情況OXFFFF硬件中斷向量區(qū)0XFF800XFF7F代碼區(qū)OX5CO0RESET地址為)xFFFE0XFBFF存升級標(biāo)識XAA550XFA000XF9FF存升級程序的中斷向量表0Xf8000XF7FF用戶程序0X6C000XFA00=0XAA,0XFA01=0X55,執(zhí)行應(yīng)用程序,將硬件中斷向量區(qū)(0 xFF80-0XFFFF)中的升級程序中斷向量表儲存至0 xF800-0XF9FF中,并將應(yīng)用程序的中斷向量表(位于0 xFC80-0XFCFF)寫入硬件中斷向量區(qū)。5、例程:升級程序:voidmain(void)_low_level_init();/關(guān)閉看門狗uinti=0;SYS_IO_

12、Init();SYS_CLK_Init();SYS_UART_Init();_EINT();/系統(tǒng)總中斷開啟Pr=Pw=RecBuf;Fr=Fw=FlashBuf;while(1)WDI;喂狗if(ResetVectorValid()=1)verterFlag=0;updataflag=0;Update();elseverterFlag=1;Application();/是否需要升級程序/執(zhí)行升級程序/執(zhí)行應(yīng)用程序/TxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTx

13、TxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTx/描述:檢查升級標(biāo)識地址中的內(nèi)容是否為0 xAA55,如為0 xAA55,則返回1.ucharResetVectorValid(void)/如果應(yīng)用程序的復(fù)位向量處的內(nèi)容為0 xAA55,表示需要升級程序if(ReadFlash(UPDADAFLAG_ADDR)=0 xAA&ReadFlash(UPDADAFLAG_ADDR+1)=0 x55)return0;/執(zhí)行應(yīng)用程序elsereturn1;/升級程序/*/TxTxTxTxTxTxTxTxTxTxTxTxTxTx

14、TxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTx,/描述:應(yīng)用程序,將PC轉(zhuǎn)移到應(yīng)用程序的復(fù)位向量處/輸入:無輸出:無voidApplication(void)WDI;喂狗uart_send(runningapp!);/發(fā)送確認(rèn)asm(mov&0 xFCFE,PC;);/在C中調(diào)用匯編指令,實(shí)現(xiàn)地址轉(zhuǎn)移/J/TxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxT

15、xTxTxTxTxTxTxTxTxTx/描述:程序更新/TxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxvoidUpdate(void)uchark=0;uintSegSize=0;UartA0_Send_char(XON);/擦除Flash:6c00fc00for(k=0;kv71;k+)擦除Flash:6c00fcOOWDI;/防止f

16、lash擦除期間單片機(jī)復(fù)位Flash_Erase(0 x6c00+SegSize);SegSize=SegSize+512;uart_send(UpdateReady!);/發(fā)送確認(rèn)while(1)WDI;/喂狗if(B_bufFul=1)&(rcv_n100)UartA0_Send_char(XON);B_bufFul=0;if(updataflag=0)/升級程序未完成,解析數(shù)據(jù)DisPoseData();else/升級程序完成,跳出while循環(huán)return;/解析串口接收到的數(shù)據(jù)voidDisPoseData(void)ucharldata=0;uchark=0;if(Pr=RecBu

17、f+RLEN)/到數(shù)據(jù)緩沖區(qū)尾Pr=RecBuf;/到從頭開始解析if(Pr=Pw)return;/沒有需要處理的數(shù)據(jù)ldata=*Pr+;rcv_n-;switch(ZL_flag)case0:/switch(ldata)case:/收到地址ZL_flag=1;Addr=0;break;caseq:/quit,ZL_flag=2;break;default:/number。數(shù)據(jù)if(ldata=0)數(shù)據(jù)Flash_date=0)Addr=4;/Addr=Addr4Addr+=AsciiToHex(ldata);得到需要寫的FLASH地址if(ldata=0 x0A)/換行ZL_flag=0;

18、break;case2:/跳轉(zhuǎn)應(yīng)用程序if(ldata=OxOA)有數(shù)據(jù),并接收到換行時(shí)處理ZL_flag=0;uart_send(updatafinish!);verterFlag=1;WriteFlash(UPDADAFLAG_ADDR,UpdatePar,2);在0X6A00地址寫入0 xAA55,表明有應(yīng)用程序可執(zhí)行/保存硬件中斷向量區(qū)中的bootloader中斷向量表for(k=0;k128;k+)vector_tablek=ReadFlash(0 xff80+k);Flash_Erase(0 x6a00);WriteFlash(0 x6a00,vector_table,128);/

19、將應(yīng)用程序中斷向量表寫到硬件中斷向量區(qū)for(k=0;k128;k+)vector_tablek=ReadFlash(0 xfc80+k);Flash_Erase(0 xff80);/擦除硬件中斷向量區(qū)WriteFlash(0 xff80,vector_table,128);updataflag=1;break;/IO初始化voidSYS_IO_Init(void)/led&RF_ENP2SEL&=0 xe1;P2DIR|=0 x1E;P2OUT&=0 xE1;/ledP4SEL&=0 x1f;P4DIR|=0 xe0;P4OUT&=0 x1f;/setp2.1,p2.2,p2.3,p2.4a

20、sIO/SetDirectionasoutput/Setledoff,RFoff/setp4.5,p4.6,p4.7asIO/SetDirectionasoutputP6SEL|=0 x00;P6DIR|=0 x10;P6OUT&=0 xef;/WDI/UARTP3SEL|=0 x30;P3DIR|=0 x10;/DEBUG-RXDP3.5,DEBUG-TXDP3.4/SetDirectionforP3P7SEL|=0 x00;P7DIR|=0 x04;P7OUT&=(0 x04);/PWR-GPSP7.2/SetDirectionforP7/SetOutput0/setasledoutP9S

21、EL&=0 xdf;P9DIR|=0 x30;P9OUT&=0 xCF;/串口初始化voidSYS_UART_Init(void)/UARTforpc:115200UCA0CTL1|=UCSWRST;UCA0CTL1|=UCSSEL_2;MCLK;UCSSEL_1:CLK=ACLKUCA0BR0=104;UCA0BR1=0 x00;UCA0MCTL=UCBRS_3+UCBRF_0;/P9.5,P9.4asIO/SetDirectionforP9/ledoff/*Putstatemachineinreset*/UCSSEL_2:CLK/32k/9600/UCOS16=0/Modulation(U

22、CBRSx=/Setledoffround(f_BRCLK/Buadrate-INT(f_BRCLK/Buadrate)*8)=1)UCA0CTL1&=UCSWRST;/*InitializeUSCIstatemachine*UCA0IE|=UCRXIE;/EnableUSCI_A0RXinterrupt/UCA0IE|=UCTXIE;/EnableUSCI_A0TXinterrupt/初始化時(shí)鐘voidSYS_CLK_Init(void)unsignedchari;P5SEL|=0 x0c;P7SEL|=0 x03;/UCSCTL6&=XT1OFF;UCSCTL6&=XT2OFF;for(i

23、=0;i100;i+)_NOP();/XT2&XT1功能選擇/打開XT1振蕩器/打開XT2振蕩器/等待振蕩器起振doUCSCTL7&=(DCOFFG+XT1HFOFFG+XT1LFOFFG+XT2OFFG);SFRIFG1&=(OFIFG);/清除振蕩器失效標(biāo)for(i=0;i100;i+);_NOP();/等待振蕩器起振while(SFRIFG1&OFIFG)!=0);UCSCTL6=XT2DRIVE_1+(UCSCTL6&0 x3fff);UCSCTL6=XT1DRIVE_0+(UCSCTL6&0 xff3f);/設(shè)置驅(qū)動能力,振蕩器XT1和XT2UCSCTL4=SELM_XT2CLK+S

24、ELS_XT2CLK+SELA_XT1CLK;/MCLK、SMCLK來自XT2,ACLK來自XT1UCSCTL5=DIVM_0+DIVS_0+DIVA_0+DIVPA_0;/分頻系數(shù)為0return;/TxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTx=0&cNum=A&cNum=F)cNum-=A;cNum+=10;returncNum;/、/TxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTx,/描述:讀FLA

25、SH操作/輸入:unsignedintwaddr16位地址/輸出:unsignedchar返回一個(gè)字節(jié)數(shù)據(jù)ucharReadFlash(uintwaddr)ucharvalue;while(FCTL3&BUSY);value=*(uchar*)waddr;returnvalue;voidFlash_Erase(ulongpAddr)uchar*Flash_ptr=(uchar*)pAddr;_DINT();/關(guān)閉總中斷while(BUSY&FCTL3);FCTL3=FWKEY;FCTL1=FWKEY+ERASE;/段擦除*Flash_ptr=NULL;while(BUSY&FCTL3);FCT

26、L3=FWKEY+LOCK;_EINT();/打開總中斷return;/TxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTx/描述:FLASH寫操作/輸入:unsignedintaddr16位FLASH地址,unsignedchar*pdata數(shù)據(jù)指針/輸入:unsignedcharlength數(shù)據(jù)長度/輸出:unsignedchar錯(cuò)誤標(biāo)志ucharWriteFlash(uintaddr,u

27、char*pdata,ucharlength)ucharErrorFlag=0;uinti;while(FCTL3&BUSY);_BIC_SR(GIE);/清除鎖/設(shè)置WRT位為寫操作/寫一個(gè)字節(jié)/驗(yàn)證,寫比較.正確或錯(cuò)誤/設(shè)置錯(cuò)誤標(biāo)志/FCTL2=FWKEY+FSSEL0+FN1;FCTL3=FWKEY;FCTL1=FWKEY+WRT;for(i=0;ilength;i+)*(uchar*)addr=*pdata;if(ReadFlash(addr)!=*pdata)ErrorFlag=1;addr+;pdata+;FCTL1=FWKEY;FCTL3=FWKEY+LOCK;_BIS_SR(G

28、IE);returnErrorFlag;/TxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTx/描述:串口發(fā)送函數(shù)(非中斷形式)/發(fā)送一個(gè)字符(16進(jìn)制)voidUartA0_Send_char(uchard)UCA0TXBUF=d;while(!(UCA0IFG&UCTXIFG);/描述:發(fā)送一字符串往PCvoiduart_send(constuchar*data_point)while(1)while(!(UCA0IFG&UCTXIFG);/querytxready?if(*data_point=0)break;elseUCA0TXBUF=*data_point;data_point+;/TxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTx/描述:串口中斷處理函數(shù)/*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論