Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Микроконтроллеры других производителей

Микроконтроллеры других производителей Все, что касается микроконтроллеров и НЕ подошло в раздел Microchip.

Ответ
 
Опции темы Опции просмотра
Старый 21.07.2017, 11:32   #1
Pridnya
Senior Member
 
Регистрация: 21.01.2009
Возраст: 38
Сообщений: 4,444
Вес репутации: 4370/120
Pridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond repute
По умолчанию STM32F4 Аппаратный модуль расчета контрольной суммы CRC32

Здравствуйте, товарищи!

У меня был класс для расчета CRC32 для компьютера (для Windows, написан на C#), я этот метод всегда использовал. Сегодня я обнаружил расхождения в результатах, но это не очень важно. Нашелся товарищ, который еще в 2013-м году выложил свой класс на C# в комментариях на этом форуме, выложил только код, без комментариев, так вот этот небольшой код считает (в программах на C# для Windows) также как и аппаратный модуль STM32.

Вот сравнение результатов для STM32 и C# для строки "123456789".
Код:
//STM32F407 
RCC->AHB1ENR |= RCC_AHB1ENR_CRCEN;
CRC->CR = 1;
CRC->DR = 0x34333231;  // crc = 0xC2091428
CRC->DR = 0x38373635;  // crc = 0xFEFC54F9
CRC->DR = 0x00000039;  // crc = 0xAFF19057
uint32_t crc = CRC->DR; 

// Visual Studio 2010 (C#)
CRC32t.Reset();
CRC32t.Write(0x34333231);    // crc = 0xC2091428
CRC32t.Write(0x38373635);    // crc = 0xFEFC54F9
CRC32t.Write(0x00000039);    // crc = 0xAFF19057
textBox3.Text = CRC32t.Read().ToString("X");
Вот код того класса:
Код:
public class CRC32
{
    static UInt32[] Crc32Table = new UInt32[] {
    0x00000000,0x04C11DB7,0x09823B6E,0x0D4326D9,
    0x130476DC,0x17C56B6B,0x1A864DB2,0x1E475005,
    0x2608EDB8,0x22C9F00F,0x2F8AD6D6,0x2B4BCB61,
    0x350C9B64,0x31CD86D3,0x3C8EA00A,0x384FBDBD
    };

    static UInt32 DR;
    public static void Reset()
    {
        DR = 0xFFFFFFFF;
    }

    public static void Write(UInt32 data)
    {
        DR = DR ^ data;
        DR = (DR << 4) ^ Crc32Table[DR >> 28];
        DR = (DR << 4) ^ Crc32Table[DR >> 28];
        DR = (DR << 4) ^ Crc32Table[DR >> 28];
        DR = (DR << 4) ^ Crc32Table[DR >> 28];
        DR = (DR << 4) ^ Crc32Table[DR >> 28];
        DR = (DR << 4) ^ Crc32Table[DR >> 28];
        DR = (DR << 4) ^ Crc32Table[DR >> 28];
        DR = (DR << 4) ^ Crc32Table[DR >> 28];
    }
    public static UInt32 Read()
    {
        return DR;
    }
}
Мне хочется понять, что делает метод public static void Write(UInt32 data)? Считает аналогично аппаратному модулю. Что сделал автор кода? Кто-то пояснил за автора
Цитата:
немного поясню за коментатора:
это таблица остатков, которые равны CRC32(x), x = 0...15
16 значений память конечно экономят, но операций больше, чем при 256.
__________________
Прогресс неизбежен.
Pridnya вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
подскажите насчет: Модуль проверки контрольной суммы дартмол Вопросы начинающих 3 14.05.2014 16:02
Реализация расчета контрольной суммы протокола Modbus Zeus80 Cетевые протоколы и технологии 21 15.08.2009 11:30
Расчет контрольной суммы DS1992L Владимир32 Общетехнические вопросы 0 29.12.2007 20:18


Часовой пояс GMT +3, время: 18:45.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd. Перевод: zCarot