[DemoCode下载] N76E003 的IAP数据Flash编程方式

[复制链接]
4125|9
 楼主| 稳稳の幸福 发表于 2017-3-17 20:38 | 显示全部楼层 |阅读模式
  1. /*---------------------------------------------------------------------------------------------------------*/
  2. /*                                                                                                         */
  3. /* Copyright(c) 2016 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/2016
  11. //***********************************************************************************************************

  12. //***********************************************************************************************************
  13. //  File Function: N76E003 APROM program DATAFLASH (APROM) demo code
  14. //***********************************************************************************************************

  15. #include <stdio.h>
  16. #include "N76E003.h"
  17. #include "Define.h"
  18. #include "Common.h"
  19. #include "Delay.h"
  20. #include "SFR_Macro.h"
  21. #include "Function_define.h"


  22. #define     CID_READ            0x0B
  23. #define     DID_READ            0x0C

  24. /*
  25.         Since the DATAFLASH is in the APROM. Program command is same as program APROM
  26. */
  27. #define     PAGE_ERASE_AP       0x22
  28. #define     BYTE_READ_AP        0x00
  29. #define     BYTE_PROGRAM_AP     0x21
  30. #define     PAGE_SIZE           128


  31. #define     ERASE_FAIL          0x70
  32. #define     PROGRAM_FAIL        0x71
  33. #define     IAPFF_FAIL          0x72
  34. #define     IAP_PASS            0x00

  35. //---------------------------------------------------------------
  36. // Following define by customer
  37. // Please confirm the start addresss not over your code size
  38. //---------------------------------------------------------------
  39. #define     DATA_SIZE           4096   
  40. #define     DATA_START_ADDR     0x3800                                        

  41. /********************************************************************************************
  42. Following IAP command register is also define in SFR_Macro.h

  43.         #define set_IAPEN   BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;CHPCON |= SET_BIT0 ;EA=BIT_TMP
  44.         #define clr_IAPEN   BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;CHPCON &= ~SET_BIT0;EA=BIT_TMP
  45.         #define set_APUEN   BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;IAPUEN |= SET_BIT0 ;EA=BIT_TMP
  46.         #define clr_APUEN   BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;IAPUEN &= ~SET_BIT0;EA=BIT_TMP
  47.        
  48. **********************************************************************************************/



  49. void IAP_ERROR_LED(void)
  50. {
  51.         while (1)
  52.         {
  53.                 clr_P03;
  54.                 Timer1_Delay1ms(100);
  55.                 set_P03;
  56.                 Timer1_Delay1ms(100);
  57.         }

  58. }

  59. //-----------------------------------------------------------------------------------------------------------/
  60. void Trigger_IAP(void)
  61. {   
  62.     set_IAPGO;                                                                                                                                        //trigger IAP
  63.     if((CHPCON&SET_BIT6)==SET_BIT6)             // if fail flag is set, toggle error LED and IAP stop
  64.                 {
  65.                         clr_IAPFF;
  66.                         IAP_ERROR_LED();
  67.                 }
  68. }
  69. /*
  70.                 WARNING:
  71.         No matter read or writer, when IAPFF is set 1,
  72.         this step process is fail. DATA should be ignore.
  73. */
  74. //-----------------------------------------------------------------------------------------------------------/

  75. /*****************************************************************************************************************
  76. Erase APROM subroutine:
  77.        

  78. ******************************************************************************************************************/               
  79. void Erase_APROM(void)
  80. {   
  81.     UINT16 u16Count;

  82.     set_IAPEN;                                                                                                        // Enable IAP function
  83.                 IAPFD = 0xFF;                                                                                                // IMPORTANT !! To erase function must setting IAPFD = 0xFF
  84.     IAPCN = PAGE_ERASE_AP;
  85.     set_APUEN;                                                                                                        //  APROM modify Enable
  86.        
  87.     for(u16Count=0x0000;u16Count<DATA_SIZE/PAGE_SIZE;u16Count++)                //
  88.     {        
  89.         IAPAL = LOBYTE(u16Count*PAGE_SIZE + DATA_START_ADDR);
  90.         IAPAH = HIBYTE(u16Count*PAGE_SIZE + DATA_START_ADDR);
  91.         Trigger_IAP();
  92.     }
  93.     clr_APUEN;
  94.     clr_IAPEN;
  95. }
  96. //-----------------------------------------------------------------------------------------------------------
  97. void Erase_APROM_Verify(void)
  98. {   
  99.     UINT16 u16Count;
  100.     set_IAPEN;
  101.     IAPAL = LOBYTE(DATA_START_ADDR);
  102.     IAPAH = HIBYTE(DATA_START_ADDR);
  103.     IAPCN = BYTE_READ_AP;

  104.     for(u16Count=0;u16Count<DATA_SIZE/PAGE_SIZE;u16Count++)
  105.     {   
  106.         IAPFD = 0x00;   
  107.         Trigger_IAP();
  108.         if(IAPFD != 0xFF)
  109.                                         IAP_ERROR_LED();
  110.         IAPAL++;
  111.         if(IAPAL == 0x00)
  112.           IAPAH++;
  113.     }
  114.                
  115.     clr_IAPEN;
  116.    
  117. }
  118. //-----------------------------------------------------------------------------------------------------------
  119. void Program_APROM(void)
  120. {   
  121.     UINT16 u16Count;

  122.     set_IAPEN;
  123.     set_APUEN;   
  124.     IAPAL = LOBYTE(DATA_START_ADDR);
  125.     IAPAH = HIBYTE(DATA_START_ADDR);
  126.     IAPCN = BYTE_PROGRAM_AP;
  127.    
  128.     for(u16Count=0;u16Count<DATA_SIZE;u16Count++)
  129.     {   
  130.         IAPFD++;     
  131.         Trigger_IAP();
  132.       
  133.         IAPAL++;
  134.         if(IAPAL == 0)
  135.         {
  136.             IAPAH++;
  137.         }
  138.     }
  139.                
  140.     clr_APUEN;
  141.     clr_IAPEN;
  142. }
  143. //-----------------------------------------------------------------------------------------------------------
  144. void Program_APROM_Verify(void)
  145. {   
  146.     UINT16 u16Count;
  147.     UINT8  u8Read_Data;

  148.     set_IAPEN;
  149.     IAPAL = LOBYTE(DATA_START_ADDR);
  150.     IAPAH = HIBYTE(DATA_START_ADDR);
  151.     IAPCN = BYTE_READ_AP;
  152.     u8Read_Data = 0x00;

  153.     for(u16Count=0;u16Count<DATA_SIZE;u16Count++)
  154.     {   
  155.         Trigger_IAP();
  156.         if(IAPFD != u8Read_Data)
  157.                                         IAP_ERROR_LED();
  158.         IAPAL++;
  159.         if(IAPAL == 0)
  160.         {
  161.             IAPAH++;
  162.         }
  163.         u8Read_Data ++;
  164.     }

  165.     clr_IAPEN;
  166. }
  167. //-----------------------------------------------------------------------------------------------------------

  168. //-----------------------------------------------------------------------------------------------------------
  169. void main (void)
  170. {

  171.   Set_All_GPIO_Quasi_Mode;
  172. //---------toggle GPIO1---------       
  173.         clr_GPIO1;
  174.         Timer0_Delay1ms(100);
  175.         set_GPIO1;
  176.         Timer0_Delay1ms(100);
  177.         clr_GPIO1;
  178.         Timer0_Delay1ms(100);
  179.         set_GPIO1;
  180.         Timer0_Delay1ms(100);
  181. //---------end toggle GPIO1---------
  182.        
  183.     Erase_APROM();
  184.                 Erase_APROM_Verify();
  185.     Program_APROM();
  186.     Program_APROM_Verify();

  187. //---------toggle GPIO1---------       
  188.         clr_GPIO1;
  189.         Timer0_Delay1ms(100);
  190.         set_GPIO1;
  191.         Timer0_Delay1ms(100);
  192.         clr_GPIO1;
  193.         Timer0_Delay1ms(100);
  194.         set_GPIO1;
  195.         Timer0_Delay1ms(100);
  196. //---------end toggle GPIO1---------

  197.     while(1);
  198. }
  199. //-----------------------------------------------------------------------------------------------------------


 楼主| 稳稳の幸福 发表于 2017-3-17 20:38 | 显示全部楼层
