之前验证flash擦写功能试过擦除后写入五六个字节的数据量没发现什麼问题,但最近调试iap,一次写入512的字节的发现芯片会跑飞重启。
后来发现是使能的SysTick这个中断的问题,项目没用操作系统内核,用systick做了个ms级延时,写flash写到十几二个个字节就进了一次中断导致跑飞,
知道原因解决也简单,写flash的时候关中断就好。
void FlashWrite(void *pBuffer, uint32_t WriteAddr, uint32_t ByteNumToWrite)
{
static ftfx_cache_config_t s_cacheDriver;
uint32_t pflashBlockBase = 0;
uint32_t pflashTotalSize = 0;
uint32_t pflashSectorSize = 0;
hal_flash_security_state_t securityStatus = 0; /* Return protection status */
memset(&s_cacheDriver, 0, sizeof(ftfx_cache_config_t));
if (FTFx_CACHE_Init(&s_cacheDriver))
{
PRINTF("FLASH cache ERROR\n");
};
if (HAL_FlashInit(halFlashHandle) != kStatus_HAL_Flash_Success)
{
PRINTF("FLASH INIT ERROR\n");
};
// HAL_FlashGetProperty(halFlashHandle, kHAL_Flash_PropertyPflashBlockBaseAddr, &pflashBlockBase);
// HAL_FlashGetProperty(halFlashHandle, kHAL_Flash_PropertyPflashTotalSize, &pflashTotalSize);
HAL_FlashGetProperty(halFlashHandle, kHAL_Flash_PropertyPflashSectorSize, &pflashSectorSize);
// PRINTF("\r\n PFlash Information: ");
// PRINTF("\r\n Total Program Base Addr:\t%d KB, Hex: (0x%x)", (pflashBlockBase / 1024), pflashBlockBase);
// PRINTF("\r\n Total Program Flash Size:\t%d KB, Hex: (0x%x)", (pflashTotalSize / 1024), pflashTotalSize);
// PRINTF("\r\n Program Flash Sector Size:\t%d KB, Hex: (0x%x)\r\n", (pflashSectorSize / 1024), pflashSectorSize);
if (HAL_FlashGetSecurityState(halFlashHandle, &securityStatus))
{
PRINTF("FLASH GetSecurity ERROR\n");
}
switch (securityStatus)
{
case kHAL_Flash_SecurityStateNotSecure:
// PRINTF("\r\n Flash is UNSECURE!");
break;
case kHAL_Flash_SecurityStateBackdoorEnabled:
PRINTF("\r\n Flash is SECURE, BACKDOOR is ENABLED!");
break;
case kHAL_Flash_SecurityStateBackdoorDisabled:
PRINTF("\r\n Flash is SECURE, BACKDOOR is DISABLED!");
break;
default:
break;
}
{
status_t result; /* Return code from each flash driver function */
uint32_t i, failAddr, failDat;
FTFx_CACHE_ClearCachePrefetchSpeculation(&s_cacheDriver, true);
if (HAL_FlashEraseSector(halFlashHandle, WriteAddr, pflashSectorSize))
PRINTF("FLASH Erase ERROR\n");
if (HAL_FlashVerifyErase(halFlashHandle, WriteAddr, pflashSectorSize, kHAL_Flash_MarginValueUser))
PRINTF("FLASH VerifyErase ERROR\n");
uint32_t regPrimask = DisableGlobalIRQ(); //必须关中断,写flash进中断会跑飞
if (HAL_FlashProgramUnaligned(halFlashHandle, WriteAddr, ByteNumToWrite, (uint8_t *)pBuffer))
PRINTF("FLASH VerifyErase ERROR\n");
EnableGlobalIRQ(regPrimask);
FTFx_CACHE_ClearCachePrefetchSpeculation(&s_cacheDriver, false);
// PRINTF("READ FLASH VALUE %d", *(volatile uint16_t *)(WriteAddr));
}
}
觉得有点坑爹的是sdk提供的HAL_FlashEraseSector擦除api里面有关中断,为什么到HAL_FlashProgramUnaligned写函数api却又不加上关中断。也花了不少时间找问题。