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可以写入没有问题
有人碰到过吗?
没人气啊:dizzy: 调试一下,看看你的这段代码是否真正在RAM中运行。此时是否有中断发生的可能。
另外,我记得这个芯片应该直接word对齐编程,不需要先擦除的。 butterflyspring 发表于 2019-11-11 17:58
调试一下,看看你的这段代码是否真正在RAM中运行。此时是否有中断发生的可能。
另外,我记得这个芯片应该直 ...
在擦除前关闭了中断。 这段代码确实在RAM地址段。
如果不需要先擦除,它提供擦除功能干嘛?:D YUANI 发表于 2019-11-14 07:32
在擦除前关闭了中断。 这段代码确实在RAM地址段。
如果不需要先擦除,它提供擦除功能干嘛? ...
手册里有说,稍稍快一点而已:lol 但是一般应用不差这点时间,减少额外的烧脑 YUANI 发表于 2019-11-8 08:39
没人气啊
我发个题外话,
上周末用我的老电脑,WIN7 32系统,跑跑版本的IAR软件,仿真I2C不通。
事实上产品在新电脑,新版本的IAR是可以正常仿真和使用的。
页:
[1]