N76E003 APROM作为EEPROM使用的问题!

2020-01-13 18:31发布

N76E003跟stm8s003相比没有内部的eeprom,有教程通过用APROM分区(0x3800~0x38FF)作为内部eeprom使用;

  1. bit BIT_TMP;

  2. /* -------------------------------------------------------------------------*/
  3. /*  Dataflash use APROM area                                                                                                                         */
  4. /*        APROM 0x3800~0x38FF demo as dataflash                                                                                                     */
  5. /* Please use Memory window key in C:0x3800 to check earse result                                          */              
  6. /* -------------------------------------------------------------------------*/
  7. UINT8 read_APROM_BYTE(UINT16 code *u16_addr)
  8. {
  9.         UINT8 rdata;
  10.         rdata = *u16_addr>>8;
  11.         return rdata;
  12. }

  13. //-------------------------------------------------------------------------

  14. //-------------------------------------------------------------------------


  15. /*****************************************************************************************************************
  16. write_DATAFLASH_BYTE :
  17. user can copy all this subroutine into project, then call this function in main.
  18. ******************************************************************************************************************/               
  19. void write_DATAFLASH_BYTE(UINT16 u16_addr,UINT8 u8_data)
  20. {
  21.        
  22.         UINT8 looptmp=0,u8_addrl_r;
  23.         unsigned char code *cd_longaddr;
  24.         unsigned char xdata *xd_tmp;
  25.        
  26. //Check page start address
  27.         u8_addrl_r = u16_addr;
  28.         if (u8_addrl_r<0x80)
  29.         {
  30.                 u8_addrl_r = 0;
  31.         }
  32.         else
  33.         {
  34.                 u8_addrl_r = 0x80;
  35.         }
  36. //Save APROM data to XRAM
  37.         xd_tmp = 0x80;
  38.         cd_longaddr = (u16_addr&0xff00)+u8_addrl_r;       
  39.         while (xd_tmp !=0x100)
  40.         {
  41.                 *xd_tmp = *cd_longaddr;
  42.                 looptmp++;
  43.                 xd_tmp++;
  44.                 cd_longaddr++;
  45.         }
  46. // Modify customer data in XRAM
  47.         u8_addrl_r = u16_addr;
  48.         if (u8_addrl_r<0x80)
  49.         {
  50.                 xd_tmp = u8_addrl_r+0x80;
  51.         }
  52.         else
  53.         {
  54.                 xd_tmp = u8_addrl_r+0;
  55.         }
  56.         *xd_tmp = u8_data;
  57. //Erase APROM DATAFLASH page
  58.                 IAPAL = u16_addr;
  59.                 IAPAH = u16_addr>>8;
  60.                 IAPFD = 0xFF;
  61.           set_IAPEN;
  62.                 set_APUEN;
  63.     IAPCN = 0x22;                
  64.                 set_IAPGO;
  65. //Save changed RAM data to APROM DATAFLASH
  66.         u8_addrl_r = u16_addr;
  67.         if (u8_addrl_r<0x80)
  68.         {
  69.                 u8_addrl_r =0;
  70.         }
  71.         else
  72.         {
  73.                 u8_addrl_r = 0x80;
  74.         }
  75.                 xd_tmp = 0x80;
  76.           IAPAL = u8_addrl_r;
  77.     IAPAH = u16_addr>>8;
  78.                 set_IAPEN;
  79.                 set_APUEN;
  80.           IAPCN = 0x21;
  81.                 while (xd_tmp !=0xFF)
  82.                 {
  83.                         IAPFD = *xd_tmp;
  84.                         set_IAPGO;
  85.                         IAPAL++;
  86.                         xd_tmp++;
  87.                 }
  88.                 clr_APUEN;
  89.                 clr_IAPEN;
  90. }   
复制代码
单独的读写验证已经通过,但是当定义如下结构体之后,就无法进行写操作了,

  1. typedef_split3 DisMenu[7]=
  2. {
  3.   {13,0x81,0x01},/* 'P' '1.' '1'*/
  4.   {13,0x81,0x02},/* 'P' '1.' '2'*/
  5.   {13,0x81,0x03},/* 'P' '1.' '3'*/

  6.   {13,16,0x02},/* 'P' '-' '2'*/

  7.   {13,0x83,0x01},/* 'P' '3.' '1'*/
  8.   {13,0x83,0x02},/* 'P' '3.' '2'*/

  9.   {13,16,0x04},/* 'P' '-' '4'*/
  10. };
复制代码
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
10条回答
90999
1楼-- · 2020-01-13 23:01
那就不用结构体吧。
Ray______
2楼-- · 2020-01-14 04:26
 精彩回答 2  元偷偷看……
mandey
3楼-- · 2020-01-14 05:07
这个Demo是整页操作的,先把整页的数据保存在Xdata中,然后把要写的数据组合起来,再一次性写入Flash
涵潇舒雅
4楼-- · 2020-01-14 06:07
Ray______ 发表于 2017-10-22 15:12
我是最后放弃了这个DEMO的函数,自己根据手册里的程序按自己的需求写了几个API,现在没啥问题。 ...

前辈,弄否分享一下?感觉这个DEMO太吃内存了~
涵潇舒雅
5楼-- · 2020-01-14 10:47
mandey 发表于 2017-10-22 19:17
这个Demo是整页操作的,先把整页的数据保存在Xdata中,然后把要写的数据组合起来,再一次性写入Flash ...

好像是你说的这种操作,Flash必须整页擦除?
涵潇舒雅
6楼-- · 2020-01-14 16:36
90999 发表于 2017-10-22 11:19
那就不用结构体吧。

好像是DEMO Flash操作,太吃内存了,我这边一旦定义比较大的全局变量,就有问题,现在先用code修饰一下

一周热门 更多>