From 32608935ec7265cfa06e97cfb0417f072ddaf413 Mon Sep 17 00:00:00 2001 From: klassents Date: Mon, 7 Oct 2024 16:00:14 +0700 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20=D1=80=D0=B0=D1=81=D1=87=D0=B5=D1=82=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BD=D1=82=D1=80=D0=BE=D0=BB=D1=8C=D0=BD=D0=BE=D0=B9=20=D1=81?= =?UTF-8?q?=D1=83=D0=BC=D0=BC=D1=8B=20=D0=BF=D1=80=D0=B8=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=BB=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D0=B8=20=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=D0=BE=D0=B9=20=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B8.=20=D1=81?= =?UTF-8?q?=D0=BB=D0=B8=20crc=20=D0=BD=D0=B5=20=D1=81=D1=85=D0=BE=D0=B4?= =?UTF-8?q?=D0=B8=D1=82=D1=81=D1=8F=20-=20=D0=B2=D1=8B=D1=85=D0=BE=D0=B4?= =?UTF-8?q?=20=D0=B8=D0=B7=20=D0=B7=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D1=87?= =?UTF-8?q?=D0=B8=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/bootloader.c | 34 ++++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/src/bootloader.c b/src/bootloader.c index 395b290..9702aba 100644 --- a/src/bootloader.c +++ b/src/bootloader.c @@ -42,6 +42,7 @@ typedef enum { ERROR_NONE = 0, ERROR_TIMEOUT = 1, // Время ожидания истекло + ERROR_CRC } Bootloader_error; typedef struct @@ -142,6 +143,14 @@ void Bootloader_ErrorHandler() go_to_spifi(); // переход в основную программу, если в течение TIMEOUT_VALUE нет принятых данных break; + case ERROR_CRC: + // отправить nack и перейти в основную программу, если приняли некорректные данные + Bootloader_UART_WriteByte(NACK); + + if (UART_0->FLAGS & UART_FLAGS_ORE_M) + UART_0->FLAGS |= UART_FLAGS_ORE_M; + go_to_spifi(); + break; } hBootloader.error = ERROR_NONE; @@ -168,8 +177,8 @@ uint8_t erase_chip(SPIFI_HandleTypeDef *spifi) // разметка строки в хекс-файле #define BYTE_COUNT_POS 0 // индекс счетчика байт данных -#define ADDRES_POS 1 // индекс адреса -#define ADDRES_QTY 2 // количество байт адреса +#define ADDRESS_POS 1 // индекс адреса +#define ADDRESS_QTY 2 // количество байт адреса #define RECORD_TYPE_POS 3 // индекс типа записи #define DATA_POS 4 // индекс начала данных в команде @@ -245,29 +254,38 @@ void Bootloader_parseHexAndLoadInMemory(uint8_t rx_data[]) } } uint8_t uart_data[MAX_PACKAGE_SIZE] = {0}; // Массив данных из полученного пакета +uint32_t crc_acc = 0; +uint8_t crc = 0; void Bootloader_UART_ReadPackage() { + crc_acc = 0; for (uint32_t counter = 0; counter < hBootloader.size_package; counter++) { timeout = 0; while ((!(UART_0->FLAGS & UART_FLAGS_RXNE_M)) && (timeout != TIMEOUT_VALUE)) // Ожидание байта пакета - { timeout++; - } if (timeout == TIMEOUT_VALUE) { hBootloader.error = ERROR_TIMEOUT; break; } - uart_data[counter] = UART_0->RXDATA; + + // контрольная сумма идет последним байтом в пакете. Суммируем всё, кроме нее + if (counter < (hBootloader.size_package-1)) + crc_acc += uart_data[counter]; + else + { + // посчитать контрольную сумму и сравнить + crc = (256 - crc_acc % 256) % 256; + if (crc != uart_data[counter]) + hBootloader.error = ERROR_CRC; + } } - if (!hBootloader.error) - { + if (hBootloader.error != ERROR_NONE) Bootloader_parseHexAndLoadInMemory(uart_data); - } } uint8_t eraseChipBufferIndex = 0; // Индекс для накопления команды erase chip