51 for (
int attempt = 0; attempt < 2000; ++attempt) {
52 while (HAL_HSEM_FastTake(CFG_HW_FLASH_SEMID) != HAL_OK) osDelay(1);
54 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_ALL_ERRORS);
55 HAL_StatusTypeDef
st = HAL_BUSY;
56 const uint32_t pm = __get_PRIMASK();
58 if (!HAL_HSEM_IsSemTaken(CFG_HW_BLOCK_FLASH_REQ_BY_CPU2_SEMID)) {
60 FLASH_EraseInitTypeDef e = { .TypeErase = FLASH_TYPEERASE_PAGES,
61 .Page = (
addr - FLASH_BASE) / FLASH_PAGE_SIZE,
64 st = HAL_FLASHEx_Erase(&e, &bad);
66 st = HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD,
addr, dw);
69 if (!pm) __enable_irq();
71 HAL_HSEM_Release(CFG_HW_FLASH_SEMID, 0);
72 if (
st == HAL_OK)
return 0;
73 if (
st != HAL_BUSY)
return -1;