[技术问答] 关于ISP、IAP中LDROM问题咨询

[复制链接]
3041|10
 楼主| 21icszx 发表于 2017-2-17 17:15 | 显示全部楼层 |阅读模式
本帖最后由 21icszx 于 2017-2-17 17:18 编辑

使用ISP方式给芯片编程时,芯片内的ISP固件位于LDROM区; 使用IAP方式用户程序自编程时,自编程的代码也位于LDROM区。
问题1:芯片出厂时是不是在LDROM区已经烧写了ISP固件代码?
问题2:IAP编程时,将IAP自编程代码下载到LDROM,是不是已经将出厂时厂家烧写的ISP固件代码覆盖了?也就是说此时芯片已经无法支持ISP编程了?
问题3:如果想再次使用ISP编程方式,是不是需要采用ICP方式将ISP固件代码重新烧写到LDROM区?


wahahaheihei 发表于 2017-2-17 20:00 | 显示全部楼层
官方说有那三种编程的功能,肯定是在出厂时候已经固化了支持这三种编程方式的固件代码了。
yiyigirl2014 发表于 2017-2-17 20:51 | 显示全部楼层
应该不用重新烧录吧,可以看看手册上怎么描述这个问题的。
yiyigirl2014 发表于 2017-2-17 20:54 | 显示全部楼层
给你点例程序看看。这些一般是51内核的新唐都支持的。
  1. /*---------------------------------------------------------------------------------------------------------*/
  2. /*                                                                                                         */
  3. /* Copyright(c) 2015 Nuvoton Technology Corp. All rights reserved.                                         */
  4. /*                                                                                                         */
  5. /*---------------------------------------------------------------------------------------------------------*/

  6. //***********************************************************************************************************
  7. //  Nuvoton Technoledge Corp.
  8. //  Website: http://www.nuvoton.com
  9. //  E-Mail : MicroC-8bit@nuvoton.com
  10. //  Date   : Apr/21/2015
  11. //***********************************************************************************************************

  12. //***********************************************************************************************************
  13. //  File Function: N76E885 APROM program APROM demo code
  14. //***********************************************************************************************************

  15. #include <stdio.h>
  16. #include "N76E885.h"
  17. #include "Version.h"
  18. #include "Typedef.h"
  19. #include "Define.h"
  20. #include "SFR_Macro.h"
  21. #include "Common.h"
  22. #include "Delay.h"

  23. /*
  24. //-------- <<< Use Configuration Wizard in Context Menu >>> ------------------
  25. //
  26. ////<e0> System Clock Source Configuration
  27. // <o1> System Clock Source Selection
  28. //      <0=> 2~25MHz    XTAL
  29. //      <1=> 32.768KHz  XTAL
  30. //      <2=> 22.1184MHz Internal
  31. //      <3=> 10KHz      Internal
  32. //      <4=> OSC-In     External
  33. //</e>
  34. //
  35. //<e2> Clock Divider Configuration
  36. //     <o3.0..7>  System Clock Source Devider <1-255>
  37. //                     <i> Fsys = (System Clock Source) / (2 * Devider)
  38. //</e>
  39. //
  40. //-------- <<< end of configuration section >>> ------------------------------
  41. */

  42. #define     SYS_CLK_EN          0
  43. #define     SYS_SEL             2
  44. #define     SYS_DIV_EN          0                   //0: Fsys=Fosc, 1: Fsys = Fosc/(2*CKDIV)
  45. #define     SYS_DIV             1

  46. #define     CID_READ            0x0B
  47. #define     DID_READ            0x0C
  48. #define     CFG_READ            0xC0
  49. #define     CFG_ERASE           0xE2

  50. #define     PAGE_ERASE_AP       0x22
  51. #define     BYTE_READ_AP        0x00
  52. #define     BYTE_PROGRAM_AP     0x21

  53. #define     BYTE_PROGRAM_CFG    0xE1
  54. #define     BYTE_READ_CFG       0xC0

  55. #define     PAGE_SIZE           128

  56. #define     DATA_SIZE           4096   
  57. #define     DATA_START_ADDR     0x3800 //(0x4800-0x1000)

  58. #define     ERASE_FAIL          0x70
  59. #define     PROGRAM_FAIL        0x71
  60. #define     IAPFF_FAIL          0x72
  61. #define     IAP_PASS            0x00

  62. #define     DISPLAY_LED         P3
  63. bit BIT_TMP;

  64. //-----------------------------------------------------------------------------------------------------------
  65. void Enable_IAP_Mode(void)
  66. {   
  67.     set_IAPEN;
  68. }
  69. //-----------------------------------------------------------------------------------------------------------
  70. void Disable_IAP_Mode(void)
  71. {   
  72.     clr_IAPEN;
  73. }
  74. //-----------------------------------------------------------------------------------------------------------
  75. void Trigger_IAP(void)
  76. {   
  77.     set_IAPGO;                                  //trigger IAP
  78.     if((CHPCON&SET_BIT6)==SET_BIT6)             //check IAPFF (CHPCON.6)
  79.     {
  80.         DISPLAY_LED = IAPFF_FAIL;
  81.         printf ("\n*  IAPFF = 1.");
  82.         while(1);
  83.     }
  84. }
  85. //-----------------------------------------------------------------------------------------------------------
  86. void ID_Read(UINT8 *pu8CID,UINT8 *pu8DID0,UINT8 *pu8DID1)
  87. {   
  88.     Enable_IAP_Mode();

  89.     //Read CID
  90.     IAPAL = 0x00;
  91.     IAPAH = 0x00;
  92.     IAPCN = CID_READ;
  93.     Trigger_IAP();
  94.    
  95.     *pu8CID = IAPFD;

  96.     //Read DID0
  97.     IAPCN = DID_READ;
  98.     Trigger_IAP();
  99.     *pu8DID0 = IAPFD;

  100.     //Read DID1
  101.     IAPAL ++;
  102.     IAPCN = DID_READ;
  103.     Trigger_IAP();
  104.     *pu8DID1 = IAPFD;

  105.     Disable_IAP_Mode();
  106. }
  107. //-----------------------------------------------------------------------------------------------------------
  108. void CONFIG_Read(UINT8 *pu8CFG0,UINT8 *pu8CFG1,UINT8 *pu8CFG2,UINT8 *pu8CFG3,UINT8 *pu8CFG4)
  109. {   
  110.     Enable_IAP_Mode();

  111.     //Read CONFIG0
  112.     IAPAL = 0x00;
  113.     IAPAH = 0x00;
  114.     IAPCN = CFG_READ;
  115.     Trigger_IAP();
  116.     *pu8CFG0 = IAPFD;

  117.     //Read CONFIG1
  118.     IAPAL ++;
  119.     IAPCN = CFG_READ;
  120.     Trigger_IAP();
  121.     *pu8CFG1 = IAPFD;

  122.     //Read CONFIG2
  123.     IAPAL ++;
  124.     IAPCN = CFG_READ;
  125.     Trigger_IAP();
  126.     *pu8CFG2 = IAPFD;

  127.     //Read CONFIG3
  128.     IAPAL ++;
  129.     IAPCN = CFG_READ;
  130.     Trigger_IAP();
  131.     *pu8CFG3 = IAPFD;

  132.     //Read CONFIG4
  133.     IAPAL ++;
  134.     IAPCN = CFG_READ;
  135.     Trigger_IAP();
  136.     *pu8CFG4 = IAPFD;
  137.    
  138.     Disable_IAP_Mode();
  139. }
  140. //-----------------------------------------------------------------------------------------------------------
  141. void Erase_APROM(void)
  142. {   
  143.     UINT16 u16Count;

  144.     Enable_IAP_Mode();
  145.    
  146.     IAPFD = 0xFF;   
  147.     IAPCN = PAGE_ERASE_AP;
  148.    
  149.     set_APUEN;
  150.     for(u16Count=0x0000;u16Count<DATA_SIZE/PAGE_SIZE;u16Count++)
  151.     {        
  152.         IAPAL = LOBYTE(u16Count*PAGE_SIZE + DATA_START_ADDR);
  153.         IAPAH = HIBYTE(u16Count*PAGE_SIZE + DATA_START_ADDR);
  154.         Trigger_IAP();
  155.     }
  156.     clr_APUEN;
  157.    
  158.     Disable_IAP_Mode();
  159. }
  160. //-----------------------------------------------------------------------------------------------------------
  161. BIT Erase_APROM_Verify(void)
  162. {   
  163.     UINT16 u16Count;
  164.     BIT    Error_Flag = 0;

  165.     Enable_IAP_Mode();
  166.    
  167.     IAPAL = LOBYTE(DATA_START_ADDR);
  168.     IAPAH = HIBYTE(DATA_START_ADDR);
  169.     IAPCN = BYTE_READ_AP;

  170.     for(u16Count=0;u16Count<DATA_SIZE/PAGE_SIZE;u16Count++)
  171.     {   
  172.         IAPFD = 0x00;   
  173.         Trigger_IAP();

  174.         if(IAPFD != 0xFF)
  175.         {
  176.             Error_Flag = 1;
  177.             break;
  178.         }

  179.         IAPAL++;
  180.         if(IAPAL == 0x00)
  181.         {
  182.             IAPAH++;
  183.         }
  184.     }
  185.    
  186.     Disable_IAP_Mode();
  187.    
  188.     if(Error_Flag == 1)
  189.         return FAIL;
  190.     else
  191.         return PASS;
  192. }
  193. //-----------------------------------------------------------------------------------------------------------
  194. void Program_APROM(void)
  195. {   
  196.     UINT16 u16Count;

  197.     Enable_IAP_Mode();
  198.    
  199.     IAPAL = LOBYTE(DATA_START_ADDR);
  200.     IAPAH = HIBYTE(DATA_START_ADDR);
  201.     IAPFD = 0xFF;
  202.     IAPCN = BYTE_PROGRAM_AP;
  203.    
  204.     set_APUEN;
  205.     for(u16Count=0;u16Count<DATA_SIZE;u16Count++)
  206.     {   
  207.         IAPFD++;     
  208.         Trigger_IAP();
  209.       
  210.         IAPAL++;
  211.         if(IAPAL == 0)
  212.         {
  213.             IAPAH++;
  214.         }
  215.     }
  216.     clr_APUEN;
  217.    
  218.     Disable_IAP_Mode();
  219. }
  220. //-----------------------------------------------------------------------------------------------------------
  221. BIT Program_APROM_Verify(void)
  222. {   
  223.     UINT16 u16Count;
  224.     UINT8  u8Read_Data;
  225.     BIT    Error_Flag = 0;

  226.     Enable_IAP_Mode();
  227.    
  228.     IAPAL = LOBYTE(DATA_START_ADDR);
  229.     IAPAH = HIBYTE(DATA_START_ADDR);
  230.     IAPCN = BYTE_READ_AP;

  231.     u8Read_Data = 0x00;

  232.     for(u16Count=0;u16Count<DATA_SIZE;u16Count++)
  233.     {   
  234.         Trigger_IAP();
  235.         if(IAPFD != u8Read_Data)
  236.         {
  237.             Error_Flag = 1;
  238.             break;
  239.         }

  240.         IAPAL++;
  241.         if(IAPAL == 0)
  242.         {
  243.             IAPAH++;
  244.         }
  245.         u8Read_Data ++;
  246.     }

  247.     Disable_IAP_Mode();
  248.      
  249.     if(Error_Flag == 1)
  250.         return FAIL;
  251.     else
  252.         return PASS;
  253. }
  254. //-----------------------------------------------------------------------------------------------------------
  255. void Program_CONFIG(UINT8 u8Address,UINT8 u8Data)
  256. {   
  257.     Enable_IAP_Mode();
  258.    
  259.     IAPAL = u8Address;
  260.     IAPAH = 0x00;
  261.     IAPFD = u8Data;
  262.     IAPCN = BYTE_PROGRAM_CFG;
  263.    
  264.     set_CFUEN;
  265.     Trigger_IAP();
  266.     clr_CFUEN;
  267.    
  268.     Disable_IAP_Mode();
  269. }
  270. //-----------------------------------------------------------------------------------------------------------
  271. void Erase_CONFIG(void)
  272. {   
  273.     Enable_IAP_Mode();
  274.    
  275.     IAPAL = 0x00;
  276.     IAPAH = 0x00;
  277.     IAPFD = 0xFF;
  278.     IAPCN = CFG_ERASE;
  279.    
  280.     set_CFUEN;
  281.     Trigger_IAP();
  282.     clr_CFUEN;
  283.    
  284.     Disable_IAP_Mode();
  285. }
  286. //-----------------------------------------------------------------------------------------------------------
  287. void ID_CONFIG_Read(void)
  288. {
  289.     UINT8 u8CID,u8DID0,u8DID1;
  290.     UINT8 u8CFG0,u8CFG1,u8CFG2,u8CFG3,u8CFG4;
  291.    
  292.     ID_Read(&u8CID,&u8DID0,&u8DID1);
  293.     printf("\nCID  = 0x%X",(UINT16)u8CID);
  294.     printf("\nDID0 = 0x%X",(UINT16)u8DID0);
  295.     printf("\nDID1 = 0x%X",(UINT16)u8DID1);

  296.     CONFIG_Read(&u8CFG0,&u8CFG1,&u8CFG2,&u8CFG3,&u8CFG4);
  297.     printf("\nCFG0 = 0x%X",(UINT16)u8CFG0);
  298.     printf("\nCFG1 = 0x%X",(UINT16)u8CFG1);
  299.     printf("\nCFG2 = 0x%X",(UINT16)u8CFG2);
  300.     printf("\nCFG3 = 0x%X",(UINT16)u8CFG3);
  301.     printf("\nCFG4 = 0x%X",(UINT16)u8CFG4);
  302. }
  303. //-----------------------------------------------------------------------------------------------------------
  304. void main (void)
  305. {
  306.     /* Note
  307.        MCU power on system clock is HIRC (22.1184MHz), so Fsys = 22.1184MHz
  308.     */
  309.    
  310.     Set_All_GPIO_Quasi_Mode();
  311.     InitialUART0_Timer1_Type1(9600);             /* 9600 Baud Rate*/

  312.     Show_FW_Version_Number_To_PC();
  313.    
  314.     printf ("\n*===================================================================");
  315.     printf ("\n*  Name: N76E885 IAP APROM Program APROM Demo Code.");
  316.     printf ("\n*===================================================================\n");
  317.    
  318.     /* Change system closk source */
  319.     #if SYS_CLK_EN == 1
  320.         #if   SYS_SEL == 0
  321.             System_Clock_Select(E_HXTEN);   //Fosc = 2~25MHz XTAL
  322.         #elif SYS_SEL == 1
  323.             System_Clock_Select(E_LXTEN);   //Fosc = 32.768KHz XTAL
  324.         #elif SYS_SEL == 2
  325.             System_Clock_Select(E_HIRCEN);  //Fosc = 22.1184MHz Internal RC
  326.         #elif SYS_SEL == 3
  327.             System_Clock_Select(E_LIRCEN);  //Fosc = 10KHz Internal RC
  328.         #elif SYS_SEL == 4
  329.             System_Clock_Select(E_OSCEN);   //Fosc = OSC-In External OSC
  330.         #endif
  331.     #endif
  332.    
  333.     #if SYS_DIV_EN == 1
  334.         CKDIV = SYS_DIV;                        //Fsys = Fosc / (2* CLKDIV) = Fcpu
  335.     #endif
  336.    
  337.     Set_All_GPIO_Quasi_Mode();

  338.     DISPLAY_LED = 0x0F;
  339.     Timer0_Delay1ms(200);

  340.     Erase_CONFIG();
  341.     ID_CONFIG_Read();

  342.     printf ("\nErase APROM");
  343.     Erase_APROM();
  344.     printf ("\nAPROM Erase Verify");
  345.     if(Erase_APROM_Verify() == FAIL)
  346.     {
  347.         DISPLAY_LED = ERASE_FAIL;
  348.         printf ("\nAPROM Erase Fail.");
  349.         while(1);
  350.     }
  351.     printf ("\nAPROM Erase Verify Pass");   

  352.     printf ("\nAPROM Program");        
  353.     Program_APROM();
  354.     printf ("\nAPROM Program Verify");        
  355.     if(Program_APROM_Verify() == FAIL)
  356.     {
  357.         DISPLAY_LED = PROGRAM_FAIL;
  358.         printf ("\nAPROM Program Fail.");
  359.         while(1);
  360.     }
  361.     printf ("\nAPROM Program Verify pass");        
  362.   
  363.     Program_CONFIG(0x00,0xCF);      //Program CONFIG0 =  0xCF;
  364.     Program_CONFIG(0x01,0x0F);      //Program CONFIG1 =  0x0F;
  365.     Program_CONFIG(0x02,0xF8);      //Program CONFIG2 =  0xF8;
  366.     Program_CONFIG(0x03,0x3F);      //Program CONFIG3 =  0x3F;
  367.     Program_CONFIG(0x04,0xFF);      //Program CONFIG4 =  0x00;
  368.   
  369.     ID_CONFIG_Read();
  370.    
  371.     //Timer0_Delay1ms(200);
  372.    
  373.     printf ("\nAPROM program APROM Stop!!!");
  374.     DISPLAY_LED = IAP_PASS;

  375.     while(1);
  376. }
  377. //-----------------------------------------------------------------------------------------------------------
