samdcn 发表于 2026-5-23 08:15:54

EEPROM stc8H8k64U写入问题

请问我在44M或以上时,其中中断也关了,在大量写入区块数据时写不全,读取时只有前一部分正常随机的,频率低点时都很正常,
我参考的是官方的例程,请问还有什么要注意的问题,谢谢
例子如下



#define ENABLE_IAP 0x80         //if SYSCLK<30MHz   用了


u8 IapReadByte(u16 addr)
{
    u8 dat;                     //数据缓冲区
                          
    IAP_CONTR = ENABLE_IAP;         //使能IAP
    IAP_TPS=44;                //设置等待参数44MHz
    IAP_CMD = CMD_READ;             //设置IAP命令
    IAP_ADDRL = addr;               //设置IAP低地址
    IAP_ADDRH = addr >> 8;          //设置IAP高地址
    IAP_TRIG = 0x5a;                //写触发命令(0x5a)
    IAP_TRIG = 0xa5;                //写触发命令(0xa5)
   
    _nop_();                        //等待ISP/IAP/EEPROM操作完成
    dat = IAP_DATA;               //读ISP/IAP/EEPROM数据
    IapIdle();                      //关闭IAP功能

    return dat;                     //返回
}



void IapProgramByte(u16 addr, u8 dat)
{
    IAP_CONTR = ENABLE_IAP;         //使能IAP
    IAP_TPS=44;                //设置等待参数48MHz
    IAP_CMD = CMD_PROGRAM;          //设置IAP命令
    IAP_ADDRL = addr;               //设置IAP低地址
    IAP_ADDRH = addr >> 8;          //设置IAP高地址
    IAP_DATA = dat;               //写ISP/IAP/EEPROM数据
    IAP_TRIG = 0x5a;                //写触发命令(0x5a)
    IAP_TRIG = 0xa5;                //写触发命令(0xa5)
    _nop_();                        //等待ISP/IAP/EEPROM操作完成
    _nop_();
   while (IAP_CONTR & 0x01);// 等待IAP操作完成
    IapIdle();
}



。。。。

EA =0;
                                IE2 &= ~0x20;        //暂停定时器3中断
                                IE2 &= ~0x40;
                                IapEraseSector(IAP_ADDRESS+0x200);
                                IapProgramByte(IAP_ADDRESS+0x200, Gateway_IP);                
                                IapProgramByte(IAP_ADDRESS+0x201, Gateway_IP);                       
                                IapProgramByte(IAP_ADDRESS+0x202, Gateway_IP);               
                                IapProgramByte(IAP_ADDRESS+0x203, Gateway_IP);
                                IapProgramByte(IAP_ADDRESS+0x204, Sub_Mask);                
                                IapProgramByte(IAP_ADDRESS+0x205, Sub_Mask);                       
                                IapProgramByte(IAP_ADDRESS+0x206, Sub_Mask);               
                                IapProgramByte(IAP_ADDRESS+0x207, Sub_Mask);
                                IapProgramByte(IAP_ADDRESS+0x208, IP_Addr);                
                                IapProgramByte(IAP_ADDRESS+0x209, IP_Addr);                       
                                IapProgramByte(IAP_ADDRESS+0x20a, IP_Addr);               
                                IapProgramByte(IAP_ADDRESS+0x20b, IP_Addr);
                                IapProgramByte(IAP_ADDRESS+0x20c, S0_DIP);
                                IapProgramByte(IAP_ADDRESS+0x20d, S0_DIP);
                                IapProgramByte(IAP_ADDRESS+0x20e, S0_DIP);
                                IapProgramByte(IAP_ADDRESS+0x20f, S0_DIP);       

                                {
                                u8 i;
                                for (i=0;i<9;i++)
                                        IapProgramByte(IAP_ADDRESS+0x210+i, mqtt_SubscribeTopic);
                                }       
                                IE2 |= 0x20;        //重启定时器3中断
                                IE2 |= 0x40;                        
                                EA = 1;

。。。。


请大佬指教

狂热主宰 发表于 2026-5-23 09:58:49

可能内部的eeprom在某段频率区间操作稳定
提高单片机整体的工作频率则性能更强
但操作eeprom时可能需要调整频率
设置动态频率调整也许可行
频率调整偏离官方例程
可能需对多个芯片
抽样测试

wulin 发表于 2026-5-23 16:27:26

多加几个_nop_();试试
页: [1]
查看完整版本: EEPROM stc8H8k64U写入问题