找回密码
 立即注册
查看: 431|回复: 5

STC8051U-34K64-LQFP48 芯片EEPROM的疑问?

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:121
  • 最近打卡:2025-05-01 19:17:52
已绑定手机

19

主题

208

回帖

492

积分

中级会员

积分
492
发表于 2024-7-18 16:17:51 | 显示全部楼层 |阅读模式
我使用 20.5.1 例程中的 4个EEPROM基本函数,然后把操作中间和最后的 EEPROM 数据通过串口上送PC机显示,进行EEPROM操作测试, 发现操作结果如下:

1. 烧写程序时设置 EEPROM 32K, 系统时钟 22.1184MHz,  【我的测试程序代码只有2K不到】

2. 程序上电完成串口初始化之后,先读出 0x000000uL 地址开始的 32 字节,发现这32字节和 我的程序代码开头处的 32 字节完全相同;
     for(i=0, add=0x000000uL ; i<32; i++, add++) IapRead(add);

3. 再擦除 0x004000uL 地址处的1个扇区;
    IapErase(0x004000uL);

3. 然后读出 0x004000uL 地址开始的 32字节, 发现   这32字节 都是 0xFF
     for(i=0, add=0x004000uL ; i<32; i++, add++) IapRead(add);

4. 对 0x004000uL 地址开始 写入16字节
   memcpy(w_buf, "0123456789ABCDEF", 16);
       
   for(u16_i=0u, u32_addr=0x004000uL; u16_i<16u; u16_i++, u32_addr++)
  {
        IapProgram(u32_addr, w_buf[u16_i]);                //EEPROM 0x004000 开始写入16字节
  }

5.  读出 0x004000uL 地址开始的 32字节, 发现   这32字节中,前16字节 是 "0123456789ABCDEF", 后16字节 都是 0xFF
     for(i=0, add=0x004000uL ; i<32; i++, add++) IapRead(add);
//==============================================================================

第二次测试:  程序下载后,执行
  IapErase(0x000000uL);   
然后再读出32字节
   for(i=0, add=0x000000uL ; i<32; i++, add++) IapRead(add);
  
  上电之后的时候,程序传输一次数据后,状态就乱了  【应该是程序第一扇区被擦除了, IAP的4个函数在C文件的最后,不使用第一扇区】

测试结论: 在 STC8051U-34K64-LQFP48 上面,   EEPROM的划分 似乎不像 芯片文档 20.4.1 的描述

请问版主,是这样的情况吗? 或者说不同的芯片型号,操作 EEPROM 还是有区别的? 如果是的话,文档也应该单独说明一下,谢谢!
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2024-7-18 16:57:59 | 显示全部楼层
absacc.h是个好东西

没注释掉的Iap_Read_Byte效率比注释掉的Iap_Read_Byte效率高些

读EEPROM
IAP寄存器访问的是相对地址,首地址为0
MOVC访问的是绝对地址,EEPROM从后向前规划,首地址由STCISP决定(可自定义EEPROM大小的型号)



#include <absacc.h>



#define                IAP_OFFSET        0x2000        //EEPROM首地址(STC8G1K08A)





void Iap_Idle(void)

{

        IAP_CONTR&=~IAPEN;

        IAP_CMD=IAP_IDL;

        IAP_TRIG=0x00;

        IAP_ADDRH=0x80;

        IAP_ADDRL=0x00;

}



unsigned char Iap_Read_Byte(unsigned char sector,unsigned int addr)

{

        return *(CBYTE+IAP_OFFSET+sector*0x0200+addr);

}



//unsigned char Iap_Read_Byte(unsigned char sector,unsigned int addr)

//{

//        unsigned char dat;

//        unsigned int add;

//        add=sector*0x0200+addr;

//        IAP_CONTR|=IAPEN;

//        IAP_TPS=IAP_TPS_;

//        IAP_CMD=IAP_READ;

//        IAP_ADDRL=add;

//        IAP_ADDRH=add>>8;

//        IAP_TRIG=0x5A;

//        IAP_TRIG=0xA5;

//        _nop_();

//        dat=IAP_DATA;

//        Iap_Idle();

//        return dat;

//}



void Iap_Program_Byte(unsigned char sector,unsigned int addr,unsigned char dat)

{

        unsigned int add;

        add=sector*0x0200+addr;

        IAP_CONTR|=IAPEN;

        IAP_TPS=IAP_TPS_;

        IAP_CMD=IAP_WRITE;

        IAP_ADDRL=add;

        IAP_ADDRH=add>>8;

        IAP_DATA=dat;

        IAP_TRIG=0x5A;

        IAP_TRIG=0xA5;

        _nop_();

        Iap_Idle();

}



void Iap_Erase_Sector(unsigned char sector)

{

        unsigned int add;

        add=sector*0x0200;

        IAP_CONTR|=IAPEN;

        IAP_TPS=IAP_TPS_;

        IAP_CMD=IAP_ERASE;

        IAP_ADDRL=add;

        IAP_ADDRH=add>>8;

        IAP_TRIG=0x5A;

        IAP_TRIG=0xA5;

        _nop_();

        Iap_Idle();

}

DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2024-7-18 16:59:49 | 显示全部楼层

读EEPROM时,
注意IAP寄存器是相对地址,MOVC是绝对地址
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:121
  • 最近打卡:2025-05-01 19:17:52
已绑定手机

19

主题

208

回帖

492

积分

中级会员

积分
492
发表于 2024-7-18 19:57:07 | 显示全部楼层
补充一点,我用的是C251编译器
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:121
  • 最近打卡:2025-05-01 19:17:52
已绑定手机

19

主题

208

回帖

492

积分

中级会员

积分
492
发表于 2024-8-1 22:10:12 | 显示全部楼层
今天使用C51中STC8H1K24芯片(此型号的芯片有固定的4K字节EEPROM)上使用IAP函数操作EEPROM,发现EEPROM的操作地址和文档写的一样,就是从 0x0000 开始是EEPROM的第一个扇区;
而 前面1楼所写 STC8051U的EEPROM地址中C251下使用IAP函数操作时, 貌似和文档描述不同; 不知道哪位师傅也这样测试过没有?
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:121
  • 最近打卡:2025-05-01 19:17:52
已绑定手机

19

主题

208

回帖

492

积分

中级会员

积分
492
发表于 2024-8-1 22:12:44 | 显示全部楼层
Debu*** 发表于 2024-7-18 16:59
读EEPROM时,
注意IAP寄存器是相对地址,MOVC是绝对地址

C251下,IAP函数操作 STC8051U 的EEPROM 使用的是3字节地址, 应该不同于 STC8H系列 的2字节操作地址。
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 02:32 , Processed in 0.112470 second(s), 73 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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