stm32f3: flash: support basic write/erase operations
Originally filed as https://github.com/libopencm3/libopencm3/pull/627
This commit is contained in:
parent
3293913be2
commit
b8ede60d9d
@ -99,6 +99,9 @@ BEGIN_DECLS
|
|||||||
|
|
||||||
void flash_clear_pgerr_flag(void);
|
void flash_clear_pgerr_flag(void);
|
||||||
void flash_clear_wrprterr_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
|
END_DECLS
|
||||||
|
|
||||||
|
@ -46,6 +46,11 @@
|
|||||||
|
|
||||||
#include <libopencm3/stm32/flash.h>
|
#include <libopencm3/stm32/flash.h>
|
||||||
|
|
||||||
|
void flash_wait_for_last_operation(void)
|
||||||
|
{
|
||||||
|
while ((FLASH_SR & FLASH_SR_BSY) == FLASH_SR_BSY);
|
||||||
|
}
|
||||||
|
|
||||||
void flash_clear_pgerr_flag(void)
|
void flash_clear_pgerr_flag(void)
|
||||||
{
|
{
|
||||||
FLASH_SR |= FLASH_SR_PGERR;
|
FLASH_SR |= FLASH_SR_PGERR;
|
||||||
@ -57,10 +62,11 @@ void flash_clear_wrprterr_flag(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
/** @brief Clear All Status Flags
|
/** @brief Clear All Status Flags
|
||||||
|
|
||||||
Clears program error, end of operation, busy flags.
|
Clears program error, end of operation, busy flags.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void flash_clear_status_flags(void)
|
void flash_clear_status_flags(void)
|
||||||
{
|
{
|
||||||
@ -69,5 +75,43 @@ void flash_clear_status_flags(void)
|
|||||||
flash_clear_eop_flag();
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**@}*/
|
/**@}*/
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user