[讨论] LPC1788 IAP 升级带ucos的APP程序失败

suebillt   2015-3-17 15:23 楼主
升级一些简单的代码比如LCD、串口中断程序等是没问题的,SD卡的FATFS例程就不能初始化SD卡了,带ucos的APP直接跳转不过去(MCU重启),哪位前辈指教下

回复评论 (17)

是不是堆栈空间不够造成的?
我的博客
点赞  2015-3-17 16:19
引用: zhaojun_xf 发表于 2015-3-17 16:19
是不是堆栈空间不够造成的?



如何验证是否是堆栈空间不够呢?
点赞  2015-3-17 16:45
无法验证。
我的博客
点赞  2015-3-17 17:32
引用: zhaojun_xf 发表于 2015-3-17 17:32
无法验证。



被这个问题困扰好久了,一直无法解决
点赞  2015-3-17 17:34
引用: zhaojun_xf 发表于 2015-3-17 16:19
是不是堆栈空间不够造成的?

IAP升级APP之后MCU重启,但是如果不擦除Flash,直接跳转后就死在了
  1. EEPROM_IRQHandler
  2.                                        
  3.                                 B       .
  4.                                
  5.                                 ENDP
  6.                                
  7.                                
  8.                                 ALIGN
  9.                                         里面了



点赞  2015-3-17 17:45
引用: zhaojun_xf 发表于 2015-3-17 16:19
是不是堆栈空间不够造成的?
  1. mian 函数:

SD卡升级函数:
  1. void fs_test(void)
  2. {
  3.         FRESULT res;
  4.         FRESULT ceshi;
  5.         char folder[255] = "";
  6.         uint32_t addr,ii;
  7.         uint32_t u32Status;
  8.         res = (FRESULT)SD_Init();
  9.         if(res == FALSE)
  10.   {
  11.     printf("sd init error.\n\r");
  12.                 LCD_ShowString(10,26,200,16,16,"Has no SD found!");
  13.   }
  14.   else
  15.         {
  16.                 LCD_ShowString(10,26,608,16,16,"Press any key to updata system in 3S:");
  17. //                         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;}
  18. //                         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;}
  19. //                         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;}
  20. //                         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;}
  21. //                         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;}
  22. //                         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;}
  23. //                         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;}
  24.                         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;}
  25.                         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;}
  26.                         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;}
  27.                         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;}
  28.       return;
  29. updata_APP:
  30.                                 updata_num=1;
  31.                                 SystemCoreClockUpdate();
  32.                                 
  33.                                 LCD_ShowString(10,42,200,16,16,"Updata APP:");LCD_FillRectangle (LCD_PANEL_UPPER,176,376,42,58,skyblue);
  34.                                 res = f_mount(&fs,"0:", 1);
  35.                                 if(res != FR_OK){printf("f_mount error = %d\n\r",res);}
  36.                                 
  37.                                 ceshi=f_open (&file, "UNIGBK.BIN", FA_READ);  RES_FALT(ceshi);
  38.                                 SIZE_UNIGBK=file.fsize;
  39.                                 printf("\n UNIGBK.BIN ÎļtËùÕ¼′óD¡£o%d×Ö½ú \n",file.fsize);
  40.                                 ceshi=f_read(&file, UNIGBK, SIZE_UNIGBK, &br);        RES_FALT(ceshi);
  41.                                 printf("\nbr μÄÖμ£o%d\n",br);printf("\n");
  42.                                 f_close(&file);br=0;//////////////////////////////////////////////1رÕÎļt
  43.                                 LCD_FillRectangle (LCD_PANEL_UPPER,176,186,42,58,NavyBlue);
  44.                                 
  45.                                 scan_files(folder);        //±éàúSD¿¨Îļt
  46.                                 LCD_FillRectangle (LCD_PANEL_UPPER,186,190,42,58,NavyBlue);
  47.                                 
  48.                                 SysTick->CTRL=0;//1ØμôÏμí3¶¨ê±Æ÷·àÖ1ó°ÏìoóÃæ2á3y2ù×÷        
  49.                                 NVIC_DisableIRQ(UART0_IRQn);               
  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;}
  53.                
  54.                                 ceshi=f_open (&file, "APP.bin", FA_READ);  RES_FALT(ceshi);
  55.                                 printf("\n APP.binÎļtËùÕ¼′óD¡£o%d×Ö½ú \n\r",file.fsize);addr=0;
  56.                                 for(ii=0;ii<((file.fsize)/512+1);ii++)
  57.                                 {
  58.                                         ceshi = f_read(&file, APP_CODE_ADDR, 512, &br); RES_FALT(ceshi);
  59.                                         NVIC_DisableIRQ(DMA_IRQn);        
  60.                                         if ((ceshi == FR_OK) || (br == 512))
  61.                                         {
  62.                                                  printf("\n %d ",br);
  63.                                                  u32Status=u32IAP_PrepareSectors(10, 21);printf(" PrepareSectors:%d ",u32Status);
  64.                                                  u32Status=u32IAP_CopyRAMToFlash(APP_START_SECTOR+addr,(uint32_t)APP_CODE_ADDR,512);printf(" CopyRAMToFlash:%d \n\r",u32Status);
  65.                                                  addr += 512;
  66.                                                  LCD_FillRectangle (LCD_PANEL_UPPER,200,200+ii*176/((file.fsize)/512),42,58,NavyBlue);
  67.                                         }
  68.                                         NVIC_EnableIRQ(DMA_IRQn);        
  69.                                  }f_close(&file);br=0;
  70.                                   //SysTick_Init();NVIC_EnableIRQ(UART0_IRQn);
  71.                                 // NVIC_DisableIRQ(DMA_IRQn);        
  72.   }
  73.         return;
  74. }




