From b8ede60d9d2c54a90b4065fdd9a2cca655495fba Mon Sep 17 00:00:00 2001 From: Karl Palsson Date: Wed, 25 Jul 2018 23:37:12 +0000 Subject: stm32f3: flash: support basic write/erase operations Originally filed as https://github.com/libopencm3/libopencm3/pull/627 --- include/libopencm3/stm32/f3/flash.h | 3 +++ lib/stm32/f3/flash.c | 46 ++++++++++++++++++++++++++++++++++++- 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/include/libopencm3/stm32/f3/flash.h b/include/libopencm3/stm32/f3/flash.h index ca561efb..a978ebf7 100644 --- a/include/libopencm3/stm32/f3/flash.h +++ b/include/libopencm3/stm32/f3/flash.h @@ -99,6 +99,9 @@ BEGIN_DECLS void flash_clear_pgerr_flag(void); void flash_clear_wrprterr_flag(void); +void flash_program_half_word(uint32_t address, uint16_t data); +void flash_erase_page(uint32_t page_address); +void flash_erase_all_pages(void); END_DECLS diff --git a/lib/stm32/f3/flash.c b/lib/stm32/f3/flash.c index ffd03c30..da8dfb68 100644 --- a/lib/stm32/f3/flash.c +++ b/lib/stm32/f3/flash.c @@ -46,6 +46,11 @@ #include +void flash_wait_for_last_operation(void) +{ + while ((FLASH_SR & FLASH_SR_BSY) == FLASH_SR_BSY); +} + void flash_clear_pgerr_flag(void) { FLASH_SR |= FLASH_SR_PGERR; @@ -57,10 +62,11 @@ void flash_clear_wrprterr_flag(void) } /*---------------------------------------------------------------------------*/ + /** @brief Clear All Status Flags Clears program error, end of operation, busy flags. -*/ + */ void flash_clear_status_flags(void) { @@ -69,5 +75,43 @@ void flash_clear_status_flags(void) flash_clear_eop_flag(); } +void flash_program_half_word(uint32_t address, uint16_t data) +{ + flash_wait_for_last_operation(); + + FLASH_CR |= FLASH_CR_PG; + + MMIO16(address) = data; + + flash_wait_for_last_operation(); + + FLASH_CR &= ~FLASH_CR_PG; +} + +void flash_erase_page(uint32_t page_address) +{ + flash_wait_for_last_operation(); + + FLASH_CR |= FLASH_CR_PER; + FLASH_AR = page_address; + FLASH_CR |= FLASH_CR_STRT; + + flash_wait_for_last_operation(); + + FLASH_CR &= ~FLASH_CR_PER; +} + +void flash_erase_all_pages(void) +{ + flash_wait_for_last_operation(); + + FLASH_CR |= FLASH_CR_MER; + FLASH_CR |= FLASH_CR_STRT; + + flash_wait_for_last_operation(); + FLASH_CR &= ~FLASH_CR_MER; +} + + /**@}*/ -- cgit v1.2.3