From bb5a94e9ab840ea4e2f7e5a1641e23c6d14ab5a4 Mon Sep 17 00:00:00 2001 From: khristolyubov Date: Mon, 19 Aug 2024 13:05:50 +0700 Subject: [PATCH] =?UTF-8?q?=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B0=20=D1=81=D1=82=D1=80=D0=BE=D0=BA=20hex=20=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D0=B5=D0=B5=2016=20=D0=B1=D0=B0=D0=B9=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit исправлен баг с загрузкой hex файла, в котором не все Data-записи по 16 байт --- src/bootloader.c | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/bootloader.c b/src/bootloader.c index c411b0e..ac05a7c 100644 --- a/src/bootloader.c +++ b/src/bootloader.c @@ -182,7 +182,8 @@ void Bootloader_LoadArrayInRam(uint8_t uart_data[]) uint32_t abs_addr = 0; // адрес из хекса uint32_t rel_addr = 0; // адрес от начала области spifi, по нему определяем, надо ли стирать сектор и какой именно -uint8_t page_data[256] = {0}; // сюда собираем распарсенные данные из хекса +#define TAIL_SIZE 15 // если попадутся строки хекса, в которых не 16 байт, то мы рискуем записать данные уарта мимо буфера package_data. а если больше 16 байт, то это проблема завтрашнего дня +uint8_t page_data[MAX_PACKAGE_SIZE + TAIL_SIZE] = {0}; // сюда собираем распарсенные данные из хекса uint16_t page_fill_size = 0; // счетчик, сколько заполнно в page_data. когда page_data заполнена до конца - будем записывать в spifi void go_to_spifi(); @@ -195,12 +196,19 @@ void mem_write() HAL_SPIFI_W25_SectorErase4K(&spifi, rel_addr); // записываем страницу в 256 байт в spifi - HAL_SPIFI_W25_PageProgram(&spifi, (uint32_t)hBootloader.address, 256, page_data); + HAL_SPIFI_W25_PageProgram(&spifi, (uint32_t)hBootloader.address, MAX_PACKAGE_SIZE, page_data); // увеличиваем адреса, по которым писать и стирать - hBootloader.address += 256; - // обнуляем буфер и счетчик заполнения буфера - page_fill_size = 0; - memset(page_data, 0, 256); + hBootloader.address += MAX_PACKAGE_SIZE; + // обнуляем часть буфера, которая была записана в память и уменьшаем счетчик заполнения буфера на столько, сколько было записано + if (page_fill_size <= MAX_PACKAGE_SIZE) + page_fill_size = 0; + else + page_fill_size -= MAX_PACKAGE_SIZE; + memset(&page_data[0], 0, MAX_PACKAGE_SIZE); + // хвост копируем в начало буфера, чтобы записать его в следующий раз + memcpy(&page_data[0], &page_data[MAX_PACKAGE_SIZE], TAIL_SIZE); + // а сам хвост обнуляем + memset(&page_data[MAX_PACKAGE_SIZE], 0, TAIL_SIZE); } void Bootloader_parseHexAndLoadInMemory(uint8_t rx_data[]) { @@ -223,7 +231,7 @@ void Bootloader_parseHexAndLoadInMemory(uint8_t rx_data[]) // указываем, на сколько заполнился буфер page_fill_size += rx_data[BYTE_COUNT_POS]; // если пора записывать целую страницу - пишемм - if (page_fill_size == 256) + if (page_fill_size >= 256) mem_write(); break;