你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM8L052写EEPROM偶尔会死机

[复制链接]
wudianjun2001 提问时间:2017-2-13 14:08 /

用STM8L052做个项目,这几天发现写EEPROM偶尔会死机,产品频繁测试的时候,按键按下后会写一次EEPROM,按键一直按测试,发现不定时会出现一次死机,找不到什么问题,大家帮忙看看。

写EEPROM的字函数
uint8_t EEPROM_Buff_Write (uint16_t addr, uint8_t *buff, uint16_t len)  
{  
        uint16_t i, count = 0;

        //WDT_Feed ();                                                                                //喂狗
        //这样字节写的话会成功,但是快写的话失败。而且要全速运行才能写正确
        disableInterrupts();                                                                //关全局中断
        FLASH_DUKR = 0xAE;                                                                        //写入第一个密钥
        FLASH_DUKR = 0x56;                                                                        //写入第二个密钥
        FLASH_CR2 = 0x00;                                                                        //标准块编程,会先擦除的
        while (((FLASH_IAPSR & 0x08) == 0) && (count < 0xFFFF))
        {
                count ++;                                                                                //等待解锁完成
        }
        if (count == 0xFFFF)return 0;
        //WDT_Feed ();                                                                                //喂狗
        for(i = 0; i < len; i++)
        {
                *((uint8_t *)(USERPAGE + addr + i)) = buff[i];
                while(FLASH_IAPSR_EOP == 0);
        }
        FLASH_IAPSR_DUL = 0;                                                                //操作完要加锁
        enableInterrupts();                                                                 //开全局中断
        return 1;
}  


调用时的操作
buff_Count = 0;
buff[buff_Count ++] = Manu_Temp / 100;
buff[buff_Count ++] = Manu_Temp % 100;
EEPROM_Buff_Write (0x0D0, buff, buff_Count);


收藏 2 评论18 发布时间:2017-2-13 14:08

举报

18个回答
gam169 回答时间:2018-2-27 09:14:31
楼主问题解决了吗?怎么没看到说明,哪一楼是正确答案呵?库函数里的写eeprom时用转换地址是 *(FAR uint8_t*) (uint16_t)Address,而这地址从0x1000开始,是否与这个有关呢?
wudianjun2001 回答时间:2017-2-14 08:53:27
liu553824989 发表于 2017-2-14 08:49
其他的都不管,试下直接解锁写进去看看。没死过

直接使用库都不行
    FLASH_Unlock(FLASH_MemType_Data);
    for(i = 0; i < len; i++)
    {
        FLASH_ProgramByte(USERPAGE + addr + i, *(buff + i));//从0X1000开始寻址
    }
    FLASH_Lock(FLASH_MemType_Data);
七哥 回答时间:2017-2-14 18:51:23
wudianjun2001 发表于 2017-2-14 14:38
*((uint8_t *)(USERPAGE + addr + i)) = buff;
                while(FLASH_IAPSR_EOP == 0);
应该是这 ...

while(FLASH_IAPSR_EOP == 0);

while中设置个超时退出变量,在外面判断是否是超时了,如果超时的话,再研究看什么造成的超时。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

七哥 回答时间:2017-2-13 17:18:30
把if (count == 0xFFFF)return 0;
放到while里试试看

另外用内部EEPROM时,还需要加延时不?
这个片片,在全局中断关的时候,对看门狗有没有影响?

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

wudianjun2001 回答时间:2017-2-14 08:33:28
toofree 发表于 2017-2-13 17:18
把if (count == 0xFFFF)return 0;
放到while里试试看

放在里面也不行,我已经把看门狗功能去掉了,延时也试过,问题还是解决不了,一直测试的话,偶尔出先要不死机,要不复位
仙景 回答时间:2017-2-14 08:49:22
其他的都不管,试下直接解锁写进去看看。没死过

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

无薪税绵 回答时间:2017-2-14 09:21:09
会不会是楼主的写入地址超出可写区域了?

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

wudianjun2001 回答时间:2017-2-14 09:28:47
无薪税绵 发表于 2017-2-14 09:21
会不会是楼主的写入地址超出可写区域了?

地址肯定没超出去,我才写到地址250不到点,假如超出的话,每次都应该有问题的
wenyangzeng 回答时间:2017-2-14 10:11:31
解锁一次就够了。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

wudianjun2001 回答时间:2017-2-14 10:30:55
wenyangzeng 发表于 2017-2-14 10:11
解锁一次就够了。

我也没有解锁很多次啊
七哥 回答时间:2017-2-14 13:13:15
wudianjun2001 发表于 2017-2-14 08:33
放在里面也不行,我已经把看门狗功能去掉了,延时也试过,问题还是解决不了,一直测试的话,偶尔出先要不 ...

要不监测一下电源电压是不是稳定?
中山无雪 回答时间:2017-2-14 14:06:33
先找出死在哪句上了

cldym 回答时间:2017-2-14 14:19:44

解锁一次就够了。
wudianjun2001 回答时间:2017-2-14 14:37:01
toofree 发表于 2017-2-14 13:13
要不监测一下电源电压是不是稳定?

都没用自己做的电源控制板,用的开关电源,电源应该没问题
wudianjun2001 回答时间:2017-2-14 14:38:19
中山无雪 发表于 2017-2-14 14:06
先找出死在哪句上了

*((uint8_t *)(USERPAGE + addr + i)) = buff;
                while(FLASH_IAPSR_EOP == 0);
应该是这两句有问题,把写屏蔽掉测试没问题
12下一页
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版