久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 4727|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

LPC1778的IAP編程源碼

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:311811 發(fā)表于 2018-4-26 09:38 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
最近在做一個(gè)LPC1778的遠(yuǎn)程燒寫(xiě),應(yīng)用到了IAP編程,所以分享一下。

單片機(jī)源程序如下:
  1. #include "IAP.h"

  2. /*********************************************************************************************************
  3.   宏定義
  4. *********************************************************************************************************/

  5.                                                                            
  6. #define IAP_ENTER_ADR   0x1FFF1FF1                                      /* IAP入口地址定義              */

  7. #if defined   ( __CC_ARM   )
  8. __align(4)        INT8U            GucIapTmp[1024];                                                            /* 定義4K空間,編程Flash時(shí)使用  */                          
  9. #elif defined ( __ICCARM__ )
  10. #pragma pack(push)
  11. #pragma pack(4)
  12. INT8U            GucIapTmp[1024];       
  13. #pragma pack(pop)
  14. #endif                          

  15. /*
  16. *  定義CCLK值大小,單位為KHz
  17. */
  18. #define  IAP_FCCLK            (96000)
  19. #define  IAP_ENTER_ADR        0x1FFF1FF1                                  /* IAP入口地址定義              */

  20. /*
  21. *  定義函數(shù)指針  
  22. */
  23. void (*IAP_Entry) (INT32U param_tab[], INT32U result_tab[]);

  24. INT32U  paramin[8];                                                     /* IAP入口參數(shù)緩沖區(qū)            */
  25. INT32U  paramout[8];

  26. #define     UARTBPS     9600                                            /* 串口通信波特率               */
  27. volatile    INT8U       GucRcvOver;                                                        /* 接收完成標(biāo)志 1:表示完成     */
  28. volatile    INT32U      GulRcvCount;                                                                    /* 接收字節(jié)數(shù)                                        */

  29. INT32U                  *GpulFlagPoint   = (INT32U *)UserFlag;                                                /* 用戶(hù)程序標(biāo)志指針                                */

  30. INT32U                  *pSECTORADDL1   = (INT32U *)SECTORADDL1;                                        /* 用戶(hù)程序標(biāo)志指針                                */
  31. INT32U                  *pSECTORADDL2   = (INT32U *)SECTORADDL2;                                        /* 用戶(hù)程序標(biāo)志指針                                */
  32. INT32U                  *pSECTORADDL3   = (INT32U *)SECTORADDL3;                                        /* 用戶(hù)程序標(biāo)志指針                                */

  33. INT32U                  *pSECTORADDH1   = (INT32U *)SECTORADDH1;                                        /* 用戶(hù)程序標(biāo)志指針                                */
  34. INT32U                  *pSECTORADDH2   = (INT32U *)SECTORADDH2;                                        /* 用戶(hù)程序標(biāo)志指針                                */
  35. INT32U                  *pSECTORADDH3   = (INT32U *)SECTORADDH3;                                        /* 用戶(hù)程序標(biāo)志指針                                */

  36.                                                    /* IAP出口參數(shù)緩沖區(qū)            */

  37. /*********************************************************************************************************
  38. ** Function name:       sectorPrepare
  39. ** Descriptions:        IAP操作扇區(qū)選擇,命令代碼50
  40. ** input parameters:    sec1:           起始扇區(qū)
  41. **                      sec2:           終止扇區(qū)
  42. ** output parameters:   paramout[0]:    IAP操作狀態(tài)碼,IAP返回值     
  43. ** Returned value:      paramout[0]:    IAP操作狀態(tài)碼,IAP返回值                     
  44. *********************************************************************************************************/
  45. INT32U  sectorPrepare (INT8U sec1, INT8U sec2)
  46. {  
  47.     paramin[0] = IAP_Prepare;                                           /* 設(shè)置命令字                   */
  48.     paramin[1] = sec1;                                                  /* 設(shè)置參數(shù)                     */
  49.     paramin[2] = sec2;                           
  50.     (*IAP_Entry)(paramin, paramout);                                    /* 調(diào)用IAP服務(wù)程序              */
  51.    
  52.     return (paramout[0]);                                               /* 返回狀態(tài)碼                   */
  53. }

  54. /*********************************************************************************************************
  55. ** Function name:       ramCopy
  56. ** Descriptions:        復(fù)制RAM的數(shù)據(jù)到FLASH,命令代碼51
  57. ** input parameters:    dst:            目標(biāo)地址,即FLASH起始地址。以512字節(jié)為分界
  58. **                      src:            源地址,即RAM地址。地址必須字對(duì)齊
  59. **                      no:             復(fù)制字節(jié)個(gè)數(shù),為512/1024/4096/8192
  60. ** output parameters:   paramout[0]:    IAP操作狀態(tài)碼,IAP返回值     
  61. ** Returned value:      paramout[0]:    IAP操作狀態(tài)碼,IAP返回值                     
  62. *********************************************************************************************************/
  63. INT32U  ramToFlash (INT32U dst, INT32U src, INT32U no)
  64. {  
  65.     paramin[0] = IAP_RAMTOFLASH;                                        /* 設(shè)置命令字                   */
  66.     paramin[1] = dst;                                                   /* 設(shè)置參數(shù)                     */
  67.     paramin[2] = src;
  68.     paramin[3] = no;
  69.     paramin[4] = IAP_FCCLK;
  70.     (*IAP_Entry)(paramin, paramout);                                    /* 調(diào)用IAP服務(wù)程序              */
  71.    
  72.     return (paramout[0]);                                               /* 返回狀態(tài)碼                   */
  73. }

  74. /*********************************************************************************************************
  75. ** Function name:       sectorErase
  76. ** Descriptions:        扇區(qū)擦除,命令代碼52
  77. ** input parameters:    sec1            起始扇區(qū)
  78. **                      sec2            終止扇區(qū)92
  79. ** output parameters:   paramout[0]:    IAP操作狀態(tài)碼,IAP返回值
  80. ** Returned value:      paramout[0]:    IAP操作狀態(tài)碼,IAP返回值                     
  81. *********************************************************************************************************/
  82. INT32U  sectorErase (INT8U sec1, INT8U sec2)
  83. {  
  84.     paramin[0] = IAP_ERASESECTOR;                                       /* 設(shè)置命令字                   */
  85.     paramin[1] = sec1;                                                  /* 設(shè)置參數(shù)                     */
  86.     paramin[2] = sec2;
  87.     paramin[3] = IAP_FCCLK;
  88.     (*IAP_Entry)(paramin, paramout);                                    /* 調(diào)用IAP服務(wù)程序              */
  89.    
  90.     return (paramout[0]);                                               /* 返回狀態(tài)碼                   */
  91. }

  92. /*********************************************************************************************************
  93. ** Function name:       blankChk
  94. ** Descriptions:        扇區(qū)查空,命令代碼53
  95. ** input parameters:    sec1:           起始扇區(qū)
  96. **                      sec2:           終止扇區(qū)92
  97. ** output parameters:   paramout[0]:    IAP操作狀態(tài)碼,IAP返回值
  98. ** Returned value:      paramout[0]:    IAP操作狀態(tài)碼,IAP返回值                     
  99. *********************************************************************************************************/
  100. INT32U  blankChk (INT8U sec1, INT8U sec2)
  101. {  
  102.     paramin[0] = IAP_BLANKCHK;                                          /* 設(shè)置命令字                   */
  103.     paramin[1] = sec1;                                                  /* 設(shè)置參數(shù)                     */
  104.     paramin[2] = sec2;
  105.     (*IAP_Entry)(paramin, paramout);                                    /* 調(diào)用IAP服務(wù)程序              */

  106.     return (paramout[0]);                                               /* 返回狀態(tài)碼                   */
  107. }

  108. /*********************************************************************************************************
  109. ** Function name:       parIdRead
  110. ** Descriptions:        扇區(qū)查空,命令代碼54
  111. ** input parameters:    無(wú)
  112. ** output parameters:   paramout[0]:    IAP操作狀態(tài)碼,IAP返回值
  113. ** Returned value:      paramout[0]:    IAP操作狀態(tài)碼,IAP返回值                     
  114. *********************************************************************************************************/
  115. INT32U  parIdRead (void)
  116. {  
  117.     paramin[0] = IAP_READPARTID;                                        /* 設(shè)置命令字                   */
  118.     (*IAP_Entry)(paramin, paramout);                                    /* 調(diào)用IAP服務(wù)程序              */

  119.     return (paramout[0]);                                               /* 返回狀態(tài)碼                   */
  120. }

  121. /*********************************************************************************************************
  122. ** Function name:       codeIdBoot
  123. ** Descriptions:        扇區(qū)查空,命令代碼55
  124. ** input parameters:    無(wú)
  125. ** output parameters:   paramout[0]:    IAP操作狀態(tài)碼,IAP返回值
  126. ** Returned value:      paramout[0]:    IAP操作狀態(tài)碼,IAP返回值                     
  127. *********************************************************************************************************/
  128. INT32U  codeIdBoot (void)
  129. {  
  130.     paramin[0] = IAP_BOOTCODEID;                                        /* 設(shè)置命令字                   */
  131.     (*IAP_Entry)(paramin, paramout);                                    /* 調(diào)用IAP服務(wù)程序              */

  132.     return (paramout[0]);                                               /* 返回狀態(tài)碼                   */
  133. }

  134. /*********************************************************************************************************
  135. ** Function name:       dataCompare
  136. ** Descriptions:        校驗(yàn)數(shù)據(jù),命令代碼56
  137. ** input parameters:    dst:            目標(biāo)地址,即RAM/FLASH起始地址。地址必須字對(duì)齊
  138. **                      src:            源地址,即FLASH/RAM地址。地址必須字對(duì)齊
  139. **                      no:             復(fù)制字節(jié)個(gè)數(shù),必須能被4整除
  140. ** output parameters:   paramout[0]:    IAP操作狀態(tài)碼,IAP返回值
  141. ** Returned value:      paramout[0]:    IAP操作狀態(tài)碼,IAP返回值                     
  142. *********************************************************************************************************/
  143. INT32U  dataCompare (INT32U dst, INT32U src, INT32U no)
  144. {  
  145.     paramin[0] = IAP_COMPARE;                                           /* 設(shè)置命令字                   */
  146.     paramin[1] = dst;                                                   /* 設(shè)置參數(shù)                     */
  147.     paramin[2] = src;
  148.     paramin[3] = no;
  149.     (*IAP_Entry)(paramin, paramout);                                    /* 調(diào)用IAP服務(wù)程序              */

  150.     return (paramout[0]);                                               /* 返回狀態(tài)碼                   */
  151. }
  152. /*********************************************************************************************************
  153. ** Function name:            u16CRC_Calc16
  154. ** Descriptions:            crc16
  155. ** input parameters:    無(wú)
  156. ** output parameters:   無(wú)
  157. ** Returned value:      無(wú)
  158. *********************************************************************************************************/
  159. uint16_t u16CRC_Calc16(const uint8_t *pu8Data, int32_t i32Len)
  160. {
  161.         uint8_t i;
  162.         uint16_t u16CRC = 0;

  163.     while(--i32Len >= 0)
  164.     {
  165.             i = 8;
  166.             u16CRC = u16CRC ^ (((uint16_t)*pu8Data++) << 8);

  167.             do
  168.         {
  169.                     if (u16CRC & 0x8000)
  170.                     {
  171.                             u16CRC = u16CRC << 1 ^ 0x1021;
  172.                     }
  173.                     else
  174.                     {
  175.                             u16CRC = u16CRC << 1;
  176.                     }
  177.         }
  178.             while(--i);
  179.     }
  180.     return u16CRC;
  181. }
  182. /*********************************************************************************************************
  183. ** Function name:            PrepareUpdate
  184. ** Descriptions:            
  185. ** input parameters:    無(wú)
  186. ** output parameters:   無(wú)
  187. ** Returned value:      無(wú)
  188. *********************************************************************************************************/
  189. void PrepareUpdate (void )
  190. {
  191. #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
  192.     OS_CPU_SR  cpu_sr;
  193. #endif     
  194.         IAP_Entry = (void(*)())IAP_ENTER_ADR;
  195.         if (*GpulFlagPoint==LOWADD)                                                                                          /* 當(dāng)前程序運(yùn)行在LOW區(qū),需要     */
  196.         {                                                                                      /* 對(duì)HIGH區(qū)進(jìn)行升級(jí)                             */
  197.                 OS_ENTER_CRITICAL();
  198.                 sectorPrepare(SECTORSNH1, SECTORSNH3);                                    /* 選擇HIGH扇區(qū)                                         */
  199.                 sectorErase(SECTORSNH1, SECTORSNH3);                                    /* 擦除HIGH扇區(qū)                   */                                          
  200.                 OS_EXIT_CRITICAL();                                
  201.         }                                                                                                                                                 /* 當(dāng)前程序運(yùn)行在HIGH區(qū)或者固    */
  202.         else{                                                                                                                         /* 件區(qū),需要對(duì)LOW區(qū)進(jìn)行升級(jí)     */                                                        
  203.                 OS_ENTER_CRITICAL();
  204.                 sectorPrepare(SECTORSNL1, SECTORSNL3);                                    /* 選擇LOW扇區(qū)                                         */
  205.                 sectorErase(SECTORSNL1, SECTORSNL3);                                      /* 擦除LOW扇區(qū)                                         */
  206.                 OS_EXIT_CRITICAL();
  207.         }       
  208. }
  209. /*********************************************************************************************************
  210. ** Function name:            userFlagUpdate
  211. ** Descriptions:            更新用戶(hù)程序標(biāo)志區(qū)
  212. ** input parameters:    無(wú)
  213. ** output parameters:   無(wú)
  214. ** Returned value:      無(wú)
  215. *********************************************************************************************************/
  216. void  userFlagUpdate (void)
  217. {
  218. #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
  219.     OS_CPU_SR  cpu_sr;
  220. #endif     
  221.         INT32U  *pulDataPoint;                                                                                                         /* 更新用戶(hù)程序標(biāo)志空間                  */

  222.         memset(GucIapTmp, 0xff, 256);                                                                                        /* 臨時(shí)緩沖區(qū)清空                                */
  223.         pulDataPoint = (INT32U *)GucIapTmp;
  224.         if (*GpulFlagPoint==LOWADD){       
  225.                 *pulDataPoint=HIGHADD;
  226.         }
  227.         else{
  228.                 *pulDataPoint=LOWADD;
  229.         }       
  230.         OS_ENTER_CRITICAL();
  231.         sectorPrepare (SECTORFLAG, SECTORFLAG);                                                                        /* 扇區(qū)準(zhǔn)備                                                */
  232.         sectorErase (SECTORFLAG, SECTORFLAG);                                                                        /* 擦除扇區(qū)                                                */
  233.         sectorPrepare (SECTORFLAG, SECTORFLAG);                                                                        /* 選擇扇區(qū)                                                */
  234.         ramToFlash(UserFlag,(INT32U)GucIapTmp, 256);                                                        /* 編程FLASH                                        */
  235.         OS_EXIT_CRITICAL();
  236. }
  237. /*********************************************************************************************************
  238. ** Function name:            userDataProgram
  239. ** Descriptions:            
  240. ** input parameters:    無(wú)
  241. ** output parameters:   無(wú)
  242. ** Returned value:      無(wú)
  243. *********************************************************************************************************/
  244. void user(void)
  245. {       
  246.         defaultVectorHandle();
  247. }
  248. #define SECTORSIZE                (32*1024)                        //扇區(qū)大小
  249. /*********************************************************************************************************
  250. ** Function name:            userDataProgram
  251. ** Descriptions:            編程用戶(hù)代碼區(qū)
  252. ** input parameters:    無(wú)
  253. ** output parameters:   無(wú)
  254. ** Returned value:      無(wú)
  255. *********************************************************************************************************/
  256. uint8_t  userDataProgram (uint8_t *pdat)
  257. {
  258. #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
  259.     OS_CPU_SR  cpu_sr;
  260. #endif     
  261.         uint16_t        filedatcrc;
  262.         uint16_t fnum,fsn,flen;
  263. //        void (*userProgram)();                                                       /* 函數(shù)指針                                            */
  264.         uint16_t        NPS;
  265.        
  266. //        userProgram = (void (*)()) user;                                                /* 避免編譯警告                                        */
  267.         fnum = *pdat + *(pdat+1)*256;
  268.         fsn = *(pdat+2) + *(pdat+3)*256;
  269.         flen = *(pdat+4) + *(pdat+5)*256;               
  270.         if(fnum==0 && fsn==0 && flen==0){
  271.                 //ANDYDEBUG        20150805               
  272.                 sPTL_104_I_SND.Rson=0x0007;               
  273.                 //ANDYDEBUG        20150805       
  274.                
  275.                 PrepareUpdate();                       
  276.                 SysUpdateFsnBak = fsn;
  277.                 SysUpdateFlag = 1;                                                                         // 啟動(dòng)升級(jí)
  278.                 if (*GpulFlagPoint==LOWADD)
  279.                         return UPHI;
  280.                 else
  281.                         return UPLO;               
  282.         }
  283.         //ANDYDEBUG        20150805               
  284.         sPTL_104_I_SND.Rson=0x000A;               
  285.         //ANDYDEBUG        20150805       

  286.         if(SysUpdateFlag==0)                                                                         // 未啟動(dòng)升級(jí)
  287.                 return UPERR0;
  288.         if(fnum==fsn && flen==0 && fnum>0)        {                                        // 執(zhí)行升級(jí)程序
  289.                 userFlagUpdate();                                                                        // 升級(jí)扇區(qū)標(biāo)識(shí)
  290.                 zyReset(ZY_HARD_RESET);       
  291.                 return UPOK;
  292.         }
  293.         if(fnum==0 || fsn ==0 || fsn>fnum)                                                 // 序號(hào)排錯(cuò)
  294.                 return UPERR1;       

  295. #ifndef TP1C        
  296.         if (flen != 256 && flen != 512 && flen != 1024 )                   // 幀長(zhǎng)歸整
  297.         {         // 滿(mǎn)足編程字節(jié)數(shù)的要求,256、512、1024等
  298.                 if (flen < 256)
  299.                         flen = 256;                                       
  300.                 else if (flen < 512)
  301.                         flen = 512;
  302.                 else if (flen < 1024)
  303.                         flen = 1024;
  304.                 else
  305.                         return UPERR3;       
  306.         }
  307.         filedatcrc = u16CRC_Calc16(pdat+6,flen);                                  // CRC16校驗(yàn)
  308.         if(filedatcrc != (*(pdat+6+flen) + *(pdat+7+flen)*256))
  309.                 return UPERRcrc;
  310.         if(fsn!=SysUpdateFsnBak+1)                                                                // 幀順序校驗(yàn)
  311.                 return UPERR2;
  312.         SysUpdateFsnBak=fsn;
  313.     NPS= SECTORSIZE/flen;                                                                        // 單個(gè)扇區(qū)幀容量
  314.         memcpy(GucIapTmp,pdat+6,flen);                                                         // 寫(xiě)升級(jí)數(shù)據(jù)入緩存
  315. #else
  316.         if(flen != 128 && flen != 256 && flen != 512 && flen != 1024 )          
  317.         {         // 滿(mǎn)足編程字節(jié)數(shù)的要求,256、512、1024等                           // 幀長(zhǎng)歸整
  318.                 if (flen < 128)
  319.                         flen = 128;
  320.                 else if (flen < 256)
  321.                         flen = 256;                                       
  322.                 else if (flen < 512)
  323.                         flen = 512;
  324.                 else if (flen < 1024)
  325.                         flen = 1024;
  326.                 else
  327.                         return UPERR3;       
  328.         }
  329.         filedatcrc = u16CRC_Calc16(pdat+6,flen);                                  // CRC16校驗(yàn)
  330.         if(filedatcrc != (*(pdat+6+flen) + *(pdat+7+flen)*256))
  331.                 return UPERRcrc;
  332.         if(fsn!=SysUpdateFsnBak+1)                                                                // 幀順序校驗(yàn)
  333.                 return UPERR2;
  334.         SysUpdateFsnBak=fsn;
  335.         NPS= SECTORSIZE/flen;                                                                        // 單個(gè)扇區(qū)幀容量
  336.     if(flen==128){
  337.                 if(fsn%2){
  338.                         if(fsn<fnum){
  339.                                 memcpy(GucIapTmp,pdat+6,flen);                                 // 寫(xiě)升級(jí)數(shù)據(jù)入緩存
  340.                                 return UPOK;
  341.                         }
  342.                         else {
  343.                                 memcpy(GucIapTmp,pdat+6,flen);                                 // 寫(xiě)升級(jí)數(shù)據(jù)入緩存
  344.                                 memset(GucIapTmp+128,0xff,flen);                         // 結(jié)束幀補(bǔ)齊256字節(jié)
  345.                                 NPS/=2;
  346.                                 fsn/=2;
  347.                                 fsn++;
  348.                                 flen*=2;
  349.                         }
  350.                 }
  351.                 else {                       
  352.                         memcpy(GucIapTmp+128,pdat+6,flen);                                 // 寫(xiě)升級(jí)數(shù)據(jù)入緩存
  353.                         NPS/=2;
  354.                         fsn/=2;
  355.                         flen*=2;
  356.                 }       
  357.         }
  358.         else
  359.                 memcpy(GucIapTmp,pdat+6,flen);                                                 // 寫(xiě)升級(jí)數(shù)據(jù)入緩存
  360. #endif

  361.         if (*GpulFlagPoint==LOWADD)                                                             /* 當(dāng)前程序運(yùn)行在LOW區(qū),需要   */
  362.         {                                                                            /* 對(duì)HIGH區(qū)進(jìn)行升級(jí)              */
  363.     OS_ENTER_CRITICAL();
  364.                 if(fsn>0 && fsn<=NPS){
  365.                         sectorPrepare(SECTORSNH1, SECTORSNH1);                                                                        /* 準(zhǔn)備HIGH扇區(qū)                              */
  366.                         ramToFlash(SECTORADDH1 + (fsn-1)*flen,(INT32U)GucIapTmp, flen);                        /* 寫(xiě)數(shù)據(jù)到FLASH                         */
  367.                         if(CMD_SUCCESS != dataCompare((INT32U)GucIapTmp,SECTORADDH1+(fsn-1)*flen,flen))
  368.                                 return UPERRwrt;
  369.                 }                                                                                                                                                               
  370.                 if(fsn>NPS && fsn<=NPS*2){
  371.                         sectorPrepare(SECTORSNH2, SECTORSNH2);
  372.                         ramToFlash(SECTORADDH2 + (fsn-NPS-1)*flen,(INT32U)GucIapTmp, flen);
  373.                         if(CMD_SUCCESS != dataCompare((INT32U)GucIapTmp,SECTORADDH2+(fsn-NPS-1)*flen,flen))
  374.                                 return UPERRwrt;
  375.                 }                                                                          
  376.                 if(fsn>NPS*2 && fsn<=NPS*3){
  377.                         sectorPrepare(SECTORSNH3, SECTORSNH3);
  378.                         ramToFlash(SECTORADDH3 + (fsn-NPS*2-1)*flen,(INT32U)GucIapTmp, flen);
  379.                         if(CMD_SUCCESS != dataCompare((INT32U)GucIapTmp,SECTORADDH3+(fsn-NPS*2-1)*flen, flen))
  380.                                 return UPERRwrt;
  381.                 }                                                      
  382.     OS_EXIT_CRITICAL();
  383.         }
  384.         else                                                                                                           /* 當(dāng)前程序運(yùn)行在HIGH區(qū),需要    */
  385.         {                                                                    /* 對(duì)LOW區(qū)進(jìn)行升級(jí)             */         
  386.     OS_ENTER_CRITICAL();
  387.                 if(fsn>0 && fsn<=NPS){
  388.                         sectorPrepare(SECTORSNL1, SECTORSNL1);                                                                        /* 準(zhǔn)備LOW扇區(qū)                              */
  389.                         ramToFlash(SECTORADDL1 + (fsn-1)*flen,(INT32U)GucIapTmp, flen);                        /* 寫(xiě)數(shù)據(jù)到FLASH                         */
  390.                         if(CMD_SUCCESS != dataCompare((INT32U)GucIapTmp,SECTORADDL1+(fsn-1)*flen,flen))
  391.                                 return UPERRwrt;
  392.                 }                                                                                                                       
  393.                 if(fsn>NPS && fsn<=NPS*2){
  394.                         sectorPrepare(SECTORSNL2, SECTORSNL2);
  395.                         ramToFlash(SECTORADDL2 + (fsn-NPS-1) * flen,(INT32U)GucIapTmp, flen);
  396.                         if(CMD_SUCCESS != dataCompare((INT32U)GucIapTmp,SECTORADDL2+(fsn-NPS-1)*flen,flen))
  397.                                 return UPERRwrt;
  398.                 }                                                                          
  399.                 if(fsn>NPS*2 && fsn<=NPS*3){
  400.                         sectorPrepare(SECTORSNL3, SECTORSNL3);
  401.                         ramToFlash(SECTORADDL3 + (fsn-NPS*2-1)*flen,(INT32U)GucIapTmp, flen);
  402.                         if(CMD_SUCCESS != dataCompare((INT32U)GucIapTmp,SECTORADDL3+(fsn-NPS*2-1)*flen,flen))
  403.                                 return UPERRwrt;
  404.                 }                                                                                                             
  405.     OS_EXIT_CRITICAL();
  406.         }
  407.         return UPOK;
  408. }


  409. /*********************************************************************************************************
  410. ** Function name:           zyReset
  411. ** Descriptions:            系統(tǒng)復(fù)位
  412. ** input parameters:        uiMode: ZY_POWER_RESET: 上電復(fù)位
  413. **                                  ZY_HARD_RESET:  硬件復(fù)位
  414. **                                  ZY_SOFT_RESET:  軟件復(fù)位
  415. **                                  其它:           與系統(tǒng)相關(guān)
  416. ** output parameters:       none
  417. ** Returned value:          none
  418. ** Created by:              Chenmingji
  419. ** Created Date:            2009-07-23
  420. **--------------------------------------------------------------------------------------------------------
  421. ** Modified by:
  422. ** Modified date:
  423. *********************************************************************************************************/
  424. void zyReset (unsigned int uiMode)
  425. {
  426.     switch (uiMode) {

  427.     case ZY_POWER_RESET:                                                /*  此系統(tǒng)上電復(fù)位等同硬件復(fù)位   */

  428. #if 0
  429.         break;
  430. #endif                                                                  /*  0                           */

  431.     case ZY_HARD_RESET:
  432.         //changeToSYSMode();
  433.         //AITCR = (0x05fa << 16) + 4;
  434.                 wdt_entry();
  435.         break;

  436.     case ZY_SOFT_RESET:
  437.         //changeToSYSMode();
  438.         //AITCR = (0x05fa << 16) + 1;
  439.                 wdt_entry();
  440.         break;
  441.    
  442.     default:                                                            /*  參數(shù)不正確不復(fù)位            */
  443.         break;
  444.     }
  445. }

  446. /*********************************************************************************************************
  447. ** Function name:           defaultVectorHandle
  448. ** Descriptions:            ????????
  449. ** input parameters:        none
  450. ** output parameters:       none
  451. ** Returned value:          none
  452. *********************************************************************************************************/
  453. void defaultVectorHandle (void)
  454. {
  455. #ifdef DEBUG
  456.     while (1);
  457. #else
  458.     zyReset(ZY_HARD_RESET);
  459. #endif                                                                  /*  DEBUG                       */
  460. }


  461. /*********************************************************************************************************
  462.   End Of File
  463. *********************************************************************************************************/