IAP的妙处,就是在程序里可以自己写闪存。
yiyigirl2014 发表于 2017-3-17 20:48 | 显示全部楼层
一般都是要按页擦除掉后,才能再次写入。
zhuotuzi 发表于 2017-3-18 18:46 | 显示全部楼层
这样就可以用多余的空间存储掉电保护的数据了。
wahahaheihei 发表于 2017-3-20 18:22 | 显示全部楼层
这个烧录进去怎么用啊。
huangcunxiake 发表于 2017-3-21 19:58 | 显示全部楼层
Trigger_IAP();
一切就绪后,触发IAP
zhuotuzi 发表于 2017-3-21 20:18 | 显示全部楼层
       #define set_IAPEN   BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;CHPCON |= SET_BIT0 ;EA=BIT_TMP
        #define clr_IAPEN   BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;CHPCON &= ~SET_BIT0;EA=BIT_TMP
        #define set_APUEN   BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;IAPUEN |= SET_BIT0 ;EA=BIT_TMP
        #define clr_APUEN   BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;IAPUEN &= ~SET_BIT0;EA=BIT_TMP
这种应该用括号搞起来比较安全吧
 楼主| 稳稳の幸福 发表于 2017-3-21 23:36 | 显示全部楼层
一般51如果做那种不需要更新的产品,就不需要这么玩了。
598330983 发表于 2017-3-24 09:43 | 显示全部楼层
想成为高手必须学这个IAP。
bxliang 发表于 2018-8-23 11:53 | 显示全部楼层
zhuotuzi 发表于 2017-3-18 18:46
这样就可以用多余的空间存储掉电保护的数据了。

请问有做过N76E003掉电数据保存吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

204

主题

3450

帖子

8

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