[技术问答] N76E003/N76E616 減少模擬EEPROM時所需的緩存空間(RAM)

[复制链接]
1292|11
 楼主| liuje 发表于 2020-11-4 16:23 | 显示全部楼层 |阅读模式
本帖最后由 liuje 于 2020-11-7 13:00 编辑

如題, 這兩天測ˋ試模擬EEPROM,  官方範例以及網頁找的資料, 大多都是一整頁(128bytes)讀寫緩存方式.
對於003以及616兩款小內存MCU來說, 極端浪費RAM.     又自己只需要10bytes記憶就足夠了.   
就拿先人的代碼做了點小修改.  最多可使用16bytes的記憶.  然後使用16bytes xdata做為緩存(使用xdata最上層的地址空間0xf0~0xff).
只要代碼使用的xdata區不超過240個地址(指N76E616).   應該都可以正常使用.    參考如下 :
叫用方式:


// 使用APROM 18K最上層128bytes(0x4780~0x47ff)
// 地址必須對齊128bytes, 否則無法正常使用, 合法地址如 : 0x4600, 0x4680, 0x4700, 0x4780.....
#define ADDR_BASE 0x4780
#define XDATA_TOP 0xf0                // N76E616 xdata空間為256bytes, 最後16個地址為0xf0~0xff
//#define XDATA_TOP 0x2f0        // N76E003 xdata空間為768bytes, 最後16個地址為0x2f0~0x2ff

uint8_t data;
data = read_APROM_BYTE(ADDR_BASE);        // 讀取1個地址
write_DATAFLASH_BYTE(ADDR_BASE, 01);      // 寫入特定地址
write_DATAFLASH_BYTE(ADDR_BASE+1, 01);  // 寫入特定地址
write_DATAFLASH_BYTE(ADDR_BASE+2, 02);  // 寫入特定地址
---------------------------------------------------------------------------------------------------------------------------
另外,在Keil C51的程序優化設置, 必須使用 "等級8" (官方範例代碼也是等級8), 如使用等級9, 則無法使用. 請注意 !
2020-11-07_09-57-04.jpg

(另附上N76E003可用的Project,  使用xdata最高地址0x2f0~0x2ff共16bytes做為寫入緩存)

  1. /**
  2. * 讀取存儲到APROM的數據
  3. * 模擬EEPROM使用
  4. */
  5. uint8_t read_APROM_BYTE(uint16_t code *u16_addr)
  6. {
  7.     uint8_t rdata;
  8.     rdata = *u16_addr>>8;
  9.     return rdata;
  10. }

  11. /**
  12. * 寫數據到APROM
  13. * 模擬EEPROM使用
  14. */
  15. void write_DATAFLASH_BYTE(uint16_t u16_addr,uint8_t u8_data)
  16. {
  17.     uint8_t looptmp=0,u8_addrl_r;
  18.     uint8_t code *cd_longaddr;
  19.     uint8_t xdata *xd_tmp;
  20.         
  21.     //檢查頁起始地址
  22.     u8_addrl_r = u16_addr;
  23.     if (u8_addrl_r<0x80)
  24.     {
  25.         u8_addrl_r = 0;
  26.     }
  27.     else
  28.     {
  29.         u8_addrl_r = 0x80;
  30.     }        
  31.         // 保存 APROM 數據到 XRAM
  32.         // 如是 N76E616, 將佔用xdata 256bytes的最高層16個地址, 即 0xf0 ~ 0xff.
  33.         // 如果是76E003, 可修改 : "#define XDATA_TOP 0x2f0" , 將使用xdata 768bytes的最上層16個地址, 即0x2f0 ~ 0x2ff.
  34.     xd_tmp = XDATA_TOP;               
  35.                                                         
  36.     cd_longaddr = (u16_addr&0xff00)+u8_addrl_r;
  37.     while (xd_tmp <= (XDATA_TOP+0x10) )                // 備份原來APROM的資料(16bytes)到xdata緩存
  38.     {
  39.         *xd_tmp = *cd_longaddr;
  40.         looptmp++;
  41.         xd_tmp++;
  42.         cd_longaddr++;
  43.     }
  44.     //在 XRAM 中修改數據
  45.     u8_addrl_r = u16_addr;
  46.         xd_tmp = (u8_addrl_r&0x7f)+XDATA_TOP;
  47.     *xd_tmp = u8_data;
  48.         //擦除 APROM DATAFLASH 頁(擦除128bytes)
  49.     IAPAL = u16_addr;
  50.     IAPAH = u16_addr>>8;
  51.     IAPFD = 0xFF;
  52.     set_IAPEN;
  53.     set_APUEN;
  54.     IAPCN = 0x22;
  55.     set_IAPGO;
  56.         
  57.         //保存修改的 RAM 數據到 APROM DATAFLASH
  58.     u8_addrl_r = u16_addr;                                  // 取APROM寫入起始地址低8位
  59.     if (u8_addrl_r<0x80)
  60.     {
  61.         u8_addrl_r =0;
  62.     }
  63.     else
  64.     {
  65.         u8_addrl_r = 0x80;
  66.     }        
  67.     xd_tmp = XDATA_TOP;
  68.     IAPAL = u8_addrl_r;
  69.     IAPAH = u16_addr>>8;
  70.     set_IAPEN;
  71.     set_APUEN;
  72.     IAPCN = 0x21;
  73.     while (xd_tmp <= (XDATA_TOP+0x10) )                // 從備份的xdata資料中寫入16bytes到APROM
  74.     {
  75.         IAPFD = *xd_tmp; //寫數據到IAPFD
  76.         set_IAPGO;
  77.         IAPAL++;
  78.         xd_tmp++;
  79.     }
  80.     clr_APUEN;
  81.     clr_IAPEN;
  82. }


