From f1d8a2d149bc84b6633d0fb7cd788bb6a380e427 Mon Sep 17 00:00:00 2001 From: arturo182 Date: Sat, 10 Feb 2018 14:43:58 +0100 Subject: [PATCH] nrf: Fix memory misalignment during flash write --- ports/nrf/internal_flash.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/ports/nrf/internal_flash.c b/ports/nrf/internal_flash.c index 9df1051461..2f069a2f95 100644 --- a/ports/nrf/internal_flash.c +++ b/ports/nrf/internal_flash.c @@ -90,7 +90,7 @@ bool internal_flash_write_block(const uint8_t *src, uint32_t block) { uint32_t dest = convert_block_to_flash_addr(block); uint32_t pagenum = dest / FLASH_PAGE_SIZE; - uint8_t* flash_align = (uint8_t*) (pagenum*FLASH_PAGE_SIZE); + uint32_t* flash_align = (uint32_t*) (pagenum*FLASH_PAGE_SIZE); // Read back current page to update only 512 portion __ALIGN(4) uint8_t buf[FLASH_PAGE_SIZE]; @@ -105,7 +105,7 @@ bool internal_flash_write_block(const uint8_t *src, uint32_t block) { return false; } - if (NRF_SUCCESS != sd_flash_write((uint32_t*) flash_align, (uint32_t*) buf, FLASH_PAGE_SIZE / sizeof(uint32_t))) { + if (NRF_SUCCESS != sd_flash_write(flash_align, (uint32_t*) buf, FLASH_PAGE_SIZE / sizeof(uint32_t))) { return false; } } @@ -123,14 +123,15 @@ bool internal_flash_write_block(const uint8_t *src, uint32_t block) { while (NRF_NVMC->READY == NVMC_READY_READY_Busy); // Write - uint32_t *src = (uint32_t*) buf; + uint32_t *p_src = (uint32_t*) buf; + uint32_t *p_dest = flash_align; uint32_t i = 0; while (i < (FLASH_PAGE_SIZE / sizeof(uint32_t))) { NRF_NVMC->CONFIG = (NVMC_CONFIG_WEN_Wen << NVMC_CONFIG_WEN_Pos); while (NRF_NVMC->READY == NVMC_READY_READY_Busy); - *flash_align++ = *src++; + *p_dest++ = *p_src++; while (NRF_NVMC->READY == NVMC_READY_READY_Busy);