yiyigirl2014 发表于 2017-2-17 20:55 | 显示全部楼层
  1. /*---------------------------------------------------------------------------------------------------------*/
  2. /*                                                                                                         */
  3. /* Copyright(c) 2015 Nuvoton Technology Corp. All rights reserved.                                         */
  4. /*                                                                                                         */
  5. /*---------------------------------------------------------------------------------------------------------*/

  6. //***********************************************************************************************************
  7. //  Nuvoton Technoledge Corp.
  8. //  Website: http://www.nuvoton.com
  9. //  E-Mail : MicroC-8bit@nuvoton.com
  10. //  Date   : Apr/21/2015
  11. //***********************************************************************************************************

  12. //***********************************************************************************************************
  13. //  File Function: N76E885 LDROM program APROM demo code
  14. //***********************************************************************************************************

  15. //***********************************************************************************************************
  16. //  Before using this demo code, please remind below CONFOGs setting, thanks.
  17. //                 CONFIG0.7 --> CBS=0
  18. //                 CONFIG1 = 0xFC, because this demo code size is 2495 Byte
  19. //***********************************************************************************************************

  20. #include <stdio.h>
  21. #include "N76E885.h"
  22. #include "Version.h"
  23. #include "Typedef.h"
  24. #include "Define.h"
  25. #include "SFR_Macro.h"
  26. #include "Common.h"
  27. #include "Delay.h"

  28. /*
  29. //-------- <<< Use Configuration Wizard in Context Menu >>> ------------------
  30. //
  31. ////<e0> System Clock Source Configuration
  32. // <o1> System Clock Source Selection
  33. //      <0=> 2~25MHz    XTAL
  34. //      <1=> 32.768KHz  XTAL
  35. //      <2=> 22.1184MHz Internal
  36. //      <3=> 10KHz      Internal
  37. //      <4=> OSC-In     External
  38. //</e>
  39. //
  40. //<e2> Clock Divider Configuration
  41. //     <o3.0..7>  System Clock Source Devider <1-255>
  42. //                     <i> Fsys = (System Clock Source) / (2 * Devider)
  43. //</e>
  44. //
  45. //-------- <<< end of configuration section >>> ------------------------------
  46. */

  47. #define     SYS_CLK_EN          0
  48. #define     SYS_SEL             2
  49. #define     SYS_DIV_EN          0                   //0: Fsys=Fosc, 1: Fsys = Fosc/(2*CKDIV)
  50. #define     SYS_DIV             1

  51. #define     CID_READ            0x0B
  52. #define     DID_READ            0x0C
  53. #define     CFG_READ            0xC0
  54. #define     CFG_ERASE           0xE2

  55. #define     PAGE_ERASE_AP       0x22
  56. #define     BYTE_READ_AP        0x00
  57. #define     BYTE_PROGRAM_AP     0x21

  58. #define     BYTE_PROGRAM_CFG    0xE1
  59. #define     BYTE_READ_CFG       0xC0

  60. #define     PAGE_SIZE           128

  61. #define     APROM_SIZE          8192   
  62. #define     APROM_START_ADDR    0x0000

  63. #define     ERASE_FAIL          0x70
  64. #define     PROGRAM_FAIL        0x71
  65. #define     IAPFF_FAIL          0x72
  66. #define     IAP_PASS            0x00

  67. #define     DISPLAY_LED         P3
  68. bit BIT_TMP;
  69. //-----------------------------------------------------------------------------------------------------------
  70. void Enable_IAP_Mode(void)
  71. {   
  72.     set_IAPEN;
  73. }
  74. //-----------------------------------------------------------------------------------------------------------
  75. void Disable_IAP_Mode(void)
  76. {   
  77.     clr_IAPEN;
  78. }
  79. //-----------------------------------------------------------------------------------------------------------
  80. void Trigger_IAP(void)
  81. {   
  82.     set_IAPGO;                                  //trigger IAP
  83.     if((CHPCON&SET_BIT6)==SET_BIT6)             //check IAPFF (CHPCON.6)
  84.     {
  85.         DISPLAY_LED = IAPFF_FAIL;
  86.         while(1);
  87.     }
  88. }
  89. //-----------------------------------------------------------------------------------------------------------
  90. void ID_Read(UINT8 *pu8CID,UINT8 *pu8DID0,UINT8 *pu8DID1)
  91. {   
  92.     Enable_IAP_Mode();

  93.     //Read CID
  94.     IAPAL = 0x00;
  95.     IAPAH = 0x00;
  96.     IAPCN = CID_READ;
  97.     Trigger_IAP();
  98.    
  99.     *pu8CID = IAPFD;

  100.     //Read DID0
  101.     IAPCN = DID_READ;
  102.     Trigger_IAP();
  103.     *pu8DID0 = IAPFD;

  104.     //Read DID1
  105.     IAPAL ++;
  106.     IAPCN = DID_READ;
  107.     Trigger_IAP();
  108.     *pu8DID1 = IAPFD;

  109.     Disable_IAP_Mode();
  110. }
  111. //-----------------------------------------------------------------------------------------------------------
  112. void CONFIG_Read(UINT8 *pu8CFG0,UINT8 *pu8CFG1,UINT8 *pu8CFG2,UINT8 *pu8CFG3,UINT8 *pu8CFG4)
  113. {   
  114.     Enable_IAP_Mode();

  115.     //Read CONFIG0
  116.     IAPAL = 0x00;
  117.     IAPAH = 0x00;
  118.     IAPCN = CFG_READ;
  119.     Trigger_IAP();
  120.     *pu8CFG0 = IAPFD;

  121.     //Read CONFIG1
  122.     IAPAL ++;
  123.     IAPCN = CFG_READ;
  124.     Trigger_IAP();
  125.     *pu8CFG1 = IAPFD;

  126.     //Read CONFIG2
  127.     IAPAL ++;
  128.     IAPCN = CFG_READ;
  129.     Trigger_IAP();
  130.     *pu8CFG2 = IAPFD;

  131.     //Read CONFIG3
  132.     IAPAL ++;
  133.     IAPCN = CFG_READ;
  134.     Trigger_IAP();
  135.     *pu8CFG3 = IAPFD;

  136.     //Read CONFIG4
  137.     IAPAL ++;
  138.     IAPCN = CFG_READ;
  139.     Trigger_IAP();
  140.     *pu8CFG4 = IAPFD;
  141.    
  142.     Disable_IAP_Mode();
  143. }
  144. //-----------------------------------------------------------------------------------------------------------
  145. void Erase_CONFIG(void)
  146. {   
  147.     Enable_IAP_Mode();
  148.    
  149.     IAPAL = 0x00;
  150.     IAPAH = 0x00;
  151.     IAPFD = 0xFF;
  152.     IAPCN = CFG_ERASE;
  153.    
  154.     set_CFUEN;
  155.     Trigger_IAP();
  156.     clr_CFUEN;
  157.    
  158.     Disable_IAP_Mode();
  159. }
  160. //-----------------------------------------------------------------------------------------------------------
  161. void Erase_APROM(void)
  162. {   
  163.     UINT16 u16Count;

  164.     Enable_IAP_Mode();
  165.    
  166.     IAPFD = 0xFF;   
  167.     IAPCN = PAGE_ERASE_AP;
  168.    
  169.     set_APUEN;
  170.     for(u16Count=0x0000;u16Count<APROM_SIZE/PAGE_SIZE;u16Count++)
  171.     {        
  172.         IAPAL = LOBYTE(u16Count*PAGE_SIZE + APROM_START_ADDR);
  173.         IAPAH = HIBYTE(u16Count*PAGE_SIZE + APROM_START_ADDR);
  174.         Trigger_IAP();
  175.     }
  176.     clr_APUEN;
  177.    
  178.     Disable_IAP_Mode();
  179. }
  180. //-----------------------------------------------------------------------------------------------------------
  181. BIT Erase_APROM_Verify(void)
  182. {   
  183.     UINT16 u16Count;
  184.     BIT    Error_Flag = 0;

  185.     Enable_IAP_Mode();
  186.    
  187.     IAPAL = LOBYTE(APROM_START_ADDR);
  188.     IAPAH = HIBYTE(APROM_START_ADDR);
  189.     IAPCN = BYTE_READ_AP;

  190.     for(u16Count=0;u16Count<APROM_SIZE/PAGE_SIZE;u16Count++)
  191.     {   
  192.         IAPFD = 0x00;   
  193.         Trigger_IAP();

  194.         if(IAPFD != 0xFF)
  195.         {
  196.             Error_Flag = 1;
  197.             break;
  198.         }

  199.         IAPAL++;
  200.         if(IAPAL == 0x00)
  201.         {
  202.             IAPAH++;
  203.         }
  204.     }
  205.    
  206.     Disable_IAP_Mode();
  207.    
  208.     if(Error_Flag == 1)
  209.         return FAIL;
  210.     else
  211.         return PASS;
  212. }
  213. //-----------------------------------------------------------------------------------------------------------
  214. void Program_APROM(void)
  215. {   
  216.     UINT16 u16Count;

  217.     Enable_IAP_Mode();
  218.    
  219.     IAPAL = LOBYTE(APROM_START_ADDR);
  220.     IAPAH = HIBYTE(APROM_START_ADDR);
  221.     IAPFD = 0xFF;
  222.     IAPCN = BYTE_PROGRAM_AP;
  223.    
  224.     set_APUEN;
  225.     for(u16Count=0;u16Count<APROM_SIZE;u16Count++)
  226.     {   
  227.         IAPFD++;     
  228.         Trigger_IAP();
  229.       
  230.         IAPAL++;
  231.         if(IAPAL == 0)
  232.         {
  233.             IAPAH++;
  234.         }
  235.     }
  236.     clr_APUEN;
  237.    
  238.     Disable_IAP_Mode();
  239. }
  240. //-----------------------------------------------------------------------------------------------------------
  241. BIT Program_APROM_Verify(void)
  242. {   
  243.     UINT16 u16Count;
  244.     UINT8  u8Read_Data;
  245.     BIT    Error_Flag = 0;

  246.     Enable_IAP_Mode();
  247.    
  248.     IAPAL = LOBYTE(APROM_START_ADDR);
  249.     IAPAH = HIBYTE(APROM_START_ADDR);
  250.     IAPCN = BYTE_READ_AP;

  251.     u8Read_Data = 0x00;

  252.     for(u16Count=0;u16Count<APROM_SIZE;u16Count++)
  253.     {   
  254.         Trigger_IAP();
  255.         if(IAPFD != u8Read_Data)
  256.         {
  257.             Error_Flag = 1;
  258.             break;
  259.         }

  260.         IAPAL++;
  261.         if(IAPAL == 0)
  262.         {
  263.             IAPAH++;
  264.         }
  265.         u8Read_Data ++;
  266.     }

  267.     Disable_IAP_Mode();
  268.      
  269.     if(Error_Flag == 1)
  270.         return FAIL;
  271.     else
  272.         return PASS;
  273. }
  274. //-----------------------------------------------------------------------------------------------------------
  275. void Program_CONFIG(UINT8 u8Address,UINT8 u8Data)
  276. {   
  277.     Enable_IAP_Mode();
  278.    
  279.     IAPAL = u8Address;
  280.     IAPAH = 0x00;
  281.     IAPFD = u8Data;
  282.     IAPCN = BYTE_PROGRAM_CFG;
  283.    
  284.     set_CFUEN;
  285.     Trigger_IAP();
  286.     clr_CFUEN;
  287.    
  288.     Disable_IAP_Mode();
  289. }
  290. //-----------------------------------------------------------------------------------------------------------
  291. void ID_CONFIG_Read(void)
  292. {
  293.     UINT8 u8CID,u8DID0,u8DID1;
  294.     UINT8 u8CFG0,u8CFG1,u8CFG2,u8CFG3,u8CFG4;
  295.    
  296.     ID_Read(&u8CID,&u8DID0,&u8DID1);
  297.     Send_Data_To_UART0(u8CID);
  298.     Send_Data_To_UART0(u8DID0);
  299.     Send_Data_To_UART0(u8DID1);

  300.     CONFIG_Read(&u8CFG0,&u8CFG1,&u8CFG2,&u8CFG3,&u8CFG4);
  301.     Send_Data_To_UART0(u8CFG0);
  302.     Send_Data_To_UART0(u8CFG1);
  303.     Send_Data_To_UART0(u8CFG2);
  304.     Send_Data_To_UART0(u8CFG3);
  305.     Send_Data_To_UART0(u8CFG4);
  306. }
  307. //-----------------------------------------------------------------------------------------------------------
  308. void main (void)
  309. {
  310.     UINT8 i;

  311.     /* Note
  312.        MCU power on system clock is HIRC (22.1184MHz), so Fsys = 22.1184MHz
  313.     */
  314.         
  315.     /* Change system closk source */
  316.     #if SYS_CLK_EN == 1
  317.         #if   SYS_SEL == 0
  318.             System_Clock_Select(E_HXTEN);   //Fosc = 2~25MHz XTAL
  319.         #elif SYS_SEL == 1
  320.             System_Clock_Select(E_LXTEN);   //Fosc = 32.768KHz XTAL
  321.         #elif SYS_SEL == 2
  322.             System_Clock_Select(E_HIRCEN);  //Fosc = 22.1184MHz Internal RC
  323.         #elif SYS_SEL == 3
  324.             System_Clock_Select(E_LIRCEN);  //Fosc = 10KHz Internal RC
  325.         #elif SYS_SEL == 4
  326.             System_Clock_Select(E_OSCEN);   //Fosc = OSC-In External OSC
  327.         #endif
  328.     #endif
  329.    
  330.     #if SYS_DIV_EN == 1
  331.         CKDIV = SYS_DIV;                    //Fsys = Fosc / (2* CLKDIV) = Fcpu
  332.     #endif
  333.    
  334.     Set_All_GPIO_Quasi_Mode();

  335.     for(i=0;i<3;i++)
  336.     {
  337.         DISPLAY_LED = 0x55;
  338.         Timer0_Delay1ms(200);
  339.         DISPLAY_LED = 0xFF;
  340.         Timer0_Delay1ms(200);
  341.     }   
  342.    
  343.     InitialUART0_Timer1_Type1(9600);
  344.     DISPLAY_LED = 0x0F;
  345.     Timer0_Delay1ms(200);
  346.     ID_CONFIG_Read();

  347.     Erase_APROM();
  348.     if(Erase_APROM_Verify() == FAIL)
  349.     {
  350.         DISPLAY_LED = ERASE_FAIL;
  351.         while(1);
  352.     }

  353.     Program_APROM();
  354.     if(Program_APROM_Verify() == FAIL)
  355.     {
  356.         DISPLAY_LED = PROGRAM_FAIL;
  357.         while(1);
  358.     }
  359.    
  360.     Program_CONFIG(0x00,0x7F);              //Program CONFIG0 =  0x7F;
  361.     Program_CONFIG(0x01,0xFC);              //Program CONFIG1 =  0xFC;
  362.     Program_CONFIG(0x02,0xF8);              //Program CONFIG2 =  0xF8;
  363.     Program_CONFIG(0x03,0x3F);              //Program CONFIG3 =  0x3F;
  364.     Program_CONFIG(0x04,0xFF);              //Program CONFIG4 =  0xFF;
  365.     Program_CONFIG(0x05,0x0F);              //Program CONFIG5 =  0x0F;
  366.    
  367.     ID_CONFIG_Read();
  368.     Timer0_Delay1ms(200);
  369.     DISPLAY_LED = IAP_PASS;
  370.     while(1);
  371. }
  372. //-----------------------------------------------------------------------------------------------------------
