搜索
bottom↓
回复: 14

LPC1788 IAP 升级带ucos的APP程序失败

[复制链接]

出0入4汤圆

发表于 2015-3-17 12:21:19 | 显示全部楼层 |阅读模式
升级一些简单的代码比如LCD、串口中断程序等是没问题的,SD卡的FATFS例程就不能初始化SD卡了,带ucos的APP直接跳转不过去(MCU重启)

  1. __asm void JMP_Boot( uint32_t address )//
  2. {
  3.    LDR SP, [R0]                ;Load new stack pointer address
  4.    LDR PC, [R0, #4]        ;Load new program counter address
  5. }
  6. void Boot( void )  
  7. {
  8.         SCB->VTOR = APP_START_SECTOR & 0x1FFFFFFF;        //
  9.         JMP_Boot(APP_START_SECTOR);
  10. }
复制代码

以上是重映射和跳转代码

出0入0汤圆

发表于 2015-3-17 17:19:56 | 显示全部楼层
这段代码好像有点不是太合适,和配置也有关系

出0入4汤圆

 楼主| 发表于 2015-3-17 17:33:37 | 显示全部楼层
starting 发表于 2015-3-17 17:19
这段代码好像有点不是太合适,和配置也有关系

可以说下哪里不合适吗

出0入0汤圆

发表于 2015-3-17 17:44:54 | 显示全部楼层
从这些信息是看不出来太多的0x1FFFFFFF地址已经是512K的最结尾了

出0入4汤圆

 楼主| 发表于 2015-3-17 17:50:55 | 显示全部楼层
starting 发表于 2015-3-17 17:44
从这些信息是看不出来太多的0x1FFFFFFF地址已经是512K的最结尾了

0x1FFFFFFF是根据手册上写的,之前写的是0x1FFFFF80没有用,改成了0x1FFFFFFF看看行不行的,

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入4汤圆

 楼主| 发表于 2015-3-17 17:52:03 | 显示全部楼层
  1. #define        APP_START_SECTOR        0x0000A000        /* Sector 16 Ó¦ÓóÌÐòµØÖ· */
  2. #define        APP_END_SECTOR                0x0003FFFF        /* Sector 20 */
复制代码
  1. __asm void JMP_Boot( uint32_t address )//address Ó¦ÓóÌÐòµØÖ·  /* Descriptions:        Ìøתµ½Ó¦ÓóÌÐò*/
  2. {
  3.    LDR SP, [R0]                ;Load new stack pointer address
  4.    LDR PC, [R0, #4]        ;Load new program counter address
  5. }
  6. void Boot( void )/* Descriptions:        Ìøתµ½Ó¦ÓóÌÐò*/
  7. {
  8.         SCB->VTOR = APP_START_SECTOR & 0x1FFFFFFF;        //ÐÞ¸ÄÖжÏÏòÁ¿±í
  9.         JMP_Boot(APP_START_SECTOR);
  10. }
  11. int main(void)
  12. {
  13.         CLKPWR_ConfigPPWR(CLKPWR_PCONP_PCGPIO, ENABLE);        /* ´ò¿ªGPIOÍâÉèµçÔ´£¬ÉϵçºóGPIOµçԴĬÈÏÊÇ´ò¿ªµÄ£¬´ËÐпÉÈ¥µô */
  14.         lpc1788_Uart_Init(0);                printf("uart0 init success!\n\r");/* ³õʼ»¯´®¿ÚUart0 */       
  15.         lpc1788_SDRAM_Init();        /* ³õʼ»¯SDRAM */
  16.         lpc1788_Lcd_Init();        /* ³õʼ»¯LCD */
  17.         LCD_test();                /* LCD²âÊÔ */
  18.         SysTick_Init();
  19.         exfuns_init();                        //ΪfatfsÏà¹Ø±äÁ¿ÉêÇëÄÚ´æ         
  20.         fs_test();        /*FatFsÎļþϵͳ²âÊÔ*/
  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();}  
  23.         while(1);
  24. }
复制代码

出0入4汤圆

 楼主| 发表于 2015-3-17 17:52:34 | 显示全部楼层
  1.         FRESULT res;
  2.         FRESULT ceshi;
  3.         char folder[255] = "";
  4.         uint32_t addr,ii;
  5.         uint32_t u32Status;
  6.         res = (FRESULT)SD_Init();
  7.         if(res == FALSE)
  8.   {
  9.     printf("sd init error.\n\r");
  10.                 LCD_ShowString(10,26,200,16,16,"Has no SD found!");
  11.   }
  12.   else
  13.         {
  14.                 LCD_ShowString(10,26,608,16,16,"Press any key to updata system in 3S:");
  15. //                         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;}
  16. //                         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;}
  17. //                         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;}
  18. //                         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;}
  19. //                         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;}
  20. //                         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;}
  21. //                         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;}
  22.                         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;}
  23.                         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;}
  24.                         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;}
  25.                         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;}
  26.       return;
  27. updata_APP:
  28.                                 updata_num=1;
  29.                                 SystemCoreClockUpdate();
  30.                                
  31.                                 LCD_ShowString(10,42,200,16,16,"Updata APP:");LCD_FillRectangle (LCD_PANEL_UPPER,176,376,42,58,skyblue);
  32.                                 res = f_mount(&fs,"0:", 1);
  33.                                 if(res != FR_OK){printf("f_mount error = %d\n\r",res);}
  34.                                
  35.                                 ceshi=f_open (&file, "UNIGBK.BIN", FA_READ);  RES_FALT(ceshi);
  36.                                 SIZE_UNIGBK=file.fsize;
  37.                                 printf("\n UNIGBK.BIN ÎļþËùÕ¼´óС£º%d×Ö½Ú \n",file.fsize);
  38.                                 ceshi=f_read(&file, UNIGBK, SIZE_UNIGBK, &br);        RES_FALT(ceshi);
  39.                                 printf("\nbr µÄÖµ£º%d\n",br);printf("\n");
  40.                                 f_close(&file);br=0;//////////////////////////////////////////////¹Ø±ÕÎļþ
  41.                                 LCD_FillRectangle (LCD_PANEL_UPPER,176,186,42,58,NavyBlue);
  42.                                
  43.                                 scan_files(folder);        //±éÀúSD¿¨Îļþ
  44.                                 LCD_FillRectangle (LCD_PANEL_UPPER,186,190,42,58,NavyBlue);
  45.                                
  46.                                 SysTick->CTRL=0;//¹Øµôϵͳ¶¨Ê±Æ÷·ÀÖ¹Ó°ÏìºóÃæ²Á³ý²Ù×÷       
  47.                                 NVIC_DisableIRQ(UART0_IRQn);               
  48.                                 if ((u32IAP_PrepareSectors(10, 21) == IAP_STA_CMD_SUCCESS) &&(u32IAP_EraseSectors  (10, 21) == IAP_STA_CMD_SUCCESS))
  49.                                 {LCD_ShowString(10,58,200,16,16,"Erase Done!"); LCD_FillRectangle (LCD_PANEL_UPPER,190,200,42,58,NavyBlue);}
  50.                                 else {LCD_ShowString(10,58,200,16,16,"Erase FAILED!");return;}
  51.                
  52.                                 ceshi=f_open (&file, "APP.bin", FA_READ);  RES_FALT(ceshi);
  53.                                 printf("\n APP.binÎļþËùÕ¼´óС£º%d×Ö½Ú \n\r",file.fsize);addr=0;
  54.                                 for(ii=0;ii<((file.fsize)/512+1);ii++)
  55.                                 {
  56.                                         ceshi = f_read(&file, APP_CODE_ADDR, 512, &br); RES_FALT(ceshi);
  57.                                         NVIC_DisableIRQ(DMA_IRQn);       
  58.                                         if ((ceshi == FR_OK) || (br == 512))
  59.                                         {
  60.                                                  printf("\n %d ",br);
  61.                                                  u32Status=u32IAP_PrepareSectors(10, 21);printf(" PrepareSectors:%d ",u32Status);
  62.                                                  u32Status=u32IAP_CopyRAMToFlash(APP_START_SECTOR+addr,(uint32_t)APP_CODE_ADDR,512);printf(" CopyRAMToFlash:%d \n\r",u32Status);
  63.                                                  addr += 512;
  64.                                                  LCD_FillRectangle (LCD_PANEL_UPPER,200,200+ii*176/((file.fsize)/512),42,58,NavyBlue);
  65.                                         }
  66.                                         NVIC_EnableIRQ(DMA_IRQn);       
  67.                                  }f_close(&file);br=0;
  68.                                  //SysTick_Init();NVIC_EnableIRQ(UART0_IRQn);
  69.                                 // NVIC_DisableIRQ(DMA_IRQn);       
  70.   }
  71.         return;
  72. }
