STM8L052写EEPROM偶尔会死机
用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;
while(FLASH_IAPSR_EOP == 0);
}
FLASH_IAPSR_DUL = 0; //操作完要加锁
enableInterrupts(); //开全局中断
return 1;
}
调用时的操作
buff_Count = 0;
buff = Manu_Temp / 100;
buff = Manu_Temp % 100;
EEPROM_Buff_Write (0x0D0, buff, buff_Count);
楼主问题解决了吗?怎么没看到说明,哪一楼是正确答案呵?库函数里的写eeprom时用转换地址是 *(FAR uint8_t*) (uint16_t)Address,而这地址从0x1000开始,是否与这个有关呢? 把if (count == 0xFFFF)return 0;
放到while里试试看
另外用内部EEPROM时,还需要加延时不?
这个片片,在全局中断关的时候,对看门狗有没有影响? toofree 发表于 2017-2-13 17:18
把if (count == 0xFFFF)return 0;
放到while里试试看
放在里面也不行,我已经把看门狗功能去掉了,延时也试过,问题还是解决不了,一直测试的话,偶尔出先要不死机,要不复位 其他的都不管,试下直接解锁写进去看看。没死过 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
会不会是楼主的写入地址超出可写区域了?
地址肯定没超出去,我才写到地址250不到点,假如超出的话,每次都应该有问题的 解锁一次就够了。 wenyangzeng 发表于 2017-2-14 10:11
解锁一次就够了。
我也没有解锁很多次啊 wudianjun2001 发表于 2017-2-14 08:33
放在里面也不行,我已经把看门狗功能去掉了,延时也试过,问题还是解决不了,一直测试的话,偶尔出先要不 ...
要不监测一下电源电压是不是稳定?
页:
[1]
2