добавлен расчет контрольной суммы при получении новой строки. сли crc не сходится - выход из загрузчика
This commit is contained in:
parent
2452db9096
commit
32608935ec
@ -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,30 +254,39 @@ 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
|
||||
void Bootloader_Commands()
|
||||
|
||||
Loading…
Reference in New Issue
Block a user