Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of mbed-dev by
Diff: targets/TARGET_STM/TARGET_STM32F7/flash_api.c
- Revision:
- 175:af195413fb11
- Parent:
- 174:b96e65c34a4d
--- a/targets/TARGET_STM/TARGET_STM32F7/flash_api.c Mon Oct 02 15:33:19 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32F7/flash_api.c Wed Oct 11 12:45:49 2017 +0100
@@ -38,14 +38,24 @@
int32_t flash_init(flash_t *obj)
{
- /* Allow Access to Flash control registers and user Flash */
+ return 0;
+}
+int32_t flash_free(flash_t *obj)
+{
+ return 0;
+}
+
+static int32_t flash_unlock(void)
+{
+ /* Allow Access to Flash control registers and user Falsh */
if (HAL_FLASH_Unlock()) {
return -1;
} else {
return 0;
}
}
-int32_t flash_free(flash_t *obj)
+
+static int32_t flash_lock(void)
{
/* Disable the Flash option control register access (recommended to protect
the option Bytes against possible unwanted operations) */
@@ -55,6 +65,7 @@
return 0;
}
}
+
int32_t flash_erase_sector(flash_t *obj, uint32_t address)
{
/* Variable used for Erase procedure */
@@ -62,11 +73,16 @@
FLASH_OBProgramInitTypeDef OBInit;
uint32_t SectorId;
uint32_t SectorError = 0;
+ int32_t status = 0;
if ((address >= (FLASH_BASE + FLASH_SIZE)) || (address < FLASH_BASE)) {
return -1;
}
+ if (flash_unlock() != HAL_OK) {
+ return -1;
+ }
+
/* Note: If an erase operation in Flash memory also concerns data in the data or instruction cache,
you have to make sure that these data are rewritten before they are accessed during code
execution. If this cannot be done safely, it is recommended to flush the caches by setting the
@@ -102,19 +118,27 @@
EraseInitStruct.NbSectors = 1;
if(HAL_FLASHEx_Erase(&EraseInitStruct, &SectorError) != HAL_OK){
- return -1;
- } else {
- return 0;
+ status = -1;
}
+
+ flash_lock();
+
+ return status;
}
int32_t flash_program_page(flash_t *obj, uint32_t address, const uint8_t *data,
uint32_t size)
{
+ int32_t status = 0;
+
if ((address >= (FLASH_BASE + FLASH_SIZE)) || (address < FLASH_BASE)) {
return -1;
}
+ if (flash_unlock() != HAL_OK) {
+ return -1;
+ }
+
/* Note: If an erase operation in Flash memory also concerns data in the data or instruction cache,
you have to make sure that these data are rewritten before they are accessed during code
execution. If this cannot be done safely, it is recommended to flush the caches by setting the
@@ -123,17 +147,20 @@
__HAL_FLASH_ART_RESET();
__HAL_FLASH_ART_ENABLE();
- while (size > 0) {
+ while ((size > 0) && (status == 0)) {
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_BYTE,
address, (uint64_t)*data) != HAL_OK) {
- return -1;
+ status = -1;
} else {
size--;
address++;
data++;
}
}
- return 0;
+
+ flash_lock();
+
+ return status;
}
uint32_t flash_get_sector_size(const flash_t *obj, uint32_t address)
