добавлен расчет контрольной суммы при получении новой строки. сли crc не сходится - выход из загрузчика
This commit is contained in:
parent
2452db9096
commit
32608935ec
@ -42,6 +42,7 @@ typedef enum
|
|||||||
{
|
{
|
||||||
ERROR_NONE = 0,
|
ERROR_NONE = 0,
|
||||||
ERROR_TIMEOUT = 1, // Время ожидания истекло
|
ERROR_TIMEOUT = 1, // Время ожидания истекло
|
||||||
|
ERROR_CRC
|
||||||
} Bootloader_error;
|
} Bootloader_error;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
@ -142,6 +143,14 @@ void Bootloader_ErrorHandler()
|
|||||||
|
|
||||||
go_to_spifi(); // переход в основную программу, если в течение TIMEOUT_VALUE нет принятых данных
|
go_to_spifi(); // переход в основную программу, если в течение TIMEOUT_VALUE нет принятых данных
|
||||||
break;
|
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;
|
hBootloader.error = ERROR_NONE;
|
||||||
@ -168,8 +177,8 @@ uint8_t erase_chip(SPIFI_HandleTypeDef *spifi)
|
|||||||
|
|
||||||
// разметка строки в хекс-файле
|
// разметка строки в хекс-файле
|
||||||
#define BYTE_COUNT_POS 0 // индекс счетчика байт данных
|
#define BYTE_COUNT_POS 0 // индекс счетчика байт данных
|
||||||
#define ADDRES_POS 1 // индекс адреса
|
#define ADDRESS_POS 1 // индекс адреса
|
||||||
#define ADDRES_QTY 2 // количество байт адреса
|
#define ADDRESS_QTY 2 // количество байт адреса
|
||||||
#define RECORD_TYPE_POS 3 // индекс типа записи
|
#define RECORD_TYPE_POS 3 // индекс типа записи
|
||||||
#define DATA_POS 4 // индекс начала данных в команде
|
#define DATA_POS 4 // индекс начала данных в команде
|
||||||
|
|
||||||
@ -245,29 +254,38 @@ void Bootloader_parseHexAndLoadInMemory(uint8_t rx_data[])
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
uint8_t uart_data[MAX_PACKAGE_SIZE] = {0}; // Массив данных из полученного пакета
|
uint8_t uart_data[MAX_PACKAGE_SIZE] = {0}; // Массив данных из полученного пакета
|
||||||
|
uint32_t crc_acc = 0;
|
||||||
|
uint8_t crc = 0;
|
||||||
void Bootloader_UART_ReadPackage()
|
void Bootloader_UART_ReadPackage()
|
||||||
{
|
{
|
||||||
|
crc_acc = 0;
|
||||||
for (uint32_t counter = 0; counter < hBootloader.size_package; counter++)
|
for (uint32_t counter = 0; counter < hBootloader.size_package; counter++)
|
||||||
{
|
{
|
||||||
timeout = 0;
|
timeout = 0;
|
||||||
while ((!(UART_0->FLAGS & UART_FLAGS_RXNE_M)) && (timeout != TIMEOUT_VALUE)) // Ожидание байта пакета
|
while ((!(UART_0->FLAGS & UART_FLAGS_RXNE_M)) && (timeout != TIMEOUT_VALUE)) // Ожидание байта пакета
|
||||||
{
|
|
||||||
timeout++;
|
timeout++;
|
||||||
}
|
|
||||||
|
|
||||||
if (timeout == TIMEOUT_VALUE)
|
if (timeout == TIMEOUT_VALUE)
|
||||||
{
|
{
|
||||||
hBootloader.error = ERROR_TIMEOUT;
|
hBootloader.error = ERROR_TIMEOUT;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
uart_data[counter] = UART_0->RXDATA;
|
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);
|
Bootloader_parseHexAndLoadInMemory(uart_data);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t eraseChipBufferIndex = 0; // Индекс для накопления команды erase chip
|
uint8_t eraseChipBufferIndex = 0; // Индекс для накопления команды erase chip
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user