打印
[STM8]

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

[复制链接]
12073|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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运行,搞不懂放弃了

使用特权

评论回复
5
lzymcu| | 2012-7-30 22:53 | 只看该作者
我试过了,一写就死,据说要放到RAM运行,搞不懂放弃了

使用特权

评论回复
6
liuxiaoyun1210| | 2012-9-4 10:57 | 只看该作者
是啊!块写就立马死,有没有高手搞定了呀!FLASH编程必须用块编程呀!

使用特权

评论回复
7
bs1234| | 2012-11-28 22:28 | 只看该作者
他妈的ST,傲慢要死,块到现在都没有给出答案。

使用特权

评论回复
8
明月小厨| | 2012-11-30 14:19 | 只看该作者
本来就是这样,私下估计块操作写的时候占用了FLASH总线;所以必须放在RAM里执行;
编译器已经考虑到这个事情了,所以提供了一些简单的处理方案;

就是写操作的函数声明一下要在RAM里运行;然后你自己搬过去再调用即可;

使用特权

评论回复
9
明月小厨| | 2012-12-11 21:03 | 只看该作者
我试过块写入并不困难,128字节;事后查看结果正确;
但开始写入及写入后程序在RAM里运行,调试时看不清楚它在干什么;然后就一直看不清楚,直到你失去耐心;
难道任务完成后的标志位一直没有出现吗?我再试试看;

使用特权

评论回复
10
明月小厨| | 2012-12-12 16:10 | 只看该作者
找些例程来看看吧,手头正好有风驰的开发板资料,于是满怀希望......
先看目录,果然有关的说明,继续找PDF文档,——结果没有这部分的内容;
再看例程代码部分,——还是没有这一段的;但目录中说有的;
结论:风驰估计这一部分的代码也踩着地雷了。反正是被枪毙掉了,没公开。

使用特权

评论回复
11
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;
}

使用特权

评论回复
12
小农wz| | 2012-12-14 18:00 | 只看该作者
给力

使用特权

评论回复
13
明月小厨| | 2012-12-14 22:26 | 只看该作者
从现有资料上和常识上来看,完成STM8S的EEPROM操作应该是不困难的;
经过我测试,是这样的.唯一要注意的是覆盖法有时不灵(概率约2%),最好的办法是擦干净再写;

使用特权

评论回复
14
明月小厨| | 2012-12-14 22:32 | 只看该作者
STM8S的EEPROM块操作成功了吗,终于成功了!
请楼主参考此贴;

使用特权

评论回复
15
smartmcu| | 2012-12-15 10:27 | 只看该作者
1、flash里运行,肯定是没法写入的。
2、工艺要求,只能块擦,所以当然要整块更新了,又不是真正的eeprom。
3、仔细看资料,多站在您就是芯片设计、制造者的角度看,就明白了。

使用特权

评论回复
16
aaronji| | 2012-12-18 17:19 | 只看该作者
不用库块编程很随意,但是一用库去写就挂,有没得用库块编程成功的哥们,上个码看看,ST的库还是值得一看的,为什么么的人研究呢?求个块编程的库例程

使用特权

评论回复
17
gtw|  楼主 | 2013-3-26 23:36 | 只看该作者
已经确定,编译器的问题。也怪stm8s设计得变态,只能写零,不能清零,看一下反汇编就知道了。

使用特权

评论回复
18
huangfeng33| | 2013-3-28 22:13 | 只看该作者
一直没搞定块编程,等有空了再试一下

使用特权

评论回复
19
287651380| | 2013-3-28 22:14 | 只看该作者
不懂!!太深奥了!!

使用特权

评论回复
20
yzhou_2011| | 2014-6-7 16:56 | 只看该作者
若按字节写的话,写EEPROM每个字节耗时约6ms。块操作的方式将一个基本页(64字节)写入的理论时间也是6ms。但是在操作过程中也出现了写死机的情况。
int16 EepRomWrite(void *pWriteData, uint16 nWriteLen, SaveType nType)
{
        uint8 i;
        uint8 *p;

        if (pWriteData==NULL || nWriteLen==0 || nWriteLen>=EEPROM_SIZE)
        {
                return -1;
        }
        SetGpioLevel(PA,1,0);       
        if (EepRomUnLock() == 0)
        {
                //UART1_SendStr("eeprom fail unlock", 19);
                return -1;
        }
       
        // 以下两行代码导致死机
        FLASH_CR2 |=0x01;
        FLASH_NCR2 &= ~(0x01);


        SetGpioLevel(PA,1,1);
        p = (uint8 *)(EEPROM_STARTADDR+nType*64);
        for(i=0; i<nWriteLen+(EEPROM_BLOCK_SIZE-nWriteLen%EEPROM_BLOCK_SIZE); i++, p++)  // !!!!!
        {
                *p = ((uint8 *)pWriteData)[i];
                if (i>=nWriteLen)
                {
                        *p = 0x00;
                }

                if ((i+1)%EEPROM_BLOCK_SIZE == 0)
                {
                        SetGpioLevel(PA,1,0);
                        while((FLASH_IAPSR & 0x40) ==0);
                        SetGpioLevel(PA,1,1);
                        while((FLASH_IAPSR & 0x04) ==1);
                        SetGpioLevel(PA,1,0);
                }
        }

        FLASH_CR2 &= ~(0x01);
        EepRomLock();
        SetGpioLevel(PA,1,1);
        return 0;
}

使用特权

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

本版积分规则

gtw

13

主题

583

帖子

3

粉丝