玛尼玛尼哄 发表于 2017-2-17 21:27 | 显示全部楼层
Flash存储器可以通过在电路编程(ICP)进行编程。硬件编程是在产品进入批量生产阶段,采用编程器可以节省费用和时间。然而,如果产品在研发阶段或产品需要更新软固件时,硬件编程就显得不太方便。ICP可以在不用将控制器从系统中卸下对控制器再编程。
玛尼玛尼哄 发表于 2017-2-17 21:28 | 显示全部楼层
在应用编程 (IAP)
修改FLASH数据通常需要很长时间,不像RAM那样可以实时操作。而且擦除、编程或是读取FLASH数据需要遵循相当复杂的时序步骤。N76E616提供方便FALSH编程方式可以帮助用户通过IAP方式重编程FLASH内容。IAP就是通过软件实现在电路进行电擦除和编程的在应用编程方法。
玛尼玛尼哄 发表于 2017-2-17 21:31 | 显示全部楼层
IAP 命令
N76E616通过IAP可编写 APROM, LDROM, 或 CONFIG。IAP运作模式和编程区域目标地址是IAPCN决定的。
天灵灵地灵灵 发表于 2017-2-17 22:09 | 显示全部楼层
根据需求,自己选择嘛,三种使用环境很明白,一般只需要一种就行了。
 楼主| 21icszx 发表于 2017-2-18 14:39 | 显示全部楼层

看了下,这两个代码都是IAP编程的。
第一个是通过APROM编程APROM;
第二个是通过LDROM编程APROM
734774645 发表于 2017-2-19 18:27 | 显示全部楼层
都是用新唐的编程器做的,没考虑过这个问题,不过看到过别人做的通过网络自动升级固件的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

157

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部