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

查看: 16412|回复: 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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版