7 :
Flash(sectors[start_sector - 1].size, DetermineMinWriteSize(),
8 {
reinterpret_cast<void*
>(sectors[start_sector - 1].address),
9 sectors[sector_count - 1].address - sectors[start_sector - 1].address +
10 sectors[sector_count - 1].size}),
12 base_address_(sectors[start_sector - 1].address),
13 program_type_(DetermineProgramType()),
14 sector_count_(sector_count)
22 return ErrorCode::ARG_ERR;
25 uint32_t start_addr = base_address_ + offset;
26 uint32_t end_addr = start_addr + size;
28#if defined(__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U)
29 bool i_cache_enabled = ((SCB->CCR & SCB_CCR_IC_Msk) != 0U);
36#if defined(__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U)
37 bool d_cache_enabled = ((SCB->CCR & SCB_CCR_DC_Msk) != 0U);
46 for (
size_t i = 0; i < sector_count_; ++i)
48 const auto& sector = sectors_[i];
49 if (sector.address + sector.size <= start_addr)
53 if (sector.address >= end_addr)
57 FLASH_EraseInitTypeDef erase_init = {};
59#if defined(FLASH_TYPEERASE_PAGES) && defined(FLASH_PAGE_SIZE)
60 erase_init.TypeErase = FLASH_TYPEERASE_PAGES;
61 SetNbPages(erase_init, sector.address, i);
62 erase_init.NbPages = 1;
63 SetBanks(erase_init, sector.address);
64#elif defined(FLASH_TYPEERASE_SECTORS)
65 erase_init.TypeErase = FLASH_TYPEERASE_SECTORS;
66 erase_init.Sector =
static_cast<uint32_t
>(i) % FLASH_SECTOR_TOTAL;
67 erase_init.NbSectors = 1;
68#if defined(FLASH_BANK_1)
69 erase_init.Banks = STM32FlashBankOf(sector.address);
71#if defined(FLASH_CR_PSIZE)
72 erase_init.VoltageRange = FLASH_VOLTAGE_RANGE_1;
75 return ErrorCode::NOT_SUPPORT;
79 HAL_StatusTypeDef status = HAL_FLASHEx_Erase(&erase_init, &error);
80 if (status != HAL_OK || error != 0xFFFFFFFFU)
83 return ErrorCode::FAILED;
89#if defined(__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U)
96#if defined(__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U)
104 return ErrorCode::OK;
111 return ErrorCode::ARG_ERR;
114 uint32_t addr = base_address_ + offset;
115 if (!IsInRange(addr, data.
size_))
117 return ErrorCode::OUT_OF_RANGE;
120#if defined(__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U)
121 bool i_cache_enabled = ((SCB->CCR & SCB_CCR_IC_Msk) != 0U);
128#if defined(__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U)
129 bool d_cache_enabled = ((SCB->CCR & SCB_CCR_DC_Msk) != 0U);
138 const uint8_t* src =
reinterpret_cast<const uint8_t*
>(data.
addr_);
141#if defined(STM32H7) || defined(STM32H5)
142 alignas(32) uint32_t flash_word_buffer[8] = {0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu,
143 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu,
144 0xFFFFFFFFu, 0xFFFFFFFFu};
145 while (written < data.
size_)
149 std::memset(flash_word_buffer, 0xFF,
sizeof(flash_word_buffer));
150 std::memcpy(flash_word_buffer, src + written, chunk_size);
152 if (memcmp(
reinterpret_cast<const uint8_t*
>(addr + written), src + written,
155 written += chunk_size;
159 if (HAL_FLASH_Program(program_type_, addr + written,
160 reinterpret_cast<uint32_t
>(flash_word_buffer)) != HAL_OK)
163 return ErrorCode::FAILED;
166 written += chunk_size;
170 while (written < data.
size_)
174 if (memcmp(
reinterpret_cast<const uint8_t*
>(addr + written), src + written,
177 written += chunk_size;
181 uint64_t word = 0xFFFFFFFFFFFFFFFF;
182 std::memcpy(&word, src + written, chunk_size);
184 if (HAL_FLASH_Program(program_type_, addr + written, word) != HAL_OK)
187 return ErrorCode::FAILED;
190 written += chunk_size;
196#if defined(__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U)
203#if defined(__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U)
210 return ErrorCode::OK;