这套SD IAP程序可以升级一些不带中断的和串口中断的程序,但是稍微复杂一些比如SD卡FATFS和带Ucos的就不行了,调试很久无果
mian.c:
01
|
__asm void JMP_Boot( uint32_t address )
|
03
|
LDR SP, [R0] ;Load new stack pointer address
|
04
|
LDR PC, [R0, #4] ;Load new program counter address
|
08
|
SCB->VTOR = APP_START_SECTOR & 0x1FFFFF80;
|
09
|
JMP_Boot(APP_START_SECTOR);
|
13
|
CLKPWR_ConfigPPWR(CLKPWR_PCONP_PCGPIO, ENABLE);
|
14
|
lpc1788_Uart_Init(0); printf("uart0 init success!\n\r");
|
21
|
if(updata_num==1) {LCD_ShowString(10,218,608,16,16,"Updata APP SUECCED!");updata_num=0;Boot();}
|
22
|
else {LCD_ShowString(10,218,608,16,16,"Have not Updata APP!"); Boot();}
|
SD 卡升级部分:
04
|
char folder[255] = "";
|
07
|
ceshi = (FRESULT)SD_Init()
|
10
|
printf("sd init error.\n\r");
|
11
|
LCD_ShowString(10,26,200,16,16,"Has no SD found!");
|
15
|
LCD_ShowString(10,26,608,16,16,"Press any key to updata system in 3S:");
|
16
|
// LCD_FillRectangle (LCD_PANEL_UPPER, 320,352,26,74, WHITE);LCD_ShowString(320,26,200,16,16,"10S");Delay(1000);if(flag==1){flag=0;goto updata_APP;}
|
17
|
// LCD_FillRectangle (LCD_PANEL_UPPER, 320,352,26,74, WHITE);LCD_ShowString(320,26,200,16,16,"09S");Delay(1000);if(flag==1){flag=0;goto updata_APP;}
|
18
|
// LCD_FillRectangle (LCD_PANEL_UPPER, 320,352,26,74, WHITE);LCD_ShowString(320,26,200,16,16,"08S");Delay(1000);if(flag==1){flag=0;goto updata_APP;}
|
19
|
// LCD_FillRectangle (LCD_PANEL_UPPER, 320,352,26,74, WHITE);LCD_ShowString(320,26,200,16,16,"07S");Delay(1000);if(flag==1){flag=0;goto updata_APP;}
|
20
|
// LCD_FillRectangle (LCD_PANEL_UPPER, 320,352,26,74, WHITE);LCD_ShowString(320,26,200,16,16,"06S");Delay(1000);if(flag==1){flag=0;goto updata_APP;}
|
21
|
// LCD_FillRectangle (LCD_PANEL_UPPER, 320,352,26,74, WHITE);LCD_ShowString(320,26,200,16,16,"05S");Delay(1000);if(flag==1){flag=0;goto updata_APP;}
|
22
|
// LCD_FillRectangle (LCD_PANEL_UPPER, 320,352,26,74, WHITE);LCD_ShowString(320,26,200,16,16,"04S");Delay(1000);if(flag==1){flag=0;goto updata_APP;}
|
23
|
LCD_FillRectangle (LCD_PANEL_UPPER, 320,352,26,74, WHITE);LCD_ShowString(320,26,200,16,16,"03S");Delay(1000);if(flag==1){flag=0;goto updata_APP;}
|
24
|
LCD_FillRectangle (LCD_PANEL_UPPER, 320,352,26,74, WHITE);LCD_ShowString(320,26,200,16,16,"02S");Delay(1000);if(flag==1){flag=0;goto updata_APP;}
|
25
|
LCD_FillRectangle (LCD_PANEL_UPPER, 320,352,26,74, WHITE);LCD_ShowString(320,26,200,16,16,"01S");Delay(1000);if(flag==1){flag=0;goto updata_APP;}
|
26
|
LCD_FillRectangle (LCD_PANEL_UPPER, 320,352,26,74, WHITE);LCD_ShowString(320,26,200,16,16,"00S");Delay(1000);if(flag==1){flag=0;goto updata_APP;}
|
31
|
SystemCoreClockUpdate();
|
33
|
LCD_ShowString(10,42,200,16,16,"Updata APP:");LCD_FillRectangle (LCD_PANEL_UPPER,176,376,42,58,skyblue);
|
34
|
ceshi = f_mount(&fs,"0:", 1);
|
35
|
if(ceshi != FR_OK){printf("f_mount error = %d\n\r",ceshi);}
|
37
|
ceshi=f_open (&file, "UNIGBK.BIN", FA_READ); RES_FALT(ceshi);
|
38
|
SIZE_UNIGBK=file.fsize;
|
39
|
printf("\n UNIGBK.BIN ?????ù???ó????%d×??? \n",file.fsize);
|
40
|
ceshi=f_read(&file, UNIGBK, SIZE_UNIGBK, &br); RES_FALT(ceshi);
|
41
|
printf("\nbr ??????%d\n",br);printf("\n");
|
43
|
LCD_FillRectangle (LCD_PANEL_UPPER,176,186,42,58,NavyBlue);
|
45
|
scan_files(folder); //±é?úSD?¨????
|
46
|
LCD_FillRectangle (LCD_PANEL_UPPER,186,190,42,58,NavyBlue);
|
50
|
if ((u32IAP_PrepareSectors(10, 21) == IAP_STA_CMD_SUCCESS) &&(u32IAP_EraseSectors (10, 21) == IAP_STA_CMD_SUCCESS))
|
51
|
{LCD_ShowString(10,58,200,16,16,"Erase Done!"); LCD_FillRectangle (LCD_PANEL_UPPER,190,200,42,58,NavyBlue);}
|
52
|
else {LCD_ShowString(10,58,200,16,16,"Erase FAILED!");return;}
|
55
|
ceshi=f_open (&file, "V002.bin", FA_READ); RES_FALT(ceshi);
|
56
|
printf("\n V002.bin?????ù???ó????%d×??? \n\r",file.fsize);addr=0;
|
57
|
for(ii=0;ii<((file.fsize)/512+1);ii++)
|
59
|
ceshi = f_read(&file, APP_CODE_ADDR, 512, &br); RES_FALT(ceshi);
|
60
|
__disable_irq();//NVIC_DisableIRQ(DMA_IRQn);
|
61
|
if ((ceshi == FR_OK) || (br == 512))
|
63
|
printf("\n %d,%d ",br,ii);
|
64
|
u32Status=u32IAP_PrepareSectors(10, 21); printf(" PrepareSectors:%d ",u32Status);
|
65
|
u32Status=u32IAP_CopyRAMToFlash(APP_START_SECTOR+addr,(uint32_t)APP_CODE_ADDR,512);printf(" CopyRAMToFlash:%d \n\r",u32Status);
|
67
|
LCD_FillRectangle (LCD_PANEL_UPPER,200,200+ii*176/((file.fsize)/512),42,58,NavyBlue);
|
71
|
NVIC_DisableIRQ(MCI_IRQn);
|
|