From 10875890e002a667f44b4416feebd1110bffe14b Mon Sep 17 00:00:00 2001 From: francisco Date: Tue, 18 Jun 2019 11:05:02 +0200 Subject: [PATCH 1/4] stm32_common/flashpage: use HSI only for stm32f0/1 - Before, HSI was enabled as the default case when it is only used for stm32f0 and stm32f1. It is now implemented explicitly for those platforms, and only those. --- cpu/stm32_common/periph/flashpage.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/cpu/stm32_common/periph/flashpage.c b/cpu/stm32_common/periph/flashpage.c index 8e99c3c7dd..b1244c02a6 100644 --- a/cpu/stm32_common/periph/flashpage.c +++ b/cpu/stm32_common/periph/flashpage.c @@ -77,7 +77,8 @@ static void _erase_page(void *page_addr) uint32_t *dst = page_addr; #else uint16_t *dst = page_addr; - +#endif +#if defined(CPU_FAM_STM32F0) || defined(CPU_FAM_STM32F1) uint32_t hsi_state = (RCC->CR & RCC_CR_HSION); /* the internal RC oscillator (HSI) must be enabled */ stmclk_enable_hsi(); @@ -131,8 +132,7 @@ static void _erase_page(void *page_addr) /* lock the flash module again */ _lock(); -#if !(defined(CPU_FAM_STM32L0) || defined(CPU_FAM_STM32L1) || \ - defined(CPU_FAM_STM32L4)) +#if defined(CPU_FAM_STM32F0) || defined(CPU_FAM_STM32F1) /* restore the HSI state */ if (!hsi_state) { stmclk_disable_hsi(); @@ -163,7 +163,9 @@ void flashpage_write_raw(void *target_addr, const void *data, size_t len) #else uint16_t *dst = (uint16_t *)target_addr; const uint16_t *data_addr = data; +#endif +#if defined(CPU_FAM_STM32F0) || defined(CPU_FAM_STM32F1) uint32_t hsi_state = (RCC->CR & RCC_CR_HSION); /* the internal RC oscillator (HSI) must be enabled */ stmclk_enable_hsi(); @@ -191,8 +193,7 @@ void flashpage_write_raw(void *target_addr, const void *data, size_t len) /* lock the flash module again */ _lock(); -#if !(defined(CPU_FAM_STM32L0) || defined(CPU_FAM_STM32L1) || \ - defined(CPU_FAM_STM32L4)) +#if defined(CPU_FAM_STM32F0) || defined(CPU_FAM_STM32F1) /* restore the HSI state */ if (!hsi_state) { stmclk_disable_hsi(); From eb78d35096757aea7c82f9992dc456c662377cb4 Mon Sep 17 00:00:00 2001 From: francisco Date: Thu, 20 Jun 2019 09:28:27 +0200 Subject: [PATCH 2/4] stm32_common/flashpage: make implicit CPU_FAM defines explicit --- cpu/stm32_common/periph/flashpage.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cpu/stm32_common/periph/flashpage.c b/cpu/stm32_common/periph/flashpage.c index b1244c02a6..b98e8ced4f 100644 --- a/cpu/stm32_common/periph/flashpage.c +++ b/cpu/stm32_common/periph/flashpage.c @@ -175,7 +175,8 @@ void flashpage_write_raw(void *target_addr, const void *data, size_t len) _unlock_flash(); DEBUG("[flashpage_raw] write: now writing the data\n"); -#if !(defined(CPU_FAM_STM32L0) || defined(CPU_FAM_STM32L1)) +#if defined(CPU_FAM_STM32F0) || defined(CPU_FAM_STM32F1) || \ + defined(CPU_FAM_STM32L4) /* set PG bit and program page to flash */ CNTRL_REG |= FLASH_CR_PG; #endif From 5e709edb3104cc1b56331530d60fe4d5f5cdd306 Mon Sep 17 00:00:00 2001 From: francisco Date: Tue, 18 Jun 2019 11:07:22 +0200 Subject: [PATCH 3/4] stm32_common/flashpage: remove repeated command --- cpu/stm32_common/periph/flashpage.c | 1 - 1 file changed, 1 deletion(-) diff --git a/cpu/stm32_common/periph/flashpage.c b/cpu/stm32_common/periph/flashpage.c index b98e8ced4f..7d7819eb31 100644 --- a/cpu/stm32_common/periph/flashpage.c +++ b/cpu/stm32_common/periph/flashpage.c @@ -99,7 +99,6 @@ static void _erase_page(void *page_addr) *dst = (uint32_t)0; #elif defined(CPU_FAM_STM32L4) DEBUG("[flashpage] erase: setting the page address\n"); - CNTRL_REG |= FLASH_CR_PER; uint8_t pn; #if FLASHPAGE_NUMOF <= 256 pn = (uint8_t)flashpage_page(dst); From 46b90134ad871bb0a1e57ecc65cf4b9e36cb9331 Mon Sep 17 00:00:00 2001 From: francisco Date: Tue, 18 Jun 2019 11:23:48 +0200 Subject: [PATCH 4/4] stm32_common/flashpage: cleanup stm32l0/1 - Since writes are performed per word no actions need to be performed for flash access, and the FPRG doesn't need to be cleared. --- cpu/stm32_common/periph/flashpage.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cpu/stm32_common/periph/flashpage.c b/cpu/stm32_common/periph/flashpage.c index 7d7819eb31..ba304dc26c 100644 --- a/cpu/stm32_common/periph/flashpage.c +++ b/cpu/stm32_common/periph/flashpage.c @@ -38,7 +38,6 @@ #define CNTRL_REG (FLASH->PECR) #define CNTRL_REG_LOCK (FLASH_PECR_PELOCK) #define FLASH_CR_PER (FLASH_PECR_ERASE | FLASH_PECR_PROG) -#define FLASH_CR_PG (FLASH_PECR_FPRG | FLASH_PECR_PROG) #define FLASHPAGE_DIV (4U) /* write 4 bytes in one go */ #else #if defined(CPU_FAM_STM32L4) @@ -187,7 +186,10 @@ void flashpage_write_raw(void *target_addr, const void *data, size_t len) } /* clear program bit again */ +#if defined(CPU_FAM_STM32F0) || defined(CPU_FAM_STM32F1) || \ + defined(CPU_FAM_STM32L4) CNTRL_REG &= ~(FLASH_CR_PG); +#endif DEBUG("[flashpage_raw] write: done writing data\n"); /* lock the flash module again */