找回密码
 立即注册
查看: 1201|回复: 4

求关于EEPROM的地址解惑

[复制链接]

该用户从未签到

1

主题

1

回帖

23

积分

新手上路

积分
23
发表于 2023-3-3 17:15:22 | 显示全部楼层 |阅读模式
QQ图片20230303171337.png

请问为什么stc片内EEPROM关闭操作的时候,示例上IAP_ADDR为什么设置成8000h啊?注释写着设置成非IAP区域,我查扇区地址这个位置不还是EEPROM的地址吗
回复 送花

使用道具 举报

该用户从未签到

550

主题

9217

回帖

1万

积分

管理员

积分
13944
发表于 2023-3-3 18:58:14 | 显示全部楼层
1.png

有些芯片8000H后已是无效地址,主要是要关闭 IAP允许位,这样就不会误擦除
  • TA的每日心情
    郁闷
    2024-1-18 18:18
  • 签到天数: 1 天

    [LV.1]初来乍到

    6

    主题

    22

    回帖

    136

    积分

    注册会员

    积分
    136
    发表于 2023-3-4 09:42:09 | 显示全部楼层
    搭车问下,STC8H3K64S2,EEPROM功能可以仿真不?

    该用户从未签到

    550

    主题

    9217

    回帖

    1万

    积分

    管理员

    积分
    13944
    发表于 2023-3-4 09:53:02 | 显示全部楼层
    可以仿真EEPROM
  • TA的每日心情
    郁闷
    2024-1-18 18:18
  • 签到天数: 1 天

    [LV.1]初来乍到

    6

    主题

    22

    回帖

    136

    积分

    注册会员

    积分
    136
    发表于 2023-3-4 14:01:20 | 显示全部楼层
    本帖最后由 LFB 于 2023-3-17 12:08 编辑

    MCU型号 STC8H3K64S2 设置用户EEPROM大小为1K
    1. //sfr IAP_CMD   = 0xC5;
    2. #define IAP_STANDBY()   IAP_CMD = 0     //IAP空闲命令(禁止)
    3. #define IAP_READ()      IAP_CMD = 1     //IAP读出命令
    4. #define IAP_WRITE()     IAP_CMD = 2     //IAP写入命令
    5. #define IAP_ERASE()     IAP_CMD = 3     //IAP擦除命令
    6. //sfr IAP_TRIG  = 0xC6;
    7. #define IAP_TRIG()  do{ IAP_TRIG = 0x5A,    IAP_TRIG = 0xA5 } while(0)     // IAP触发命令
    8. //                                      7    6    5      4    3   2  1   0   Reset Value
    9. //sfr IAP_CONTR = 0xC7;     IAPEN SWBS SWRST CFAIL  -   -  -   -   0000,x000    //IAP Control Register
    10. #define IAP_EN              (1<<7)
    11. #define IAP_SWBS            (1<<6)
    12. #define IAP_SWRST           (1<<5)
    13. #define IAP_CMD_FAIL        (1<<4)
    14. #define IAP_ENABLE()        do{ IAP_CONTR = IAP_EN; IAP_TPS = MAIN_Fosc / 1000000; } while(0)
    15. #define IAP_DISABLE()       do{ IAP_CONTR = 0; IAP_CMD = 0; IAP_TRIG = 0; IAP_ADDRH = 0xff; IAP_ADDRL = 0xff; } while(0)
    16. void F_EEPROM_Test(void)
    17. {
    18.     u16 EE_address = 0xFC00; <span style="color: rgb(255, 0, 0);">// 其实用IAP访问需从0000h开始(编辑增加说明)</span>
    19.     u8 WrDataBuf[9] = {0x55,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};
    20.     u8 RdDataBuf[9] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
    21.     u16 number;
    22.     EA = 0;     //禁止中断
    23.     // 先擦除
    24.     IAP_ENABLE();           //设置等待时间,允许IAP操作,送一次就够
    25.     IAP_ERASE();                        //宏调用, 送扇区擦除命令,命令不需改变时,不需重新送命令
    26.                                         //只有扇区擦除,没有字节擦除,512字节/扇区。
    27.                                         //扇区中任意一个字节地址都是扇区地址。
    28.     IAP_ADDRH = (EE_address) / 256;       //送扇区地址高字节(地址需要改变时才需重新送地址)
    29.     IAP_ADDRL = (EE_address) % 256;       //送扇区地址低字节
    30.     //触发EEPROM操作
    31.     IAP_TRIG = 0x5a; //写触发命令(0x5a)
    32.     IAP_TRIG = 0xa5; //写触发命令(0xa5)
    33.     _nop_();
    34.     // 写
    35.     IAP_ENABLE();           //设置等待时间,允许IAP操作,送一次就够
    36.     IAP_WRITE();                        //宏调用, 送扇区擦除命令,命令不需改变时,不需重新送命令
    37.     for (number = 0; number < 9; ++number)
    38.     {
    39.                                             //只有扇区擦除,没有字节擦除,512字节/扇区。
    40.                                             //扇区中任意一个字节地址都是扇区地址。
    41.         IAP_ADDRH = (EE_address) / 256;       //送扇区地址高字节(地址需要改变时才需重新送地址)
    42.         IAP_ADDRL = (EE_address) % 256;       //送扇区地址低字节
    43.         IAP_DATA = WrDataBuf[number];
    44.         //触发EEPROM操作
    45.         IAP_TRIG = 0x5a; //写触发命令(0x5a)
    46.         IAP_TRIG = 0xa5; //写触发命令(0xa5)
    47.         _nop_();
    48.         EE_address++;
    49.     }
    50.     EE_address = 0xFC00;           <font color="#ff0000">// 其实用IAP访问需从0000h开始(编辑增加说明)</font>
    51.     IAP_ENABLE();           //设置等待时间,允许IAP操作,送一次就够
    52.     IAP_READ();             //送字节读命令,命令不需改变时,不需重新送命令
    53.     for (number = 0; number < 9; ++number)
    54.     {
    55.         IAP_ADDRH = EE_address / 256; //设置 IAP 地址高字节
    56.         IAP_ADDRL = EE_address % 256; //设置 IAP 地址低字节
    57.         IAP_TRIG = 0x5a; //写触发命令(0x5a)
    58.         IAP_TRIG = 0xa5; //写触发命令(0xa5)
    59.         _nop_();
    60.         _nop_();
    61.         RdDataBuf[number] = IAP_DATA; //读 IAP 数据
    62.         EE_address++;
    63.     }
    64.     // 判断写入与读出数据是否相同
    65.     for (number = 0; number < 9; ++number)
    66.     {
    67.         if(RdDataBuf[number] != WrDataBuf[number])
    68.         {
    69.             break;
    70.         }
    71.     }
    72.     if(number < 9)
    73.     {
    74.         P55 = 0;
    75.         _nop_();    // 不同 [color=#ff0000]仿真运行时跳到此处[/color]
    76.     }
    77.     else
    78.     {
    79.         P55 = 1;
    80.         _nop_();    // 相同
    81.     }
    82.     EA = 1;     //使能中断
    83. }
    84. 能不能帮看看是哪的问题?谢谢.
    复制代码

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-4-26 12:47 , Processed in 0.061551 second(s), 47 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表