[STM8] STM8L101F3 EEPROM解锁问题求解...

[复制链接]
11171|29
 楼主| rgb365 发表于 2013-3-2 15:08 | 显示全部楼层 |阅读模式
本帖最后由 rgb365 于 2013-3-2 17:17 编辑

曾经用过st的单片机,对其天书般的文档感觉很不爽,这次用到EEPROM,又被折腾得晕头转向。以下是相关代码和调试情况,请高手帮忙看下:

单片机为STM8L101F3,按手册介绍,其EEPROM为8k(DATA区占2k),末地址为0x9ffff。
调试环境为STVD+COSMIC
仿真器为ST-LINK

void testEEPROM(void) {                //测试EEPROM的字节读写功能
        unsigned char byteTest;
        byteTest = *((@far byte*) 0x9fff);//此句能正确读取0x9fff中的数据,
                                          //且该数据能通过memory窗口进行改写
        //FLASH_CR2=0x01;                  //此句执行时仿真器会报告响应超时,只好去掉
        FLASH_DUKR=0xAE;                  //此句执行前FLASH_IAPSR的初始值为0x4a
        FLASH_DUKR=0x56;                  //即DUL位上电后为1,不知何故?
        while (!(FLASH_IAPSR & 0x08));          //此句能正常跳出while循环
        *((@far byte*) 0x9fff) = 0x55;    //此句执行前后,memory窗口显示0x9fff的值不变
        while (!(FLASH_IAPSR & 0x04));
        byteTest = *((@far byte*) 0x9fff);//byteTest还是原来的值,0x55未被正常写入
}

STM8L101.H文件中相关寄存器的定义如下:
        DEF_8BIT_REG_AT(FLASH_IAPSR,0x5054);
        
 楼主| rgb365 发表于 2013-3-2 17:04 | 显示全部楼层
本帖最后由 rgb365 于 2013-3-2 17:16 编辑

郁闷呀!
更为奇特的是,进到DEBUG模式FLASH_IAPSR的初始值就是0x01001010,
写入第一个密码字节0xAE时FLASH_IAPSR变为0x01000010,
第二个字节密码随便写入一个数,FLASH_IAPSR又恢复初始值0x01001010。
eeprom.JPG
不是说两个密码字节都写对后DUL位才由0变1吗?这DUL什么玩意呀?
难道我今天撞鬼了?!
哪位大神帮看一下呀?拜托!!!
 楼主| rgb365 发表于 2013-3-2 17:08 | 显示全部楼层
本帖最后由 rgb365 于 2013-3-2 17:15 编辑

eeprom.JPG
补上截图。
cjhk 发表于 2013-3-2 20:29 | 显示全部楼层
呵呵   帮你顶一个   ST的代码设计确实感觉没有430单片机设计的好   呵呵   不过用的时间长了  熟悉了  就好了  呵呵   顶一个
南宫云明 发表于 2013-4-24 10:38 | 显示全部楼层
我也碰到和楼主一样的问题,真的是一模一样,有没有大神能帮忙解答呀!!!!!!
giant0113 发表于 2013-8-14 17:53 | 显示全部楼层
版主啊,我也遇到这问题,出来救我们啊
cjhk 发表于 2013-8-14 19:26 | 显示全部楼层
不是很了解这一块   楼主   帮你顶一个  看看别人的意见   应该可以解决
lxsky 发表于 2014-3-7 11:05 | 显示全部楼层
楼主的问题解决没?我也遇到这个问题。
我的现象是,用仿真器下载程序后,第一次调试运行是能写入数据的,但直接用仿真器复位或掉电复位后运行,都是写不进去的。
同样的程序我在 stm8L151上运行都是可以的,在stm8L101上就不行。
郁闷呀!!!!!!!
lxsky 发表于 2014-3-7 12:57 | 显示全部楼层
功夫不负有心人,终于让我试出来了。
解锁的时候不用对 FLASH_DUKR 操作,而是对 FLASH_PUKR操作,先写0x56,再写0xAE。就OK了
我的理解是101这个芯片的是没有EEPROM的,不过ST的FLASH也是EEPROM做的,写保护也是按FLASH做的。
手册不对害死人呀,郁闷几天了。
香水橙 发表于 2014-3-7 13:03 | 显示全部楼层
恭喜LZ,顺便谴责一下写文档的人。
nienianhong 发表于 2014-3-7 17:39 | 显示全部楼层
101F3没有内置EEPROM的!
youth_jack 发表于 2014-4-26 09:14 | 显示全部楼层
lxsky 发表于 2014-3-7 12:57
功夫不负有心人,终于让我试出来了。
解锁的时候不用对 FLASH_DUKR 操作,而是对 FLASH_PUKR操作,先写0x56 ...

很对,我也碰到EEPROM写不进去,仿真可以写,脱机就写不了。试了你的方法,果然搞定,多谢分享!
maskuang 发表于 2014-5-6 15:29 | 显示全部楼层
还是不懂,有没有完整的写法?
zy19860818 发表于 2014-5-8 08:38 来自手机 | 显示全部楼层
楼主辛苦了,谢谢分享经验~~~
lzzd0918 发表于 2014-10-12 01:19 来自手机 | 显示全部楼层
回头试试。今天测试s103的现象一样。
pofu007 发表于 2014-10-13 09:39 | 显示全部楼层
建议直接调用ST自己的库就好。
// Unlock data memory
FLASH_Unlock(FLASH_MEMTYPE_DATA);
        
// Wait until Data EEPROM area unlocked flag is set
while (FLASH_GetFlagStatus(FLASH_FLAG_DUL) == RESET)
{}   
FLASH_ProgramByte(Addr, byte);
FLASH_WaitForLastOperation(FLASH_MEMTYPE_DATA);      
FLASH_Lock(FLASH_MEMTYPE_DATA);
复古沙土 发表于 2014-12-19 00:11 | 显示全部楼层
也碰到了,操作data只能写一次,第二次就卡在while((FLASH->IAPSR)&FLASH_FLAG_EOP==0);
现在直接操作flash的方式,寄存器测试通过可以重复读写的

void EEPROM_WriteBytes(uint16_t Addr,uint8_t *Buffer,uint8_t Length)
{
  uint8_t i=0;
  uint32_t wAddr;
  wAddr=EEPROM_BASE_ADDR+Addr;
  __disable_interrupt();       
  FLASH->CR1 = 0x00;
  FLASH->CR2 = 0x00;
  while((FLASH->IAPSR&FLASH_FLAG_PUL)==0)
  {
    FLASH->PUKR = 0x56;
    FLASH->PUKR = 0xAE;
  }
  for(i=0;i<Length;i++)
  {
    *(PointerAttr uint8_t*)(uint16_t)(wAddr+i )= *Buffer;
    while((FLASH->IAPSR)&FLASH_FLAG_EOP==0);
    Buffer++;
  }
  FLASH->IAPSR &= 0xFD;
  sdkFLASH_WaitForLastOperation();
  __enable_interrupt();
}
lygogyl 发表于 2015-4-20 18:22 | 显示全部楼层
好贴 解决了我的问题了  非常感谢
eurphan 发表于 2015-4-20 23:12 | 显示全部楼层
不懂帮顶      ,
dipingzhu 发表于 2015-4-22 16:42 | 显示全部楼层
还是不行!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

3

帖子

0

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