復(fù)制代碼

所有資料51hei提供下載:
LPC1778 IAP燒寫(xiě)源碼.docx (23.1 KB, 下載次數(shù): 20)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 春色av| 一本一道久久a久久精品蜜桃 | 成人亚洲网站 | 91精品国产91久久久久久丝袜 | 在线看片福利 | 1000部精品久久久久久久久 | 午夜精品一区二区三区在线观看 | 五十女人一级毛片 | 成人久草 | 狠狠天天 | 久久精品视频在线观看 | 国产成人99久久亚洲综合精品 | 欧美中文一区 | 国产午夜精品一区二区三区在线观看 | 亚洲成人一区二区三区 | 欧美三区视频 | 国产成人区 | 国产欧美精品在线 | 久久久国产精品一区 | 久久久婷 | 欧美精品在线播放 | 成人黄色三级毛片 | 一级h片| 国产精品高潮呻吟久久aⅴ码 | 999免费视频 | 久久精品超碰 | 国产视频第一页 | 欧美手机在线 | 国产精品污www一区二区三区 | 日日噜 | 9久久| 国产精品久久久久久久岛一牛影视 | 日韩av电影院 | 成人不卡 | 午夜天堂精品久久久久 | 久久久久久免费毛片精品 | 国产日韩久久久久69影院 | 久久久久久国产精品免费免费狐狸 | 亚洲va在线va天堂va狼色在线 | 日本一区二区三区在线观看 | 国产精品日韩欧美一区二区三区 |