[STM8] STM8S的EEPROM块操作成功了吗,神一般的COSMIC。

[复制链接]
 楼主| gtw 发表于 2012-5-26 11:10 | 显示全部楼层 |阅读模式
从现有资料上和常识上来看,完成STM8S的EEPROM操作应该是不困难的,何况ST还提供的一些范例和外设操作的库。但是实际了解的情况是,多数人还是愿意使用字节写、字写,好像使用块操作的很少,好像很少吧。
各位尝试使用块操作的伙计们,也许使用标准写还比较容易成功吧,但是进行块擦写似乎不是那么容易成功,遍历网上遇到此类问题的同志们,似乎没有几个结案的,是真的无法解决,还是解决了就没有下文了?不能再这个样子了!咱们还是放一个方案吧。
我很怀疑这些问题真的是没有结案,还是我理解错了。SO,在公布我的答案之前,先卖个关子,我很有兴趣调查一下大家有多少已经结案了,有多少尚未结案?大家都来说说。
cgha 发表于 2012-6-2 13:40 | 显示全部楼层
块操作可能实际情况用到的比较少,因为都是部分更新内容。我的字编程都没成功。
块编程需要部分代码在RAM中运行,设置起来也比较麻烦吧。
 楼主| gtw 发表于 2012-6-17 17:41 | 显示全部楼层
块操作的优势就是单位字节保存耗时最少,然而我发现用这种方法的并不多。
字节编程和字编程操作起来都还好吧,但是字块的编程和擦除也有些地雷,可能有些时候能遇到,也许遇不到。
lzymcu 发表于 2012-7-30 22:52 | 显示全部楼层
我试过了,一写就死,据说要放到RAM运行,搞不懂放弃了
lzymcu 发表于 2012-7-30 22:53 | 显示全部楼层
我试过了,一写就死,据说要放到RAM运行,搞不懂放弃了
liuxiaoyun1210 发表于 2012-9-4 10:57 | 显示全部楼层
是啊!块写就立马死,有没有高手搞定了呀!FLASH编程必须用块编程呀!
bs1234 发表于 2012-11-28 22:28 | 显示全部楼层
他妈的ST,傲慢要死,块到现在都没有给出答案。
明月小厨 发表于 2012-11-30 14:19 | 显示全部楼层
本来就是这样,私下估计块操作写的时候占用了FLASH总线;所以必须放在RAM里执行;
编译器已经考虑到这个事情了,所以提供了一些简单的处理方案;

就是写操作的函数声明一下要在RAM里运行;然后你自己搬过去再调用即可;
明月小厨 发表于 2012-12-11 21:03 | 显示全部楼层
我试过块写入并不困难,128字节;事后查看结果正确;
但开始写入及写入后程序在RAM里运行,调试时看不清楚它在干什么;然后就一直看不清楚,直到你失去耐心;
难道任务完成后的标志位一直没有出现吗?我再试试看;
明月小厨 发表于 2012-12-12 16:10 | 显示全部楼层
找些例程来看看吧,手头正好有风驰的开发板资料,于是满怀希望......
先看目录,果然有关的说明,继续找PDF文档,——结果没有这部分的内容;
再看例程代码部分,——还是没有这一段的;但目录中说有的;
结论:风驰估计这一部分的代码也踩着地雷了。反正是被枪毙掉了,没公开。

yaoqiao51 发表于 2012-12-13 15:00 | 显示全部楼层
IN_RAM(void FLASH_Erase(void))
{
  U32 start_add= 0;
  U32 PointerAttr  *pwFlash;
  start_add=0x001000;//起始地址加上偏移量
  pwFlash = (PointerAttr U32 *)(U16)start_add;

    FLASH->CR2 =0X20;
   // FLASH->NCR2 &= (U8)(~FLASH_NCR2_NERASE);
  
    *pwFlash = (U32)0;
}
小农wz 发表于 2012-12-14 18:00 | 显示全部楼层
给力
明月小厨 发表于 2012-12-14 22:26 | 显示全部楼层
从现有资料上和常识上来看,完成STM8S的EEPROM操作应该是不困难的;
经过我测试,是这样的.唯一要注意的是覆盖法有时不灵(概率约2%),最好的办法是擦干净再写;
明月小厨 发表于 2012-12-14 22:32 | 显示全部楼层
STM8S的EEPROM块操作成功了吗,终于成功了!
请楼主参考此贴;
smartmcu 发表于 2012-12-15 10:27 | 显示全部楼层
1、flash里运行,肯定是没法写入的。
2、工艺要求,只能块擦,所以当然要整块更新了,又不是真正的eeprom。
3、仔细看资料,多站在您就是芯片设计、制造者的角度看,就明白了。
aaronji 发表于 2012-12-18 17:19 | 显示全部楼层
不用库块编程很随意,但是一用库去写就挂,有没得用库块编程成功的哥们,上个码看看,ST的库还是值得一看的,为什么么的人研究呢?求个块编程的库例程
 楼主| gtw 发表于 2013-3-26 23:36 | 显示全部楼层
已经确定,编译器的问题。也怪stm8s设计得变态,只能写零,不能清零,看一下反汇编就知道了。
huangfeng33 发表于 2013-3-28 22:13 | 显示全部楼层
一直没搞定块编程,等有空了再试一下
287651380 发表于 2013-3-28 22:14 | 显示全部楼层
不懂!!太深奥了!!
yzhou_2011 发表于 2014-6-7 16:56 | 显示全部楼层
若按字节写的话,写EEPROM每个字节耗时约6ms。块操作的方式将一个基本页(64字节)写入的理论时间也是6ms。但是在操作过程中也出现了写死机的情况。
  1. int16 EepRomWrite(void *pWriteData, uint16 nWriteLen, SaveType nType)
  2. {
  3.         uint8 i;
  4.         uint8 *p;

  5.         if (pWriteData==NULL || nWriteLen==0 || nWriteLen>=EEPROM_SIZE)
  6.         {
  7.                 return -1;
  8.         }
  9.         SetGpioLevel(PA,1,0);       
  10.         if (EepRomUnLock() == 0)
  11.         {
  12.                 //UART1_SendStr("eeprom fail unlock", 19);
  13.                 return -1;
  14.         }
  15.        
  16.         // 以下两行代码导致死机
  17.         FLASH_CR2 |=0x01;
  18.         FLASH_NCR2 &= ~(0x01);


  19.         SetGpioLevel(PA,1,1);
  20.         p = (uint8 *)(EEPROM_STARTADDR+nType*64);
  21.         for(i=0; i<nWriteLen+(EEPROM_BLOCK_SIZE-nWriteLen%EEPROM_BLOCK_SIZE); i++, p++)  // !!!!!
  22.         {
  23.                 *p = ((uint8 *)pWriteData)[i];
  24.                 if (i>=nWriteLen)
  25.                 {
  26.                         *p = 0x00;
  27.                 }

  28.                 if ((i+1)%EEPROM_BLOCK_SIZE == 0)
  29.                 {
  30.                         SetGpioLevel(PA,1,0);
  31.                         while((FLASH_IAPSR & 0x40) ==0);
  32.                         SetGpioLevel(PA,1,1);
  33.                         while((FLASH_IAPSR & 0x04) ==1);
  34.                         SetGpioLevel(PA,1,0);
  35.                 }
  36.         }

  37.         FLASH_CR2 &= ~(0x01);
  38.         EepRomLock();
  39.         SetGpioLevel(PA,1,1);
  40.         return 0;
  41. }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

gtw

13

主题

583

帖子

3

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