добавлен расчет контрольной суммы при получении новой строки. сли crc не сходится - выход из загрузчика

This commit is contained in:
klassents 2024-10-07 16:00:14 +07:00
parent 2452db9096
commit 32608935ec

View File

@ -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