看了那么多stm32代碼升級(jí)的教程,有兩個(gè)疑點(diǎn):1,修改中斷向量表偏移是bootloader修還是app代碼要修?
答:app代碼

2:,修改rom的起始地址或RAM的地址在哪里?
答:app代碼

3,bootloader代碼干啥?
答:就寫段程序就行。
intmain(void) { u8t,key; u16oldcount=0; //老的串口接收數(shù)據(jù)值 u16applenth=0; //接收到的app代碼長度 u8clearflag=0; uart_init(256000); //串口初始化為256000 delay_init(); //延時(shí)初始化 LCD_Init(); //液晶初始化 LED_Init(); //初始化與LED連接的硬件接口 KEY_Init(); //按鍵初始化 POINT_COLOR=RED;//設(shè)置字體為紅色 LCD_ShowString(60,50,200,16,16,"WarshipSTM32"); LCD_ShowString(60,70,200,16,16,"IAPTEST"); LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK"); LCD_ShowString(60,110,200,16,16,"2012/9/24"); LCD_ShowString(60,130,200,16,16,"WK_UP:CopyAPP2FLASH"); LCD_ShowString(60,150,200,16,16,"KEY1:EraseSRAM APP"); LCD_ShowString(60,170,200,16,16,"KEY0:RunSRAM APP"); LCD_ShowString(60,190,200,16,16,"KEY2:RunFLASH APP"); POINT_COLOR=BLUE; //顯示提示信息 POINT_COLOR=BLUE;//設(shè)置字體為藍(lán)色 while(1) { if(USART_RX_CNT) { if(oldcount==USART_RX_CNT) //新周期內(nèi),沒有收到任何數(shù)據(jù),認(rèn)為本次數(shù)據(jù)接收完成. { applenth=USART_RX_CNT; oldcount=0; USART_RX_CNT=0; printf("用戶程序接收完成!\r\n"); printf("代碼長度:?ytes\r\n",applenth); }elseoldcount=USART_RX_CNT; } t++;delay_ms(10); if(t==30) { LED0=!LED0;t=0; if(clearflag) { clearflag--; if(clearflag==0)LCD_Fill(60,210,240,210+16,WHITE);//清除顯示 } } key=KEY_Scan(0); if(key==KEY_UP) { if(applenth) { printf("開始更新固件...\r\n"); LCD_ShowString(60,210,200,16,16,"CopyingAPP2FLASH..."); if(((*(vu32*)(0X20001000+4))&0xFF000000)==0x08000000) //判斷是否為0X08XXXXXX. { iap_write_appbin(FLASH_APP1_ADDR,USART_RX_BUF, applenth);//更新FLASH代碼 LCD_ShowString(60,210,200,16,16,"CopyAPP Successed!!"); printf("固件更新完成!\r\n"); }else { LCD_ShowString(60,210,200,16,16,"IllegalFLASHAPP! "); printf("非FLASH應(yīng)用程序!\r\n"); } }else { printf("沒有可以更新的固件!\r\n"); LCD_ShowString(60,210,200,16,16,"NoAPP!"); } clearflag=7;//標(biāo)志更新了顯示,并且設(shè)置7*300ms后清除顯示 } if(key==KEY_DOWN) { if(applenth) { printf("固件清除完成!\r\n"); LCD_ShowString(60,210,200,16,16,"APPErase Successed!"); applenth=0; }else { printf("沒有可以清除的固件!\r\n"); LCD_ShowString(60,210,200,16,16,"NoAPP!"); } clearflag=7;//標(biāo)志更新了顯示,并且設(shè)置7*300ms后清除顯示 } if(key==KEY_LEFT) {
了解完上面的教程以后,開始動(dòng)手實(shí)踐,但問題來了: 1,必須找一個(gè)能打開bin文件的軟件,如用ultraedit 2,將純數(shù)據(jù)的二進(jìn)制拷出來,然后用串口助手發(fā)送給單片機(jī) 3,發(fā)現(xiàn)升級(jí)失敗,后來發(fā)現(xiàn)從ultraedit里拷貝出來的數(shù)據(jù)每一行后面都有一個(gè)換行,所以拷貝到word里,將所有的換行去掉,因?yàn)橐粋(gè)換行就是一個(gè)字節(jié),盡管在用串口助手的HEX方式發(fā)送時(shí),看不到那個(gè)換行的字節(jié),但是實(shí)驗(yàn)發(fā)現(xiàn),是多一個(gè)字節(jié)的。 4,具體操作如下: 第一步:按Ctrl + H
第二步:在“查找內(nèi)容”后面,輸入:^p (注意,^就是數(shù)字6上面的那個(gè)符號(hào),p是小寫的)
第三步:在“替換為”后面,不輸入任何內(nèi)容。
第四步:點(diǎn)“全部替換”。 5,發(fā)現(xiàn)好使。
|