diff --git a/hal/stm32g0.c b/hal/stm32g0.c index 8becc90f..aea0fc8b 100644 --- a/hal/stm32g0.c +++ b/hal/stm32g0.c @@ -150,18 +150,17 @@ int RAMFUNCTION hal_flash_write(uint32_t address, const uint8_t *data, int len) flash_wait_complete(); i+=8; } else { + uint32_t unit_addr = (address + i) & (~0x07); + int off = (address + i) - unit_addr; uint32_t val[2]; uint8_t *vbytes = (uint8_t *)(val); - int off = (address + i) - (((address + i) >> 3) << 3); - uint32_t base_addr = address & (~0x07); /* aligned to 64 bit */ - int u32_idx = (i >> 2); - dst = (uint32_t *)(base_addr); - val[0] = dst[u32_idx]; - val[1] = dst[u32_idx + 1]; + dst = (uint32_t *)unit_addr; + val[0] = dst[0]; + val[1] = dst[1]; while ((off < 8) && (i < len)) vbytes[off++] = data[i++]; - dst[u32_idx] = val[0]; - dst[u32_idx + 1] = val[1]; + dst[0] = val[0]; + dst[1] = val[1]; flash_wait_complete(); } } diff --git a/hal/stm32l4.c b/hal/stm32l4.c index 84bcc858..10bc6f29 100644 --- a/hal/stm32l4.c +++ b/hal/stm32l4.c @@ -146,18 +146,17 @@ int RAMFUNCTION hal_flash_write(uint32_t address, const uint8_t *data, int len) flash_wait_complete(); i+=8; } else { + uint32_t unit_addr = (address + i) & (~0x07); + int off = (address + i) - unit_addr; uint32_t val[2]; uint8_t *vbytes = (uint8_t *)(val); - int off = (address + i) - (((address + i) >> 3) << 3); - uint32_t base_addr = address & (~0x07); /* aligned to 64 bit */ - int u32_idx = (i >> 2); - dst = (uint32_t *)(base_addr); - val[0] = dst[u32_idx]; - val[1] = dst[u32_idx + 1]; + dst = (uint32_t *)unit_addr; + val[0] = dst[0]; + val[1] = dst[1]; while ((off < 8) && (i < len)) vbytes[off++] = data[i++]; - dst[u32_idx] = val[0]; - dst[u32_idx + 1] = val[1]; + dst[0] = val[0]; + dst[1] = val[1]; flash_wait_complete(); } } diff --git a/hal/stm32wb.c b/hal/stm32wb.c index 805f9004..2cccf814 100644 --- a/hal/stm32wb.c +++ b/hal/stm32wb.c @@ -204,18 +204,17 @@ int RAMFUNCTION hal_flash_write(uint32_t address, const uint8_t *data, int len) flash_wait_complete(); i+=8; } else { + uint32_t unit_addr = (address + i) & (~0x07); + int off = (address + i) - unit_addr; uint32_t val[2]; uint8_t *vbytes = (uint8_t *)(val); - int off = (address + i) - (((address + i) >> 3) << 3); - uint32_t base_addr = address & (~0x07); /* aligned to 64 bit */ - int u32_idx = (i >> 2); - dst = (uint32_t *)(base_addr); - val[0] = dst[u32_idx]; - val[1] = dst[u32_idx + 1]; + dst = (uint32_t *)unit_addr; + val[0] = dst[0]; + val[1] = dst[1]; while ((off < 8) && (i < len)) vbytes[off++] = data[i++]; - dst[u32_idx] = val[0]; - dst[u32_idx + 1] = val[1]; + dst[0] = val[0]; + dst[1] = val[1]; flash_wait_complete(); } }