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.
Dependents: STM32_F103-C8T6basecanblink_led
Fork of mbed-dev by
Diff: targets/TARGET_STM/TARGET_STM32L1/flash_api.c
- Revision:
- 176:af195413fb11
- Parent:
- 174:b96e65c34a4d
- Child:
- 178:d650f5d4c87a
--- a/targets/TARGET_STM/TARGET_STM32L1/flash_api.c Mon Oct 02 15:33:19 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32L1/flash_api.c Wed Oct 11 12:45:49 2017 +0100
@@ -26,30 +26,51 @@
int32_t flash_init(flash_t *obj)
{
- /* Unlock the Flash to enable the flash control register access *************/
- HAL_FLASH_Unlock();
return 0;
}
int32_t flash_free(flash_t *obj)
{
- /* Lock the Flash to disable the flash control register access (recommended
- * to protect the FLASH memory against possible unwanted operation) *********/
- HAL_FLASH_Lock();
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;
+ }
+}
+
+static int32_t flash_lock(void)
+{
+ /* Disable the Flash option control register access (recommended to protect
+ the option Bytes against possible unwanted operations) */
+ if (HAL_FLASH_Lock()) {
+ return -1;
+ } else {
+ return 0;
+ }
+}
+
int32_t flash_erase_sector(flash_t *obj, uint32_t address)
{
uint32_t FirstPage = 0;
uint32_t PAGEError = 0;
FLASH_EraseInitTypeDef EraseInitStruct;
+ int32_t status = 0;
if ((address >= (FLASH_BASE + FLASH_SIZE)) || (address < FLASH_BASE)) {
return -1;
}
+ if (flash_unlock() != HAL_OK) {
+ return -1;
+ }
+
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPTVERR | FLASH_FLAG_EOP | FLASH_FLAG_PGAERR | FLASH_FLAG_WRPERR);
/* MBED HAL erases 1 sector at a time */
/* Fill EraseInit structure*/
@@ -63,16 +84,20 @@
DCRST and ICRST bits in the FLASH_CR register. */
if (HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError) != 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)
{
uint32_t StartAddress = 0;
+ int32_t status = 0;
if ((address >= (FLASH_BASE + FLASH_SIZE)) || (address < FLASH_BASE)) {
return -1;
@@ -83,6 +108,10 @@
return -1;
}
+ if (flash_unlock() != HAL_OK) {
+ return -1;
+ }
+
/* Program the user Flash area word by word */
StartAddress = address;
@@ -90,7 +119,7 @@
* parameters doesn't ensure */
if ((uint32_t) data % 4 != 0) {
volatile uint32_t data32;
- while (address < (StartAddress + size)) {
+ while (address < (StartAddress + size) && (status == 0)) {
for (uint8_t i =0; i < 4; i++) {
*(((uint8_t *) &data32) + i) = *(data + i);
}
@@ -99,21 +128,23 @@
address = address + 4;
data = data + 4;
} else {
- return -1;
+ status = -1;
}
}
} else { /* case where data is aligned, so let's avoid any copy */
- while (address < (StartAddress + size)) {
+ while ((address < (StartAddress + size)) && (status == 0)) {
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, address, *((uint32_t*) data)) == HAL_OK) {
address = address + 4;
data = data + 4;
} else {
- return -1;
+ status = -1;
}
}
}
- return 0;
+ flash_lock();
+
+ return status;
}
uint32_t flash_get_sector_size(const flash_t *obj, uint32_t address)
