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

查看: 16382|回复: 11

STM8L读写EEPROM偶尔会死机

[复制链接]

2

主题

19

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
发表于 2011-8-30 16:51:38 | 显示全部楼层 |阅读模式
用STM8L做的仪表,用内部EEPROM保存参数;按键存储参数时执行下面这段程序。有时候会出现死机情况。调试发现,程序死在:FLASH_ProgramWord函数内。并不是每次保存参数都会发生,大多数时候没有问题,只是偶尔发生,不能理解。如果与使用的外设有关,我也是在执行本程序是关闭中断的啊,应该与外设无关吧 ,望达人指点

KEY_SET()
{
disableInterrupts();
IWDG_ReloadCounter();
FLASH_SetProgrammingTime(FLASH_ProgramTime_Standard);
FLASH_Unlock(FLASH_MemType_Program);
while (FLASH_GetFlagStatus(FLASH_FLAG_PUL) == RESET);
FLASH_Unlock(FLASH_MemType_Data);
while (FLASH_GetFlagStatus(FLASH_FLAG_DUL) == RESET);
FLASH_ProgramWord(0x1010+(Menu_Index
回复

使用道具 举报

134

主题

4489

回帖

239

蝴蝶豆

版主

最后登录
2020-12-9
发表于 2011-8-31 09:55:55 | 显示全部楼层

RE:STM8L读写EEPROM偶尔会死机

这个时候要注意一个问题,已经写过的部分,要擦除才能再写。你使用FLASH模拟E2的时候,还要注意写入的地址不要超出这个片FLASH区的范围。
回复 支持 反对

使用道具 举报

2

主题

19

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
 楼主| 发表于 2011-8-31 10:42:53 | 显示全部楼层

RE:STM8L读写EEPROM偶尔会死机

谢谢版主回复。还是有疑问。1、我用的是内部EEPROM,而不是FLASH模拟;2、我参数保存的地址是:0x1010开始的30个字节;3、即使需要擦除而没有擦除,那应该只是数据不对,不会导致死机吧?
调试时,程序停止在FLASH_ProgramWord内部,---假死机;单步运行能跳出这个程序并且能继续运行;
回复 支持 反对

使用道具 举报

134

主题

4489

回帖

239

蝴蝶豆

版主

最后登录
2020-12-9
发表于 2011-8-31 11:45:59 | 显示全部楼层

RE:STM8L读写EEPROM偶尔会死机

程序会进入死循环。
回复 支持 反对

使用道具 举报

2

主题

19

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
 楼主| 发表于 2011-8-31 13:08:18 | 显示全部楼层

RE:STM8L读写EEPROM偶尔会死机

一上午都没解决,我用的是官方发布的例程,我开始怀疑死机是不是和外设有关。使用的外设有DMA\AD\SPI,使别的芯片从来没在这里出过问题...STM32也没出现过这样的问题,不会是芯片有bug吧,网上连个例程都没有
回复 支持 反对

使用道具 举报

2

主题

19

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
 楼主| 发表于 2011-8-31 13:12:42 | 显示全部楼层

RE:STM8L读写EEPROM偶尔会死机

根据官方例程改写的程序:

void EE_WRITE(void)
{
  /* Define flash programming Time*/
  FLASH_SetProgrammingTime(FLASH_ProgramTime_Standard);
  FLASH_Unlock(FLASH_MemType_Program);
  /* Wait until Flash Program area unlocked flag is set*/
  while (FLASH_GetFlagStatus(FLASH_FLAG_PUL) == RESET)
  {}
  /* Unlock flash data eeprom memory */
  FLASH_Unlock(FLASH_MemType_Data);
  /* Wait until Data EEPROM area unlocked flag is set*/
  while (FLASH_GetFlagStatus(FLASH_FLAG_DUL) == RESET)
  {}
  
  /* Erase block 0 and verify it */
  /* This function is executed from RAM */
  FLASH_EraseBlock(BLOCK_OPERATION, FLASH_MemType_Data);
  /* Wait until End of high voltage flag is set*/
  while (FLASH_GetFlagStatus(FLASH_FLAG_HVOFF) == RESET)
  {}
  
  /* This function is executed from RAM */
  FLASH_ProgramBlock(BLOCK_OPERATION, FLASH_MemType_Data, FLASH_ProgramMode_Standard, ramBuf);
  /* Wait until End of high voltage flag is set*/
  while (FLASH_GetFlagStatus(FLASH_FLAG_HVOFF) == RESET)
  {}
}
ramBuf是自己定义的数组:uint8_t ramBuf[FLASH_BLOCK_SIZE];
程序进:FLASH_EraseBlock后死在里面
回复 支持 反对

使用道具 举报

134

主题

4489

回帖

239

蝴蝶豆

版主

最后登录
2020-12-9
发表于 2011-8-31 15:01:17 | 显示全部楼层

RE:STM8L读写EEPROM偶尔会死机

你仿真一下,看看死到哪句了?是不是你擦除的这个区不存在?
回复 支持 反对

使用道具 举报

2

主题

4

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
发表于 2012-4-1 16:45:45 | 显示全部楼层

回复:STM8L读写EEPROM偶尔会死机

我遇到的情况和你一样,初始化的时候写参数到eeprom
写之前关中断,写之后开中断
写完后马上读出来,用断点看数据读写没问题
但是去掉断点,复位,  把后边大循环里的外设处理程序一起跑起来,就会死
测了下写20个字节需要4ms,16Mhz的主频
 
 
楼主找到解决办法没有?
回复 支持 反对

使用道具 举报

0

主题

16

回帖

0

蝴蝶豆

初级会员

最后登录
2018-3-9
发表于 2016-9-16 14:37:50 | 显示全部楼层
问题出在这里:BLOCK_OPERATION
它的地址值不对,导致你擦除的这个区不对
回复 支持 反对

使用道具 举报

16

主题

1710

回帖

241

蝴蝶豆

论坛元老

最后登录
2020-12-8
发表于 2017-2-13 14:35:00 | 显示全部楼层
我也遇到这个问题了,有什么好的解决方法吗
回复 支持 反对

使用道具 举报

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版