summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ports/stm32/flash.c34
-rw-r--r--ports/stm32/flashbdev.c8
2 files changed, 41 insertions, 1 deletions
diff --git a/ports/stm32/flash.c b/ports/stm32/flash.c
index 10e1d2eff..4042785fa 100644
--- a/ports/stm32/flash.c
+++ b/ports/stm32/flash.c
@@ -68,15 +68,25 @@ static const flash_layout_t flash_layout[] = {
{ (uint32_t)FLASH_BASE, (uint32_t)FLASH_PAGE_SIZE, 512 },
};
+#elif defined(STM32H7)
+
+static const flash_layout_t flash_layout[] = {
+ { 0x08000000, 0x20000, 8 },
+};
+
#else
#error Unsupported processor
#endif
-#if defined(MCU_SERIES_L4)
+#if defined(MCU_SERIES_L4) || defined(STM32H7)
// get the bank of a given flash address
static uint32_t get_bank(uint32_t addr) {
+ #if defined(STM32H7)
+ if (READ_BIT(FLASH->OPTCR, FLASH_OPTCR_SWAP_BANK) == 0) {
+ #else
if (READ_BIT(SYSCFG->MEMRMP, SYSCFG_MEMRMP_FB_MODE) == 0) {
+ #endif
// no bank swap
if (addr < (FLASH_BASE + FLASH_BANK_SIZE)) {
return FLASH_BANK_1;
@@ -93,6 +103,7 @@ static uint32_t get_bank(uint32_t addr) {
}
}
+#if defined(MCU_SERIES_L4)
// get the page of a given flash address
static uint32_t get_page(uint32_t addr) {
if (addr < (FLASH_BASE + FLASH_BANK_SIZE)) {
@@ -103,6 +114,7 @@ static uint32_t get_page(uint32_t addr) {
return (addr - (FLASH_BASE + FLASH_BANK_SIZE)) / FLASH_PAGE_SIZE;
}
}
+#endif
#endif
@@ -153,12 +165,19 @@ void flash_erase(uint32_t flash_dest, const uint32_t *src, uint32_t num_word32)
EraseInitStruct.NbPages = get_page(flash_dest + 4 * num_word32 - 1) - EraseInitStruct.Page + 1;;
#else
// Clear pending flags (if any)
+ #if defined(STM32H7)
+ __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_ALL_ERRORS_BANK1 | FLASH_FLAG_ALL_ERRORS_BANK2);
+ #else
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR |
FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);
+ #endif
// erase the sector(s)
EraseInitStruct.TypeErase = TYPEERASE_SECTORS;
EraseInitStruct.VoltageRange = VOLTAGE_RANGE_3; // voltage range needs to be 2.7V to 3.6V
+ #if defined(STM32H7)
+ EraseInitStruct.Banks = get_bank(flash_dest);
+ #endif
EraseInitStruct.Sector = flash_get_sector_info(flash_dest, NULL, NULL);
EraseInitStruct.NbSectors = flash_get_sector_info(flash_dest + 4 * num_word32 - 1, NULL, NULL) - EraseInitStruct.Sector + 1;
#endif
@@ -224,6 +243,19 @@ void flash_write(uint32_t flash_dest, const uint32_t *src, uint32_t num_word32)
}
}
+ #elif defined(STM32H7)
+
+ // program the flash 256 bits at a time
+ for (int i = 0; i < num_word32 / 8; i++) {
+ if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD, flash_dest, (uint64_t)(uint32_t)src) != HAL_OK) {
+ // error occurred during flash write
+ HAL_FLASH_Lock(); // lock the flash
+ return;
+ }
+ flash_dest += 32;
+ src += 8;
+ }
+
#else
// program the flash word by word
diff --git a/ports/stm32/flashbdev.c b/ports/stm32/flashbdev.c
index 49fe5c696..ec2e4f212 100644
--- a/ports/stm32/flashbdev.c
+++ b/ports/stm32/flashbdev.c
@@ -85,6 +85,14 @@ STATIC byte flash_cache_mem[0x4000] __attribute__((aligned(4))); // 16k
#define FLASH_MEM_SEG1_START_ADDR (0x08008000) // sector 1
#define FLASH_MEM_SEG1_NUM_BLOCKS (192) // sectors 1,2,3: 32k+32k+32=96k
+#elif defined(STM32H743xx)
+
+// The STM32H743 flash sectors are 128K
+#define CACHE_MEM_START_ADDR (0x20000000) // DTCM data RAM, 128k
+#define FLASH_SECTOR_SIZE_MAX (0x20000) // 128k max
+#define FLASH_MEM_SEG1_START_ADDR (0x08020000) // sector 1
+#define FLASH_MEM_SEG1_NUM_BLOCKS (256) // Sector 1: 128k / 512b = 256 blocks
+
#elif defined(STM32L475xx) || defined(STM32L476xx)
extern uint8_t _flash_fs_start;