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

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