Перейти к содержанию
    

Расчет контрольной суммы CRC32 флешь памяти микроконтроллера STM32H743

Попытался реализовать расчет контрольной суммы с помощью аппаратного CRC32 флешь памяти.

Скрытый текст

  /*		crc Flash		*/
	while(FLASH->SR1 & FLASH_SR_QW);
	if(READ_BIT(FLASH->CR1, FLASH_CR_LOCK) != 0U)
	{
	  WRITE_REG(FLASH->KEYR1, FLASH_KEY1);
	  WRITE_REG(FLASH->KEYR1, FLASH_KEY2);
	}
	while(READ_BIT(FLASH->CR1, FLASH_CR_LOCK));

	SET_BIT(FLASH->CR1, FLASH_CR_CRC_EN);

	FLASH->CCR1 = 0xFEF0000; // сброс флагов записи

	FLASH->CRCCR1 |= FLASH_CRCCR_CRC_BURST_1 | FLASH_CRCCR_CRC_BURST_0 | FLASH_CRCCR_CLEAN_CRC | FLASH_CRCCR_CLEAN_SECT;

	FLASH->CRCSADD1 = 0;
	FLASH->CRCEADD1 = 0x7FFC;

	FLASH->CRCCR1 |= FLASH_CRCCR_START_CRC;

	while(!(FLASH->SR1 & FLASH_SR_CRCEND));

	SET_BIT(FLASH->CR1, FLASH_CR_LOCK);

	CRC32 = FLASH->CRCDATA;

 

 в итоге получаю неверную контрольную сумму. 

Изменено пользователем Alex_Golubev

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

20 minutes ago, Alex_Golubev said:

в итоге получаю неверную контрольную сумму. 

Остальным остается только догадываться о каком камне идет речь, вангую некий STM32 ....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, Alex_Golubev said:

 

 в итоге получаю неверную контрольную сумму. 

Как вы определили, что она неверная ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 часа назад, dimka76 сказал:

Как вы определили, что она неверная ?

Телепатически предположу, что не совпадает с результатом подсчета утилиткой из интернета. А все потому, что она считает, что все пропущенные адреса содержат 0, в то время как в реальности там остается 0xFF от стертой флеши.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 minutes ago, Сергей Борщ said:

утилиткой из интернета

Не хватает телепатии угадать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13 часов назад, dimka76 сказал:

Как вы определили, что она неверная ?

Проверил следующем образом. 

В даташите указано что полином аппаратного CRC 0x4C11DB7.

Взял функцию которая считает CRC:

Скрытый текст

#define BUFFER_SIZE	(0x8000 - 4)/4

__IO uint32_t uwCRCValue = 0;
__IO uint32_t myCRCValue1 = 0xFFFFFFFF;
const uint32_t *myDataBuffer;

uint32_t Crc32(uint32_t Crc, uint32_t Data)
{
  uint8_t index;
  Crc = Crc ^ Data;
  for(index=0; index<32; index++)
  {
    if (Crc & 0x80000000)
      Crc = (Crc << 1) ^ 0x04C11DB7; // Polynomial used in STM32
    else
      Crc = (Crc << 1);
  }
  return(Crc);
}

в main:
	  while (myDataBufferCount--)
	  {
	    myCRCValue1 = Crc32(myCRCValue1, *myDataBuffer++);
	  }

 

значения расчетных CRC не совпали. 

 

Во как: 

Скрытый текст

Invalid Flash memory CRC
Description
The CRC result might be corrupted when FLASH CRC end address register for bank 1/2
(FLASH_CRCEADD1/2R) targets last address in sector 7.
Workaround
Do not use the Flash memory CRC calculation feature.

 

И че делать (.

Изменено пользователем Alex_Golubev

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 hours ago, Alex_Golubev said:

И че делать (.

 

1. Считайте на до последнего адреса сектора 7, а до предпоследнего.

2. В STM32 есть отдельный модуль вычисления CRC, попробуйте им подсчитать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Отдельный модуль CRC заработал. Нужно разобраться почему не работает flash CRC. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 часов назад, Alex_Golubev сказал:

И че делать (.

Я не знаю, что там за модуль CRC, но если он позводять посчитать ЦКС для одного  слова - записать в это слово 0, посчитать, сравнить. Если не совпадают - смотреть, может там инверсия входа или выхода применяется или начальное значение другое используется. Если на одном слове совпадает - посчитать на двух обнуленных словах, 16-ти, секторе. В общем искать закономерность.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не знаю как для STM32H743, но для STM32F1-4 надо реверсировать биты в 4-битном слове(uint32), что бы получить стандартную CRC32 если используется аппаратный CRC модуль. Это делается одной asm соммандой rbit.

uint32_t reverse_32(uint32_t data)
{
  uint32_t result=0;
  asm volatile ("rbit %0, %1" : "=r" (result) : "r" (data) );
  return(result);
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Посчитал файл размерность 512 байт все данные FF.

То что посчитала CRC flash: 0xbde0ce8c

Не нашел закономерности расчета.

Если рассчитать CRC для 4 байт FF FF FF FF 

То получим 0xb02cc19b

Изменено пользователем Alex_Golubev

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 часа назад, Alex_Golubev сказал:

Не нашел закономерности расчета.

Открываем: http://www.zorc.breitbandkatze.de/crc.html

или: https://crccalc.com/

вводим туда данные, считаем, сравниваем со своими результатами, думаем, меняем разные опции расчёта CRC, опять думаем, ... и так много раз, до результата.

В результате - находим необходимую комбинацию опций, при которой имеется совпадение.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Про инициализацию начального значения CRC не забыли?

Изменено пользователем ecomp42

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...