Skip to content

Commit 6abdfca

Browse files
committed
fix: Reduces some flash erasure problems
Putting memcpy into RAM for execution Turn off interrupt execution when erasing flash.
1 parent 3a66611 commit 6abdfca

3 files changed

Lines changed: 14 additions & 2 deletions

File tree

src/fw/drivers/flash/sf32lb52_int_flash.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ static int prv_erase_nor(uint32_t addr, uint32_t size) {
7979
FLASH_HandleTypeDef *hflash;
8080
uint32_t taddr, remain;
8181
int res;
82+
__disable_irq();
8283

8384
hflash = &spi_flash_handle.handle;
8485

@@ -98,6 +99,7 @@ static int prv_erase_nor(uint32_t addr, uint32_t size) {
9899
taddr += QSPI_NOR_SECT_SIZE;
99100
}
100101

102+
__enable_irq();
101103
return 0;
102104
}
103105

@@ -106,7 +108,9 @@ static int prv_write_nor(uint32_t addr, uint8_t *buf, uint32_t size) {
106108
uint32_t taddr, start, remain, fill;
107109
uint8_t *tbuf;
108110
int res;
111+
__disable_irq();
109112

113+
HAL_FLASH_SET_WDT(hflash, UINT16_MAX);
110114
hflash = &spi_flash_handle.handle;
111115

112116
if ((addr < hflash->base) || (addr > (hflash->base + hflash->size))) return 0;
@@ -138,6 +142,7 @@ static int prv_write_nor(uint32_t addr, uint8_t *buf, uint32_t size) {
138142
remain -= fill;
139143
}
140144

145+
__enable_irq();
141146
return size;
142147
}
143148

src/fw/sf32lb_em525_flash_fw.ld.template

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ SECTIONS
5555
*.o (.text.rt_memset)
5656
*rt_memclr*.*.o (.text*)
5757
*memset*.*.o (.text*)
58+
*memcpy*.*.o (.text*)
5859

5960
. = ALIGN(4);
6061
__retm_ro_end = .;

src/fw/startup/startup_sf32lb.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,10 +69,16 @@ __attribute__((naked)) NORETURN Reset_Handler(void) {
6969
boot_uart_tx("Reset_Handler\n", 14);
7070

7171
// Copy data section from flash to RAM
72-
memcpy(__data_start, __data_load_start, __data_end - __data_start);
72+
// memcpy(__data_start, __data_load_start, __data_end - __data_start);
73+
for (uint32_t i = 0; i < (__data_end - __data_start); i++) {
74+
__data_start[i] = __data_load_start[i];
75+
}
7376
boot_uart_tx("data copied\n", 12);
7477

75-
memcpy(__retm_ro_start, __retm_ro_load_start, __retm_ro_end - __retm_ro_start);
78+
// memcpy(__retm_ro_start, __retm_ro_load_start, __retm_ro_end - __retm_ro_start);
79+
for (uint32_t i = 0; i < (__retm_ro_end - __retm_ro_start); i++) {
80+
__retm_ro_start[i] = __retm_ro_load_start[i];
81+
}
7682
boot_uart_tx("retm copied\n", 12);
7783

7884
// Clear the bss section, assumes .bss goes directly after .data

0 commit comments

Comments
 (0)