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

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开始,是否与这个有关呢?
toofree 回答时间: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里试试看

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

评分

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

查看全部评分

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 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
解锁一次就够了。

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

要不监测一下电源电压是不是稳定?
12下一页
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版