Writes data to the flash memory. 向闪存写入数据。
159 {
160 if (!data.addr_ || data.size_ == 0)
161 {
162 return ErrorCode::ARG_ERR;
163 }
164
165 uint32_t addr = base_address_ + offset;
166 if (!IsInRange(addr, data.size_))
167 {
168 return ErrorCode::OUT_OF_RANGE;
169 }
170
171 HAL_FLASH_Unlock();
172
173 const uint8_t* src = reinterpret_cast<const uint8_t*>(data.addr_);
174 size_t written = 0;
175
176#if defined(STM32H7) || defined(STM32H5)
177 alignas(32) uint32_t flash_word_buffer[8] = {0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu,
178 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu,
179 0xFFFFFFFFu, 0xFFFFFFFFu};
180 while (written < data.size_)
181 {
183
184 std::memcpy(flash_word_buffer, src + written, chunk_size);
185
186 if (memcmp(reinterpret_cast<const uint8_t*>(addr + written), src + written,
187 chunk_size) == 0)
188 {
189 written += chunk_size;
190 continue;
191 }
192
193 if (HAL_FLASH_Program(program_type_, addr + written,
194 reinterpret_cast<uint32_t>(flash_word_buffer)) != HAL_OK)
195 {
196 HAL_FLASH_Lock();
197 return ErrorCode::FAILED;
198 }
199
200 written += chunk_size;
201 }
202
203#else
204 while (written < data.size_)
205 {
207
208 if (memcmp(reinterpret_cast<const uint8_t*>(addr + written), src + written,
209 chunk_size) == 0)
210 {
211 written += chunk_size;
212 continue;
213 }
214
215 uint64_t word = 0xFFFFFFFFFFFFFFFF;
216 std::memcpy(&word, src + written, chunk_size);
217
218 if (HAL_FLASH_Program(program_type_, addr + written, word) != HAL_OK)
219 {
220 HAL_FLASH_Lock();
221 return ErrorCode::FAILED;
222 }
223
224 written += chunk_size;
225 }
226#endif
227
228 HAL_FLASH_Lock();
229 return ErrorCode::OK;
230 }
size_t min_write_size_
Minimum writable block size in bytes. 最小可写块大小(字节)。
constexpr auto min(T1 a, T2 b) -> typename std::common_type< T1, T2 >::type
计算两个数的最小值