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

IAR for STM8, FLASH_EraseBlock在release模式卡死

[复制链接]
YUANI 提问时间:2019-11-4 09:39 /
使用STM8AF52xx,配置了#define RAM_EXECUTION  (1)
在debug模式下(low optimization)使用FLASH_EraseBlock可以正常擦除。
在release模式下(medium 或 high optimization)使用FLASH_EraseBlock卡死。
  1. IN_RAM(void FLASH_EraseBlock(uint16_t BlockNum, FLASH_MemType_TypeDef FLASH_MemType))
  2. {
  3.   uint32_t startaddress = 0;
  4.   
  5. #if defined(STM8S105) || defined(STM8S005) || defined(STM8S103) || defined(STM8S003) || \
  6.     defined(STM8S001) || defined(STM8S903) || defined (STM8AF626x) || defined (STM8AF622x)
  7.     uint32_t PointerAttr  *pwFlash;
  8. #elif defined (STM8S208) || defined(STM8S207) || defined(STM8S007) || defined (STM8AF62Ax) || defined (STM8AF52Ax)
  9.   uint8_t PointerAttr  *pwFlash;
  10. #endif
  11.   
  12.   /* Check parameters */
  13.   assert_param(IS_MEMORY_TYPE_OK(FLASH_MemType));
  14.   if(FLASH_MemType == FLASH_MEMTYPE_PROG)
  15.   {
  16.     assert_param(IS_FLASH_PROG_BLOCK_NUMBER_OK(BlockNum));
  17.     startaddress = FLASH_PROG_START_PHYSICAL_ADDRESS;
  18.   }
  19.   else
  20.   {
  21.     assert_param(IS_FLASH_DATA_BLOCK_NUMBER_OK(BlockNum));
  22.     startaddress = FLASH_DATA_START_PHYSICAL_ADDRESS;
  23.   }
  24.   
  25.   /* Point to the first block address */
  26. #if defined (STM8S208) || defined(STM8S207) || defined(STM8S007) || defined (STM8AF62Ax) || defined (STM8AF52Ax)
  27.   pwFlash = (PointerAttr uint8_t *)(MemoryAddressCast)(startaddress + ((uint32_t)BlockNum * FLASH_BLOCK_SIZE));
  28. #elif defined(STM8S105) || defined(STM8S005) || defined(STM8S103) || defined(STM8S003) || \
  29.       defined(STM8S001) || defined (STM8S903) || defined (STM8AF626x) || defined (STM8AF622x)
  30.     pwFlash = (PointerAttr uint32_t *)(MemoryAddressCast)(startaddress + ((uint32_t)BlockNum * FLASH_BLOCK_SIZE));
  31. #endif        /* STM8S208, STM8S207 */
  32.   
  33.   /* Enable erase block mode */
  34.   FLASH->CR2 |= FLASH_CR2_ERASE;
  35.   FLASH->NCR2 &= (uint8_t)(~FLASH_NCR2_NERASE);
  36.   
  37. #if defined(STM8S105) || defined(STM8S005) || defined(STM8S103) || defined(STM8S003) ||  \
  38.     defined(STM8S001) || defined(STM8S903) || defined (STM8AF626x) || defined (STM8AF622x)
  39.     *pwFlash = (uint32_t)0;
  40. #elif defined (STM8S208) || defined(STM8S207) || defined(STM8S007) || defined (STM8AF62Ax) || \
  41.   defined (STM8AF52Ax)
  42.     *pwFlash = (uint8_t)0;
  43.   *(pwFlash + 1) = (uint8_t)0;
  44.   *(pwFlash + 2) = (uint8_t)0;
  45.   *(pwFlash + 3) = (uint8_t)0;   
  46. #endif
  47. }
复制代码
在release模式下,对程序区FLASH_ProgramWord可以写入没有问题

有人碰到过吗?

收藏 评论5 发布时间:2019-11-4 09:39

举报

5个回答
YUANI 回答时间:2019-11-8 08:39:54
没人气啊
butterflyspring 回答时间:2019-11-11 17:58:20
调试一下,看看你的这段代码是否真正在RAM中运行。此时是否有中断发生的可能。
另外,我记得这个芯片应该直接word对齐编程,不需要先擦除的。

评分

参与人数 1蝴蝶豆 +1 收起 理由
STMCU + 1

查看全部评分

YUANI 回答时间:2019-11-14 07:32:06
butterflyspring 发表于 2019-11-11 17:58
调试一下,看看你的这段代码是否真正在RAM中运行。此时是否有中断发生的可能。
另外,我记得这个芯片应该直 ...

在擦除前关闭了中断。 这段代码确实在RAM地址段。
如果不需要先擦除,它提供擦除功能干嘛?
butterflyspring 回答时间:2019-11-15 16:12:12
YUANI 发表于 2019-11-14 07:32
在擦除前关闭了中断。 这段代码确实在RAM地址段。
如果不需要先擦除,它提供擦除功能干嘛? ...

手册里有说,稍稍快一点而已 但是一般应用不差这点时间,减少额外的烧脑
yf14789652 回答时间:2019-12-31 14:36:07

我发个题外话,
上周末用我的老电脑,WIN7 32系统,跑跑版本的IAR软件,仿真I2C不通。
事实上产品在新电脑,新版本的IAR是可以正常仿真和使用的。
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版