13#if defined(STM32) && defined(HAL_FLASH_MODULE_ENABLED)
14extern FLASH_ProcessTypeDef
pFlash;
30Stm32Flash* Stm32Flash::m_flash;
32: m_voltageRange(voltageRange),
36 Stm32Flash::m_flash =
this;
44 Stm32Flash::m_flash =
this;
52 Stm32Flash::m_flash =
this;
55void Stm32Flash::write(uint32_t address,
const uint8_t data[],
size_t dataSize)
64 else if (data ==
nullptr)
70 else if (dataSize == 0)
79 m_dataWrite =
const_cast<uint8_t*
>(data);
80 m_bytesToWrite = dataSize;
95 else if (buffer ==
nullptr)
101 else if (bufferSize == 0)
107 if (m_dataAvailablePending)
111 m_sizeRead = bufferSize;
112 m_readIsPending =
true;
119 for (
size_t i = 0; i < bufferSize; i++)
121 buffer[i] = (*(__IO uint8_t*)(
address));
125 m_dataAvailablePending =
true;
128 m_dataAvailablePending =
false;
134 bufferSize = m_sizeRead;
135 m_readIsPending =
false;
147 SEMF_INFO(
"first sector index %u, number of sectors %u",
sector, numOfSectors);
162 m_numOfSecotrsToErase = numOfSectors;
163 m_eraseIsRunning =
true;
166 FLASH_EraseInitTypeDef eraseinit;
167#if defined(STM32F0) || defined(STM32F1) || defined(STM32F3) || defined(STM32L0)
168 eraseinit.TypeErase = FLASH_TYPEERASE_PAGES;
170 eraseinit.NbPages = numOfSectors;
171#elif defined(STM32G0)
172 eraseinit.TypeErase = FLASH_TYPEERASE_PAGES;
173 eraseinit.Banks = m_bank;
175 eraseinit.NbPages = numOfSectors;
177 eraseinit.TypeErase = FLASH_TYPEERASE_SECTORS;
178 eraseinit.Sector =
sector;
179 eraseinit.NbSectors = numOfSectors;
180 eraseinit.VoltageRange = m_voltageRange;
182 HAL_StatusTypeDef state = HAL_FLASHEx_Erase_IT(&eraseinit);
185 if (state == HAL_ERROR)
190 else if (state == HAL_BUSY)
195 else if (state == HAL_TIMEOUT)
210void Stm32Flash::write()
213 if (m_bytesToWrite % 8 != 0)
216 SEMF_ERROR(
"write does not support less than 8 bytes");
221#if defined(STM32L0) || defined(STM32F0)
222 if (m_bytesToWrite % 4 != 0)
225 SEMF_ERROR(
"write does not support less than 4 bytes");
230#if defined(STM32F1) || defined(STM32F3)
231 if (m_bytesToWrite % 2 != 0)
233 SEMF_ERROR(
"write does not support less than 2 bytes");
240 HAL_StatusTypeDef state = HAL_StatusTypeDef::HAL_OK;
241 if (m_bytesToWrite >=
sizeof(uint64_t))
243 m_bytesToWrite -=
sizeof(uint64_t);
244 state = HAL_FLASH_Program_IT(FLASH_TYPEPROGRAM_DOUBLEWORD, m_addressWrite, *
reinterpret_cast<uint32_t*
>(m_dataWrite));
247 else if (m_bytesToWrite >=
sizeof(uint32_t))
249 m_bytesToWrite -=
sizeof(uint32_t);
250 state = HAL_FLASH_Program_IT(FLASH_TYPEPROGRAM_WORD, m_addressWrite, *
reinterpret_cast<uint32_t*
>(m_dataWrite));
253#if !defined(STM32L0) && !defined(STM32F0) && !defined(STM32G0)
254 else if (m_bytesToWrite >=
sizeof(uint16_t))
256 m_bytesToWrite -=
sizeof(uint16_t);
257 state = HAL_FLASH_Program_IT(FLASH_TYPEPROGRAM_HALFWORD, m_addressWrite, *
reinterpret_cast<uint16_t*
>(m_dataWrite));
260#if !defined(STM32L0) && !defined(STM32F0) && !defined(STM32F1) && !defined(STM32F3) && !defined(STM32G0)
261 else if (m_bytesToWrite ==
sizeof(uint8_t))
264 state = HAL_FLASH_Program_IT(FLASH_TYPEPROGRAM_BYTE, m_addressWrite, *m_dataWrite);
267 if (state != HAL_StatusTypeDef::HAL_OK)
269 if (state == HAL_ERROR)
274 else if (state == HAL_BUSY)
279 else if (state == HAL_TIMEOUT)
296 if (m_flash->m_eraseIsRunning)
298 if (--m_flash->m_numOfSecotrsToErase)
300 m_flash->m_eraseIsRunning =
false;
302 m_flash->m_isBusy =
false;
308 if (
pFlash.ProcedureOnGoing != FLASH_TYPENONE)
311 if (
pFlash.ProcedureOnGoing != FLASH_PROC_NONE)
315 HAL_StatusTypeDef state = HAL_StatusTypeDef::HAL_OK;
316 if (m_flash->m_bytesToWrite >=
sizeof(uint64_t))
318 m_flash->m_bytesToWrite -=
sizeof(uint64_t);
319 m_flash->m_dataWrite +=
sizeof(uint64_t);
320 m_flash->m_addressWrite +=
sizeof(uint64_t);
321 state = HAL_FLASH_Program_IT(FLASH_TYPEPROGRAM_DOUBLEWORD, m_flash->m_addressWrite, *
reinterpret_cast<uint32_t*
>(m_flash->m_dataWrite));
324 if (m_flash->m_bytesToWrite >=
sizeof(uint32_t))
326 m_flash->m_bytesToWrite -=
sizeof(uint32_t);
327 m_flash->m_dataWrite +=
sizeof(uint32_t);
328 m_flash->m_addressWrite +=
sizeof(uint32_t);
329 state = HAL_FLASH_Program_IT(FLASH_TYPEPROGRAM_WORD, m_flash->m_addressWrite, *
reinterpret_cast<uint32_t*
>(m_flash->m_dataWrite));
332#if !defined(STM32L0) && !defined(STM32F0) && !defined(STM32G0)
333 else if (m_flash->m_bytesToWrite >=
sizeof(uint16_t))
335 m_flash->m_bytesToWrite -=
sizeof(uint16_t);
336 m_flash->m_dataWrite +=
sizeof(uint16_t);
337 m_flash->m_addressWrite +=
sizeof(uint16_t);
338 state = HAL_FLASH_Program_IT(FLASH_TYPEPROGRAM_HALFWORD, m_flash->m_addressWrite, *
reinterpret_cast<uint16_t*
>(m_flash->m_dataWrite));
341#if !defined(STM32L0) && !defined(STM32F0) && !defined(STM32F1) && !defined(STM32F3) && !defined(STM32G0)
342 else if (m_flash->m_bytesToWrite ==
sizeof(uint8_t))
344 m_flash->m_bytesToWrite--;
345 m_flash->m_dataWrite++;
346 m_flash->m_addressWrite++;
347 state = HAL_FLASH_Program_IT(FLASH_TYPEPROGRAM_BYTE, m_flash->m_addressWrite, *m_flash->m_dataWrite);
353 m_flash->m_isBusy =
false;
355 if (state == HAL_StatusTypeDef::HAL_OK)
362 if (state == HAL_ERROR)
367 else if (state == HAL_BUSY)
372 else if (state == HAL_TIMEOUT)
384 m_flash->m_eraseIsRunning =
false;
385 m_flash->m_isBusy =
false;
Class for representing errors. Every error should have a unique source code. As a user feel encourage...
void erase(size_t sector, size_t numOfSectors=1) override
Erase sector(s).
uint16_t size() const
Returns the size of the flash in kBytes.
void write(uint32_t address, const uint8_t data[], size_t dataSize) override
Writes data into the storage.
void read(uint32_t address, uint8_t buffer[], size_t bufferSize) override
Reads data from the storage into a given read buffer.
static void isr()
This function must be called from isr.
@ Write_DataNot2ByteAligned
@ Erase_SectorOutOfBounds
@ IsrError_InterruptError
@ Write_DataNot4ByteAligned
@ Write_DataNot8ByteAligned
static void isrError()
This function is call from isr when an error has occurred.
Stm32Flash(uint16_t size, uint32_t voltageRange, uint32_t bank)
Constructor.
bool isBusy() const override
Returns if the storage is busy reading, writing or e.g. erasing.
virtual uint32_t address(size_t sector) const =0
Return on which address a sector starts.
virtual size_t sector(uint32_t address) const =0
Return in which sector an address is located.
virtual size_t numberOfSectors() const =0
Return the number/amount of sectors of a flash memory.
#define SEMF_SINGLETON_ERROR(object,...)
#define SEMF_SINGLETON_INFO(object,...)
FLASH_ProcessTypeDef pFlash
void semfStm32FlashIsr()
This function must be called in the HAL_FLASH_EndOfOperationCallback().