В составе нашего контроллера имеется весьма неплохой блок для аппаратного подсчёта CRC32, причём позволяющий очень гибко настроить параметры под любой из популярных алгоритмов. Однако в текущей версии HAL-овской функции длина обрабатываемой последовательности ограничена размером аппаратного буфера CRC-блока. А можно ли её увеличить? В частности, посчитать CRC на всю длину кода прошивки, ну или хотя бы грубо - на всю ёмкость флешки? Попробуем слегка исправить HAL-овскую функцию и сделать это:
Да, в оригинале HAL_CRC_WriteData() каждый раз переписывает начальное значение в блоке CRC, но нам это не нужно, поэтому убираем.
И такой ещё вопрос: а возможно ли каким-либо образом получить информацию о реальной ёмкости запаянной флешки, когда код прошивки выполняется непосредственно с неё? Чтобы не вбивать константу каждый раз. Я вот попробовал давать команды 0x90 и 0x9F через HAL_SPIFI_SendCommand(), но контроллер на этом месте сразу подвисает. Похоже, "отстреливаю себе ногу".
C:
CRC_HandleTypeDef hcrc;
__HAL_PCC_CRC32_CLK_ENABLE();
hcrc.Instance = CRC;
hcrc.Poly = 0x04C11DB7; //параметры для разновидности CRC32b
hcrc.Init = 0xFFFFFFFF;
hcrc.InputReverse = CRC_REFIN_TRUE;
hcrc.OutputReverse = CRC_REFOUT_TRUE;
hcrc.OutputInversion = CRC_OUTPUTINVERSION_ON;
HAL_CRC_Init(&hcrc);
.
.
.
.
//считает CRC по всей ёмкости флешки
//закомментить в HAL_CRC_WriteData() строку HAL_CRC_SetInit(hcrc);
uint32_t CalcCRC(void)
{
//в каких пределах считать CRC32
#define crc_start 0x80000000
#define crc_capacity 1048576
uint8_t* crc_pointer;
uint32_t crc_result;
uint32_t i;
HAL_CRC_SetInit(&hcrc);
crc_pointer = (uint8_t *)crc_start;
for (i = 0; i < (crc_capacity - CRC_MAX_BYTES); i += CRC_MAX_BYTES)
{
HAL_CRC_WriteData(&hcrc, crc_pointer, CRC_MAX_BYTES);
HAL_CRC_WaitBusy(&hcrc);
crc_pointer += CRC_MAX_BYTES;
}
HAL_CRC_WriteData(&hcrc, crc_pointer, (crc_capacity - i));
HAL_CRC_WaitBusy(&hcrc);
return HAL_CRC_ReadCRC(&hcrc);
}
И такой ещё вопрос: а возможно ли каким-либо образом получить информацию о реальной ёмкости запаянной флешки, когда код прошивки выполняется непосредственно с неё? Чтобы не вбивать константу каждый раз. Я вот попробовал давать команды 0x90 и 0x9F через HAL_SPIFI_SendCommand(), но контроллер на этом месте сразу подвисает. Похоже, "отстреливаю себе ногу".