复制代码

出0入4汤圆

 楼主| 发表于 2015-3-17 17:52:53 | 显示全部楼层
starting 发表于 2015-3-17 17:44
从这些信息是看不出来太多的0x1FFFFFFF地址已经是512K的最结尾了

如上是代码

出0入4汤圆

 楼主| 发表于 2015-3-18 10:42:48 | 显示全部楼层
starting 发表于 2015-3-17 17:44
从这些信息是看不出来太多的0x1FFFFFFF地址已经是512K的最结尾了

按照NXP官方的AN11333.pdf看来还是跟所有的M3一样是0x1FFFFF80,不过感觉问题不在这

出0入0汤圆

发表于 2015-3-18 10:49:29 | 显示全部楼层
suebillt 发表于 2015-3-18 10:42
按照NXP官方的AN11333.pdf看来还是跟所有的M3一样是0x1FFFFF80,不过感觉问题不在这 ...

这个完整的方案还是蛮复杂的。不是一下就能说明白的

出0入4汤圆

 楼主| 发表于 2015-5-5 22:15:51 | 显示全部楼层
结贴:我把问题写在自己空间上了http://user.qzone.qq.com/573447508/2

出0入0汤圆

发表于 2015-5-21 21:45:37 | 显示全部楼层
先看看,准备学习。谢谢

出0入0汤圆

发表于 2015-6-3 12:47:21 | 显示全部楼层
问题解决了吗?看看是不是初始化的时候把中断向量表又映射到其他地方了?这个问题我遇到过。

出0入4汤圆

 楼主| 发表于 2015-6-3 16:57:29 | 显示全部楼层
ShiDongLiang 发表于 2015-6-3 12:47
问题解决了吗?看看是不是初始化的时候把中断向量表又映射到其他地方了?这个问题我遇到过。 ...

解决了。。看我另一个贴子

出0入0汤圆

发表于 2015-6-4 15:20:50 | 显示全部楼层
请问下,APP只能下载到编译的指定地址运行吗,比如说我编译的APP程序起始地址在0x0801 0000,这个APP只能下载到0x0801 0000运行吗
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 09:27

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表