点赞  2015-3-17 17:47
  1. mian 函数:
  2. __asm void JMP_Boot( uint32_t address )//address ó|óÃ3ìDòμØÖ·  /* Descriptions:        ìø×aμ½ó|óÃ3ìDò*/
  3. {
  4.    LDR SP, [R0]                ;Load new stack pointer address
  5.    LDR PC, [R0, #4]        ;Load new program counter address
  6. }
  7. void Boot( void )/* Descriptions:        ìø×aμ½ó|óÃ3ìDò*/
  8. {
  9.         SCB->VTOR = APP_START_SECTOR & 0x1FFFFFFF;        //DT¸ÄÖD¶ÏÏò῱í
  10.         JMP_Boot(APP_START_SECTOR);
  11. }
  12. int main(void)
  13. {
  14.         CLKPWR_ConfigPPWR(CLKPWR_PCONP_PCGPIO, ENABLE);        /* ′ò¿aGPIOíaéèμçÔ′£¬éÏμçoóGPIOμçÔ′ĬèÏêÇ′ò¿aμÄ£¬′ËDD¿éè¥μô */
  15.         lpc1788_Uart_Init(0);                printf("uart0 init success!\n\r");/* 3õê¼»ˉ′®¿úUart0 */       
  16.         lpc1788_SDRAM_Init();        /* 3õê¼»ˉSDRAM */
  17.         lpc1788_Lcd_Init();        /* 3õê¼»ˉLCD */
  18.         LCD_test();                /* LCD2aêÔ */
  19.         SysTick_Init();
  20.         exfuns_init();                        //ÎafatfsÏà1رäá¿éêÇëÄú′æ         
  21.         fs_test();        /*FatFsÎļtÏμí32aêÔ*/
  22.         if(updata_num==1) {LCD_ShowString(10,218,608,16,16,"Updata APP SUECCED!");updata_num=0;Boot();}
  23.         else              {LCD_ShowString(10,218,608,16,16,"Have not Updata APP!");        Boot();}  
  24.         while(1);
  25. }
点赞  2015-3-17 17:48
实在硬件错误一定是堆栈问题,死在中断,可能是重映射问题。
我的博客
点赞  2015-3-17 17:52
引用: zhaojun_xf 发表于 2015-3-17 17:52
实在硬件错误一定是堆栈问题,死在中断,可能是重映射问题。

重映射是这样吗:
SCB->VTOR = APP_START_SECTOR & 0x1FFFFF80;?

#define        APP_START_SECTOR        0x0000A000
点赞  2015-3-17 17:54
NVIC_SetVectorTable(DC_BOOT_SADDR, DC_BOOT_SIZE);                           // 中断向量重映射
我的博客
点赞  2015-3-17 17:55
引用: zhaojun_xf 发表于 2015-3-17 17:55
NVIC_SetVectorTable(DC_BOOT_SADDR, DC_BOOT_SIZE);                           // 中断向量重映射
这是STM32上的,有用的也是SCB->VTOR = NVIC_VectTab|(Offset & (u32)0x1FFFFF80);//设置NVIC 的向量表偏移寄
1788库函数找不到NVIC_VectTab,我看到有个网友写的1768的IAP,就是SCB->VTOR = APP_START_SECTOR & 0x1FFFFF80;这么写的




  • 捕获.PNG
点赞  2015-3-17 18:03
哦,对了,不好意思,拷贝成STM32了。
我的博客
点赞  2015-3-17 19:46
引用: zhaojun_xf 发表于 2015-3-17 19:46
哦,对了,不好意思,拷贝成STM32了。



请问堆栈不够怎么解决呢?
点赞  2015-3-18 10:43
通过编译器设置啊。
我的博客
点赞  2015-3-18 11:48
引用: zhaojun_xf 发表于 2015-3-18 11:48
通过编译器设置啊。

Stack_Size      EQU     0x0000E200

Heap_Size       EQU     0x0000E200这貌似是最大了。。



点赞  2015-3-18 18:08
错了,你这样栈基本为0,而堆为最大值
我的博客
点赞  2015-3-18 19:48
结贴:我把问题写在自己空间上了http://user.qzone.qq.com/573447508/2
点赞  2015-5-5 22:15
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复