[技术问答] 新塘N76E003如何在XRAM或者FLASH中模拟eeprom,实现数据存储

[复制链接]
 楼主| 小白flame 发表于 2018-1-18 20:44 | 显示全部楼层 |阅读模式
新塘N76E003如何在XRAM或者FLASH中模拟eeprom,实现数据存储

评论

官网例程在demo板上,无法正常读取存储的数据,为何啊?读出的都是00,盼解决  发表于 2018-7-24 14:44
caidenghua 发表于 2018-1-18 21:37 | 显示全部楼层
模拟eeprom得用flash,断电后数据才不会丢,每次使用不同的位置,当一页写满后,擦除再使用,存储数据先读到RAM后再擦除
jiekou001 发表于 2018-1-18 21:38 | 显示全部楼层
  1. /*---------------------------------------------------------------------------------------------------------*/
  2. /*                                                                                                         */
  3. /* Copyright(c) 2017 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/2017
  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. /*****************************************************************************************************************
  21. write_DATAFLASH_BYTE :
  22. user can copy all this subroutine into project, then call this function in main.
  23. ******************************************************************************************************************/               
  24. void write_DATAFLASH_BYTE(UINT16 u16_addr,UINT8 u8_data)
  25. {
  26.         UINT8 looptmp=0,u8_addrl_r;
  27.         unsigned char code *cd_longaddr;
  28.         unsigned char xdata *xd_tmp;
  29.        
  30. //Check page start address
  31.         u8_addrl_r = u16_addr;
  32.         if (u8_addrl_r<0x80)
  33.         {
  34.                 u8_addrl_r = 0;
  35.         }
  36.         else
  37.         {
  38.                 u8_addrl_r = 0x80;
  39.         }
  40. //Save APROM data to XRAM
  41.         xd_tmp = 0x80;
  42.         cd_longaddr = (u16_addr&0xff00)+u8_addrl_r;       
  43.         while (xd_tmp !=0x100)
  44.         {
  45.                 *xd_tmp = *cd_longaddr;
  46.                 looptmp++;
  47.                 xd_tmp++;
  48.                 cd_longaddr++;
  49.         }
  50. // Modify customer data in XRAM
  51.         u8_addrl_r = u16_addr;
  52.         if (u8_addrl_r<0x80)
  53.         {
  54.                 xd_tmp = u8_addrl_r+0x80;
  55.         }
  56.         else
  57.         {
  58.                 xd_tmp = u8_addrl_r+0;
  59.         }
  60.         *xd_tmp = u8_data;
  61. //Erase APROM DATAFLASH page
  62.                 IAPAL = u16_addr;
  63.                 IAPAH = u16_addr>>8;
  64.                 IAPFD = 0xFF;
  65.           set_IAPEN;
  66.                 set_APUEN;
  67.     IAPCN = 0x22;                
  68.                 set_IAPGO;
  69. //Save changed RAM data to APROM DATAFLASH
  70.         u8_addrl_r = u16_addr;
  71.         if (u8_addrl_r<0x80)
  72.         {
  73.                 u8_addrl_r =0;
  74.         }
  75.         else
  76.         {
  77.                 u8_addrl_r = 0x80;
  78.         }
  79.                 xd_tmp = 0x280;
  80.           IAPAL = u8_addrl_r;
  81.     IAPAH = u16_addr>>8;
  82.                 set_IAPEN;
  83.                 set_APUEN;
  84.           IAPCN = 0x21;
  85.                 while (xd_tmp !=0xFF)
  86.                 {
  87.                         IAPFD = *xd_tmp;
  88.                         set_IAPGO;
  89.                         IAPAL++;
  90.                         xd_tmp++;
  91.                 }
  92.                 clr_APUEN;
  93.                 clr_IAPEN;
  94. }       
  95.        
  96. //-------------------------------------------------------------------------
  97. UINT8 read_APROM_BYTE(UINT16 code *u16_addr)
  98. {
  99.         UINT8 rdata;
  100.         rdata = *u16_addr>>8;
  101.         return rdata;
  102. }

  103. /******************************************************************************************************************/       


  104. void main (void)
  105. {
  106.                 UINT8 datatemp;
  107. /* -------------------------------------------------------------------------*/
  108. /*  Dataflash use APROM area, please ALWAYS care the address of you code    */
  109. /*        APROM 0x3800~0x38FF demo as dataflash                                                                                                     */
  110. /*         Please use Memory window key in C:0x3800 to check earse result                                        */             
  111. /* -------------------------------------------------------------------------*/
  112.                 InitialUART0_Timer1(115200);
  113. //call write byte
  114.                 write_DATAFLASH_BYTE (0x3881,0x55);
  115.                 write_DATAFLASH_BYTE (0x3882,0x56);
  116.                 write_DATAFLASH_BYTE (0x3855,0xaa);
  117.                 write_DATAFLASH_BYTE (0x3856,0x66);
  118. //call read byte
  119.                 datatemp = read_APROM_BYTE(0x3882);

  120.     while(1)
  121.                 {
  122. //                                printf ("\n data temp = 0x%bx", datatemp);
  123.                 }
  124. }
  125. //-----------------------------------------------------------------------------------------------------------