N76E003_EEPROM-test1.rar

147.15 KB, 下载次数: 17

yangxiaor520 发表于 2020-11-4 17:58 来自手机 | 显示全部楼层
用RAM模拟EEPROM,掉电后RAM数据也消失了啊。
 楼主| liuje 发表于 2020-11-4 18:49 | 显示全部楼层
yangxiaor520 发表于 2020-11-4 17:58
用RAM模拟EEPROM,掉电后RAM数据也消失了啊。

非也, 是使用 "APROM" 來模擬EEPROM,  不是RAM.     RAM只是用來緩存寫入用的.  因為FLASH必須以頁為單位做寫入.   
jekey 发表于 2020-11-4 19:42 | 显示全部楼层
以页为单位,使用多页来循环,就可以少占用ram了。
antusheng 发表于 2020-11-5 21:41 | 显示全部楼层
这种操作我很少用,不会。
yiyigirl2014 发表于 2020-11-5 23:21 | 显示全部楼层
Flash模拟EEPROM啊
dongnanxibei 发表于 2020-11-6 21:24 | 显示全部楼层
比传统的51方便多了,一片能解决好几个芯片解决的问题。
caoqing 发表于 2020-11-7 09:22 | 显示全部楼层
可否发个完整的程序?
 楼主| liuje 发表于 2020-11-7 13:03 | 显示全部楼层
caoqing 发表于 2020-11-7 09:22
可否发个完整的程序?

已提供適用N76E003的代碼包, 請參考.   代碼也做了少許修改, 同時適用N76E003/N76E616.
caoqing 发表于 2020-11-7 13:32 | 显示全部楼层
liuje 发表于 2020-11-7 13:03
已提供適用N76E003的代碼包, 請參考.   代碼也做了少許修改, 同時適用N76E003/N76E616. ...

没找到,麻烦给个链接,谢谢!
 楼主| liuje 发表于 2020-11-7 14:59 | 显示全部楼层
caoqing 发表于 2020-11-7 13:32
没找到,麻烦给个链接,谢谢!

1樓的  "附件"  啊 !      (N76E003_EEPROM-test1.rar)
caoqing 发表于 2020-11-15 16:00 | 显示全部楼层
liuje 发表于 2020-11-7 14:59
1樓的  "附件"  啊 !      (N76E003_EEPROM-test1.rar)

修改程序时模拟EEPROM一样会擦出,可否用N76E003的1K空间Flash配置成LDROM做为EEPROM,另外17K做ADROM,程序在ADROM中运行,用ADROM更改LDROM数据,再更改程序时就不会擦出,不行可否?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

21

帖子

1

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