打印
[STM8]

STM8L101F3 EEPROM解锁问题求解...

[复制链接]
10107|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。

不是说两个密码字节都写对后DUL位才由0变1吗?这DUL什么玩意呀?
难道我今天撞鬼了?!
哪位大神帮看一下呀?拜托!!!

使用特权

评论回复
板凳
rgb365|  楼主 | 2013-3-2 17:08 | 只看该作者
本帖最后由 rgb365 于 2013-3-2 17:15 编辑


补上截图。

使用特权

评论回复
地板
cjhk| | 2013-3-2 20:29 | 只看该作者
呵呵   帮你顶一个   ST的代码设计确实感觉没有430单片机设计的好   呵呵   不过用的时间长了  熟悉了  就好了  呵呵   顶一个

使用特权

评论回复
5
南宫云明| | 2013-4-24 10:38 | 只看该作者
我也碰到和楼主一样的问题,真的是一模一样,有没有大神能帮忙解答呀!!!!!!

使用特权

评论回复
6
giant0113| | 2013-8-14 17:53 | 只看该作者
版主啊,我也遇到这问题,出来救我们啊

使用特权

评论回复
7
cjhk| | 2013-8-14 19:26 | 只看该作者
不是很了解这一块   楼主   帮你顶一个  看看别人的意见   应该可以解决

使用特权

评论回复
8
lxsky| | 2014-3-7 11:05 | 只看该作者
楼主的问题解决没?我也遇到这个问题。
我的现象是,用仿真器下载程序后,第一次调试运行是能写入数据的,但直接用仿真器复位或掉电复位后运行,都是写不进去的。
同样的程序我在 stm8L151上运行都是可以的,在stm8L101上就不行。
郁闷呀!!!!!!!

使用特权

评论回复
9
lxsky| | 2014-3-7 12:57 | 只看该作者
功夫不负有心人,终于让我试出来了。
解锁的时候不用对 FLASH_DUKR 操作,而是对 FLASH_PUKR操作,先写0x56,再写0xAE。就OK了
我的理解是101这个芯片的是没有EEPROM的,不过ST的FLASH也是EEPROM做的,写保护也是按FLASH做的。
手册不对害死人呀,郁闷几天了。

使用特权

评论回复
10
香水橙| | 2014-3-7 13:03 | 只看该作者
恭喜LZ,顺便谴责一下写文档的人。

使用特权

评论回复
11
nienianhong| | 2014-3-7 17:39 | 只看该作者
101F3没有内置EEPROM的!

使用特权

评论回复
12
youth_jack| | 2014-4-26 09:14 | 只看该作者
lxsky 发表于 2014-3-7 12:57
功夫不负有心人,终于让我试出来了。
解锁的时候不用对 FLASH_DUKR 操作,而是对 FLASH_PUKR操作,先写0x56 ...

很对,我也碰到EEPROM写不进去,仿真可以写,脱机就写不了。试了你的方法,果然搞定,多谢分享!

使用特权

评论回复
13
maskuang| | 2014-5-6 15:29 | 只看该作者
还是不懂,有没有完整的写法?

使用特权

评论回复
14
zy19860818| | 2014-5-8 08:38 | 只看该作者
楼主辛苦了,谢谢分享经验~~~

使用特权

评论回复
15
lzzd0918| | 2014-10-12 01:19 | 只看该作者
回头试试。今天测试s103的现象一样。

使用特权

评论回复
16
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);

使用特权

评论回复
17
复古沙土| | 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();
}

使用特权

评论回复
18
lygogyl| | 2015-4-20 18:22 | 只看该作者
好贴 解决了我的问题了  非常感谢

使用特权

评论回复
19
eurphan| | 2015-4-20 23:12 | 只看该作者
不懂帮顶      ,

使用特权

评论回复
20
dipingzhu| | 2015-4-22 16:42 | 只看该作者
还是不行!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

3

帖子

0

粉丝