реклама на сайте
подробности

 
 
> Вычисление CRC с помощью sRecord
Sprite
сообщение Apr 29 2015, 05:48
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 173
Регистрация: 11-05-08
Пользователь №: 37 414



Доброго всем времени суток!
Задача: есть исходный файл (бинарник) из 8 байт, забитых значением 0x11. Надо в конец файла (т.е. с адреса 0x08) вставить 2 байта CRC16 (вычисленное с полиномом 0xA001) программой Srecord. Делаю так:
Код
srec_cat sec.bin --binary -crc16-b-e 0x08 -poly 0xA001 --output sec_new.bin --binary

Значения добавляются (0x14 0x1E), но не те (0xED 0xE7).
В чем может быть проблема? Может srecord нужно указывать начало и конец исходных данных?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
mcheb
сообщение Apr 29 2015, 07:26
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 326
Регистрация: 30-05-06
Пользователь №: 17 602



Пока разберетесь с документацией, проще самому в GCC написать короткую консольную программу.
Go to the top of the page
 
+Quote Post
Sprite
сообщение Apr 29 2015, 07:39
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 173
Регистрация: 11-05-08
Пользователь №: 37 414



Цитата(mcheb @ Apr 29 2015, 13:26) *
Пока разберетесь с документацией, проще самому в GCC написать короткую консольную программу.

Ну да, может Вы и правы wink.gif Я пишу загрузчик, точнее уже написал. Просто хочется добавить в него CRC и сделать какое-нибудь шифрование прошивки. Люди посоветовали для этих целей использовать Srecord - там уже есть все возможности - решил не изобретать велосипед. Да и программа мне нравится - только вот работает пока не так как надо wink.gif

Цитата(esaulenka @ Apr 29 2015, 13:32) *
srecord использует CCITT по умолчанию, так что результат эксперимента, скорее всего, получился некорректный.

При изменении значения полинома (0x1021) меняется конечный результат.
Go to the top of the page
 
+Quote Post
Sprite
сообщение Apr 29 2015, 11:53
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 173
Регистрация: 11-05-08
Пользователь №: 37 414



Пробовал считать CRC32. Код такой:
Код
srec_cat sec.bin --binary -crc32-b-e 0x08 --output sec_new.bin --binary
Результат получился 0x4DB8ECF5. Нашел онлайн калькулятор CRC - результат совпал. Но попробовал посчитать то же самое на stm - не вышло, считал как программным, так и аппаратным методом - в обоих методах результат одинаковый (0xEC5DBEA0)
Код
//===================================================================
uint32_t sw_calculate_soft_crc(uint32_t *pinput, uint32_t length)
{
    uint32_t initial_crc = 0xFFFFFFFF; // начальное значение                
    uint32_t* input_data = pinput;
    uint32_t polynom     = 0x4C11DB7; // полином
    uint32_t crc         = 0        ; // контрольная сумма
    uint32_t index       = 0;          
    uint32_t bindex      = 0;

    while( index<length )
    {
    if(index==0){   crc = initial_crc ^ input_data[index];}
    else        {   crc = crc ^ input_data[index];        }

        while(   bindex<(sizeof(input_data[index])*8)   )
        {    // if MSB of CRC = 1
            if((crc>>31)==1){crc=(crc<<1)^polynom;}
            else            {crc=(crc<<1);        }
            bindex++;
        }

    bindex=0;
    index++;
    }

    return crc;
}

//===================================================================
uint32_t sw_calculate_crc(uint32_t *input_data, uint32_t length)
{
    // присваиваем адрес начала данных
    uint32_t* pBuffer    = input_data;
    uint32_t index      = 0;
    uint32_t result     = 0;

    __CRC_CLK_ENABLE();             //Включить тактирование
    CRC->CR = CRC_CR_RESET;         //Сброс контрольного регистра

    while(index<length)                //Запись данных в регистр данных для расчета
    {
        CRC->DR = pBuffer[index++];
        tmp++;
    }

    result = CRC->DR;                //Извлечь просчитаную контрольную сумму
    __CRC_CLK_DISABLE();               //Выключить тактирование                      
    return result;
}

А вот, собственно, вызов функций:
Код
    uint32_t CRC_val = 0;
    uint32_t CRC_val2 = 0;    
    uint32_t data_table[]={0x11111111,0x11111111};    
    
    CRC_val = sw_calculate_crc(data_table, sizeof(data_table)/sizeof(uint32_t));
    CRC_val2= sw_calculate_soft_crc(data_table, sizeof(data_table)/sizeof(uint32_t));

Вопрос по прежнему открыт.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Sprite   Вычисление CRC с помощью sRecord   Apr 29 2015, 05:48
- - Сергей Борщ   С полиномом 0xA001 сдвиг осуществляется вправо. ...   Apr 29 2015, 06:28
|- - Sprite   Цитата(Сергей Борщ @ Apr 29 2015, 12:28) ...   Apr 29 2015, 06:44
- - esaulenka   Пользовался только "стандартным" CRC, та...   Apr 29 2015, 06:45
|- - Sprite   Цитата(esaulenka @ Apr 29 2015, 12:45) До...   Apr 29 2015, 07:04
||- - esaulenka   Цитата(Sprite @ Apr 29 2015, 10:04) Да, н...   Apr 29 2015, 07:32
|- - Сергей Борщ   Цитата(esaulenka @ Apr 29 2015, 09:45) Се...   Apr 29 2015, 07:05
|- - Sprite   Цитата(Сергей Борщ @ Apr 29 2015, 13:05) ...   Apr 29 2015, 07:26
- - Sprite   Всем спасибо, разобрался.   Apr 29 2015, 13:43
|- - AHTOXA   Может быть, расскажете, как правильно?   Apr 29 2015, 15:49
|- - Sprite   Цитата(AHTOXA @ Apr 29 2015, 21:49) Может...   May 6 2015, 05:01
- - esaulenka   Решал аналогичную задачу. Во-первых, CRC по алгори...   May 22 2015, 05:56


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 13:11
Рейтинг@Mail.ru


Страница сгенерированна за 0.04522 секунд с 7
ELECTRONIX ©2004-2016