[技术问答] N76E003 如何开辟一块区域用作于EEPROM,在烧录的时候不被擦除

[复制链接]
 楼主| 淡然的烟 发表于 2018-7-20 10:04 | 显示全部楼层 |阅读模式
新唐的N76E003如何开辟一块区域,用作保存数据在烧录的时候不会被擦除。第一次烧录的时候添加进内容,第二次烧录的时候不会被擦除掉。继续保存? 看手册LDROM貌似可以使用,但是我配置了LDROM,依旧在第二次烧录的时候被擦除为0xFF了 有大神指点一下么
09kk小熊 发表于 2018-7-20 16:59 | 显示全部楼层
你烧录的时候不要去勾选LDROM就不会去操作了。还有你得先划分LDROM空间
huangcunxiake 发表于 2018-7-20 21:58 | 显示全部楼层
09kk小熊 发表于 2018-7-20 16:59
你烧录的时候不要去勾选LDROM就不会去操作了。还有你得先划分LDROM空间

楼上正解,你最好先看看官方的手册和BSP例子。看看这些怎么实现。
zhuotuzi 发表于 2018-7-20 23:01 | 显示全部楼层
  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 as EEPROM way
  14. //***********************************************************************************************************
  15. #include "N76E003.h"
  16. #include "Common.h"
  17. #include "Delay.h"
  18. #include "SFR_Macro.h"
  19. #include "Function_define.h"

  20. #define ADDR_BASE 0x4700

  21. #define FLASH_L_LOW                        ADDR_BASE+1
  22. #define FLASH_L_HIGH                ADDR_BASE+2
  23. #define FLASH_H_LOW                        ADDR_BASE+3
  24. #define FLASH_H_HIGH                ADDR_BASE+4
  25. /*****************************************************************************************************************
  26. write_DATAFLASH_BYTE :
  27. user can copy all this subroutine into project, then call this function in main.
  28. ******************************************************************************************************************/               
  29. void write_DATAFLASH_BYTE(UINT16 u16_addr,UINT8 u8_data)
  30. {
  31.         UINT8 looptmp=0,u8_addrl_r;
  32.         unsigned char code *cd_longaddr;
  33.         unsigned char xdata *xd_tmp;
  34.        
  35. //Check page start address
  36.         u8_addrl_r = u16_addr;
  37.         if (u8_addrl_r<0x80)
  38.         {
  39.                 u8_addrl_r = 0;
  40.         }
  41.         else
  42.         {
  43.                 u8_addrl_r = 0x80;
  44.         }
  45. //Save APROM data to XRAM
  46.         xd_tmp = 0x280;
  47.         cd_longaddr = (u16_addr&0xff00)+u8_addrl_r;       
  48.         while (xd_tmp !=0x300)
  49.         {
  50.                 *xd_tmp = *cd_longaddr;
  51.                 looptmp++;
  52.                 xd_tmp++;
  53.                 cd_longaddr++;
  54.         }
  55. // Modify customer data in XRAM
  56.         u8_addrl_r = u16_addr;
  57.         if (u8_addrl_r<0x80)
  58.         {
  59.                 xd_tmp = u8_addrl_r+0x280;
  60.         }
  61.         else
  62.         {
  63.                 xd_tmp = u8_addrl_r+0x200;
  64.         }
  65.         *xd_tmp = u8_data;
  66. //Erase APROM DATAFLASH page
  67.                 IAPAL = u16_addr;
  68.                 IAPAH = u16_addr>>8;
  69.                 IAPFD = 0xFF;
  70.           set_IAPEN;
  71.                 set_APUEN;
  72.     IAPCN = 0x22;                
  73.                 set_IAPGO;
  74. //Save changed RAM data to APROM DATAFLASH
  75.         u8_addrl_r = u16_addr;
  76.         if (u8_addrl_r<0x80)
  77.         {
  78.                 u8_addrl_r =0;
  79.         }
  80.         else
  81.         {
  82.                 u8_addrl_r = 0x80;
  83.         }
  84.                 xd_tmp = 0x280;
  85.           IAPAL = u8_addrl_r;
  86.     IAPAH = u16_addr>>8;
  87.                 set_IAPEN;
  88.                 set_APUEN;
  89.           IAPCN = 0x21;
  90.                 while (xd_tmp !=0x2FF)
  91.                 {
  92.                         IAPFD = *xd_tmp;
  93.                         set_IAPGO;
  94.                         IAPAL++;
  95.                         xd_tmp++;
  96.                 }
  97.                 clr_APUEN;
  98.                 clr_IAPEN;
  99. }       
  100.        
  101. //-------------------------------------------------------------------------
  102. UINT8 read_APROM_BYTE(UINT16 code *u16_addr)
  103. {
  104.         UINT8 rdata;
  105.         rdata = *u16_addr>>8;
  106.         return rdata;
  107. }

  108. /******************************************************************************************************************/       


  109. void main (void)
  110. {
  111.                 UINT8 datatemp;
  112.                 UINT16 system16highsite;
  113. /* -------------------------------------------------------------------------*/
  114. /*  Dataflash use APROM area, please ALWAYS care the address of you code    */
  115. /*        APROM 0x3800~0x38FF demo as dataflash                                                                                                     */
  116. /*         Please use Memory window key in C:0x3800 to check earse result                                        */             
  117. /* -------------------------------------------------------------------------*/
  118.                 InitialUART0_Timer1(115200);
  119. //call write byte
  120.                 write_DATAFLASH_BYTE (0x3802,0x34);
  121.                 write_DATAFLASH_BYTE (FLASH_L_LOW,0x55);
  122.                 write_DATAFLASH_BYTE (FLASH_L_HIGH,0x56);
  123.                 write_DATAFLASH_BYTE (FLASH_H_LOW,0xaa);
  124.                 write_DATAFLASH_BYTE (FLASH_H_HIGH,0x66);
  125. //call read byte
  126.                 datatemp = read_APROM_BYTE(0x3802);
  127.                 system16highsite = ((read_APROM_BYTE(FLASH_H_HIGH)<<8)+read_APROM_BYTE(FLASH_H_LOW));

  128.     while(1)
  129.                 {
  130. //                                printf ("\n data temp = 0x%bx", datatemp);
  131.                 }
  132. }
  133. //-----------------------------------------------------------------------------------------------------------
zhuotuzi 发表于 2018-7-20 23:02 | 显示全部楼层
参考这个例子试试,你把写入那个通过安检控制。可以读取,你先写入,然后第二次读出看看能否保持之前写的内容。
734774645 发表于 2018-7-21 21:37 | 显示全部楼层
去新唐官方找PDF文档,有一个介绍这个的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

2

帖子

0

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