YUANI 发表于 2019-11-4 09:39:43

IAR for STM8, FLASH_EraseBlock在release模式卡死

使用STM8AF52xx,配置了#define RAM_EXECUTION(1)
在debug模式下(low optimization)使用FLASH_EraseBlock可以正常擦除。
在release模式下(medium 或 high optimization)使用FLASH_EraseBlock卡死。
IN_RAM(void FLASH_EraseBlock(uint16_t BlockNum, FLASH_MemType_TypeDef FLASH_MemType))
{
uint32_t startaddress = 0;

#if defined(STM8S105) || defined(STM8S005) || defined(STM8S103) || defined(STM8S003) || \
    defined(STM8S001) || defined(STM8S903) || defined (STM8AF626x) || defined (STM8AF622x)
    uint32_t PointerAttr*pwFlash;
#elif defined (STM8S208) || defined(STM8S207) || defined(STM8S007) || defined (STM8AF62Ax) || defined (STM8AF52Ax)
uint8_t PointerAttr*pwFlash;
#endif

/* Check parameters */
assert_param(IS_MEMORY_TYPE_OK(FLASH_MemType));
if(FLASH_MemType == FLASH_MEMTYPE_PROG)
{
    assert_param(IS_FLASH_PROG_BLOCK_NUMBER_OK(BlockNum));
    startaddress = FLASH_PROG_START_PHYSICAL_ADDRESS;
}
else
{
    assert_param(IS_FLASH_DATA_BLOCK_NUMBER_OK(BlockNum));
    startaddress = FLASH_DATA_START_PHYSICAL_ADDRESS;
}

/* Point to the first block address */
#if defined (STM8S208) || defined(STM8S207) || defined(STM8S007) || defined (STM8AF62Ax) || defined (STM8AF52Ax)
pwFlash = (PointerAttr uint8_t *)(MemoryAddressCast)(startaddress + ((uint32_t)BlockNum * FLASH_BLOCK_SIZE));
#elif defined(STM8S105) || defined(STM8S005) || defined(STM8S103) || defined(STM8S003) || \
      defined(STM8S001) || defined (STM8S903) || defined (STM8AF626x) || defined (STM8AF622x)
    pwFlash = (PointerAttr uint32_t *)(MemoryAddressCast)(startaddress + ((uint32_t)BlockNum * FLASH_BLOCK_SIZE));
#endif        /* STM8S208, STM8S207 */

/* Enable erase block mode */
FLASH->CR2 |= FLASH_CR2_ERASE;
FLASH->NCR2 &= (uint8_t)(~FLASH_NCR2_NERASE);

#if defined(STM8S105) || defined(STM8S005) || defined(STM8S103) || defined(STM8S003) ||\
    defined(STM8S001) || defined(STM8S903) || defined (STM8AF626x) || defined (STM8AF622x)
    *pwFlash = (uint32_t)0;
#elif defined (STM8S208) || defined(STM8S207) || defined(STM8S007) || defined (STM8AF62Ax) || \
defined (STM8AF52Ax)
    *pwFlash = (uint8_t)0;
*(pwFlash + 1) = (uint8_t)0;
*(pwFlash + 2) = (uint8_t)0;
*(pwFlash + 3) = (uint8_t)0;   
#endif
}在release模式下,对程序区FLASH_ProgramWord可以写入没有问题

有人碰到过吗?

YUANI 发表于 2019-11-8 08:39:54

没人气啊:dizzy:

butterflyspring 发表于 2019-11-11 17:58:20

调试一下,看看你的这段代码是否真正在RAM中运行。此时是否有中断发生的可能。
另外,我记得这个芯片应该直接word对齐编程,不需要先擦除的。

YUANI 发表于 2019-11-14 07:32:06

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

在擦除前关闭了中断。 这段代码确实在RAM地址段。
如果不需要先擦除,它提供擦除功能干嘛?:D

butterflyspring 发表于 2019-11-15 16:12:12

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

手册里有说,稍稍快一点而已:lol 但是一般应用不差这点时间,减少额外的烧脑

yf14789652 发表于 2019-12-31 14:36:07

YUANI 发表于 2019-11-8 08:39
没人气啊

我发个题外话,
上周末用我的老电脑,WIN7 32系统,跑跑版本的IAR软件,仿真I2C不通。
事实上产品在新电脑,新版本的IAR是可以正常仿真和使用的。
页: [1]
查看完整版本: IAR for STM8, FLASH_EraseBlock在release模式卡死