复制代码

评论

就是这个例程,但我仿真的时候,读出的是00,为何?  发表于 2018-7-24 14:41
jiekou001 发表于 2018-1-18 21:38 | 显示全部楼层
去官网下载
N76E003_BSP_Keil_C51_V1.0.4
这个
 楼主| 小白flame 发表于 2018-1-18 22:33 | 显示全部楼层
jiekou001 发表于 2018-1-18 21:38
去官网下载
N76E003_BSP_Keil_C51_V1.0.4
这个

xinxianshi 发表于 2018-1-19 18:43 | 显示全部楼层
这个方面,官方提供了例子,我之前跑了一次测试, 没问题。

评论

你好,为什么我使用官方的例程"IAP_Dataflash_EEPROM"不行呢,是要设置哪里吗?  发表于 2018-4-12 23:32
 楼主| 小白flame 发表于 2018-1-19 20:57 | 显示全部楼层
eeprom 的有多大的区域,起始地址一般是多少?code会不会对存储区域有影响
mintspring 发表于 2018-1-23 20:20 来自手机 | 显示全部楼层
太复杂了
huangcunxiake 发表于 2018-1-24 15:17 | 显示全部楼层
按照例子没搞定吗,这个好多人都用过的。

评论

不是没搞定 ,例程中代码eeprom是存储在FLASH中的,如果我flash区域有code,是不是会有影响呢?  发表于 2018-1-24 16:38
huangcunxiake 发表于 2018-1-24 17:41 | 显示全部楼层
不会有影响,编译器会给你分开的。
 楼主| 小白flame 发表于 2018-1-29 19:48 | 显示全部楼层
huangcunxiake 发表于 2018-1-24 17:41
不会有影响,编译器会给你分开的。

首先写操作的时候,接口函数会擦除整页数据的啊.
然后假设我的ROM使用5k的个字节,然后我写的EEPROM数据的首地址正好在这5K数据中,会不会对这块内存(code区域)中有影响.
xinxianshi 发表于 2018-4-17 16:11 | 显示全部楼层
小白flame 发表于 2018-1-29 19:48
首先写操作的时候,接口函数会擦除整页数据的啊.
然后假设我的ROM使用5k的个字节,然后我写的EEPROM数据的 ...

肯定会有影响啊,所以你要代码在前,EEPROM放后面,这样错开。
xinxianshi 发表于 2018-4-17 16:11 | 显示全部楼层
还有就是编译器编译后有个消息,告诉你用了多少RAM和多少ROM。
511602231 发表于 2018-4-27 15:22 | 显示全部楼层
你好,请问新唐003 flash当EEPROM的搞定了没
Walter_gan 发表于 2018-7-24 14:42 | 显示全部楼层
xinxianshi 发表于 2018-1-19 18:43
这个方面,官方提供了例子,我之前跑了一次测试, 没问题。

我也是,无法正常读出数据。读出的是00,盼新唐解决。
xinxianshi 发表于 2018-7-29 13:07 | 显示全部楼层
Walter_gan 发表于 2018-7-24 14:42
我也是,无法正常读出数据。读出的是00,盼新唐解决。

看下个版本了。自己按照手册操作是没问题的。
xixi2017 发表于 2018-7-29 15:33 | 显示全部楼层
发现新手不知道去下载BSP
cyj1232 发表于 2018-9-11 13:28 | 显示全部楼层
没有,我用官方的例程和论坛上的例子,都没有写进去,不知道什么原因,编译是没有问题,在调试窗口看,没有改写到,读出来,通过串口显示,读出的值为零,将读出地址改为其他已编程程序数据区,读出数据是正确的,就是数据没有写进去
cyj1232 发表于 2018-9-11 13:30 | 显示全部楼层
xixi2017“发现新手不知道去下载BSP”
当EEPROM用,和BSP有关系吗?

liulcf2018 发表于 2018-10-20 21:17 | 显示全部楼层
用新唐N76E003 BSP里的FLSAH模拟EEPROM,读写数据时会改变其他XRAM中的数据,什么原因????
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

20

帖子

1

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