|
STM32F0 и CRC16, как быть с байтами? |
|
|
|
Dec 22 2015, 03:41
|

Странник
   
Группа: Свой
Сообщений: 766
Регистрация: 29-08-05
Из: Екатеринбург
Пользователь №: 8 051

|
Цитата(toweroff @ Dec 22 2015, 01:14)  Как вообще правильно работать с CRC? Данные должны быть соразмерны полиному? Теории на счёт CRC предостаточно, как вариант - Циклический избыточный код и т.д. и т.п.
--------------------
"Как много есть на свете вещей, которые мне не нужны!" Сократ
|
|
|
|
|
Dec 22 2015, 05:23
|

Профессионал
    
Группа: Модераторы
Сообщений: 1 120
Регистрация: 17-06-04
Пользователь №: 37

|
А я всегда думал, что блок расчета CRC в STM32 считает CRC32... Вот здесь я выкладывал 2 функции, программную и железную для STM32. Результат их работы одинаков. И да, на вход блока CRC32 должны подаваться 32-х битные слова. В "железной" функции по ссылке применена "uint32_t __rbit( uint32_t )", Кеил её прекрасно понимает. Она реверсирует слово. И, похоже, в Cortex-M0 такой команды нету... А здесь я сейчас нашел статейку про аппаратный блок расчета CRC в STM32... А CRC16 я считаю программно. CODE /* --- crc16() -------------------------------------------------------------------------------------------- ** * Контрольная сумма crc16 * BYTE *buf - указатель на байтовый буфер * short num - размер буфера в байтах * Возвращает * unsigned short crc16 буфера * -------------------------------------------------------------------------------------------------------- */ unsigned short crc16( BYTE *buf, unsigned short num ) { #define POLINOM 0xa001 int i; WORD crc = 0xffff;
while ( num-- ) { crc ^= *buf++; i = 8; do { if ( crc & 1 ) crc = ( crc >> 1 ) ^ POLINOM; else crc >>= 1; } while ( --i ); } return( crc ); #undef POLINOM }
--------------------
Если зайца бить, его можно и спички научить зажигать Сколько дурака не бей - умнее не будет. Зато опытнее
|
|
|
|
|
Dec 22 2015, 06:42
|
Участник

Группа: Участник
Сообщений: 50
Регистрация: 31-03-14
Из: Харьков
Пользователь №: 81 165

|
Если вы пишете расчет контрольной суммы для передающей и принимающей стороны, то вы можете написать что угодно, лишь бы одинаково с обоих сторон) допустим использовать 16 байт из CRC32  для всяких "ручных" расчетов сумм я обычно использую сумму флетчера - намного меньше процессорного времени хавает. особенно на каких-нибудь чахлых контроллерах с 8 битами и низкой тактовой частото =)
|
|
|
|
|
Dec 22 2015, 07:45
|

Гуру
     
Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514

|
Цитата(spf @ Dec 22 2015, 06:41)  Цитата(slavokhire5 @ Dec 22 2015, 09:42)  разве я спрашивал о сути CRC или программной реализации? вопрос только об аппаратном модуле CRC у STM32F0 Цитата(VAI @ Dec 22 2015, 08:23)  А я всегда думал, что блок расчета CRC в STM32 считает CRC32... Вот здесь я выкладывал 2 функции, программную и железную для STM32. Результат их работы одинаков. И да, на вход блока CRC32 должны подаваться 32-х битные слова. В "железной" функции по ссылке применена "uint32_t __rbit( uint32_t )", Кеил её прекрасно понимает. Она реверсирует слово. И, похоже, в Cortex-M0 такой команды нету... А здесь я сейчас нашел статейку про аппаратный блок расчета CRC в STM32... спасибо, буду посмотреть а у F0 таки да, можно менять и полином, и размер полинома и начальное значение
|
|
|
|
|
Dec 22 2015, 08:42
|
Профессионал
    
Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528

|
Цитата(Сергей Борщ @ Dec 22 2015, 15:23)  У F0x0 - нельзя. Вы оба правы  У F030 и F070 полином не изменяемый, а у остальных: F0x1, F0x2 и F0x8 можно дополнительно грузить полином и настраивать его длину 7, 8, 16, 32 бита. Для обоих в реф. мануалах пишут что можно писать байтами, полусловами или словами. Хорошо бы код посмотреть повнимательнее, потому что DR описан как __IO uint32_t DR; и если просто писать в CRC->DR то запись всегда будет происходить словами.
--------------------
Russia est omnis divisa in partes octo.
|
|
|
|
|
Dec 22 2015, 11:44
|

Гуру
     
Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514

|
Цитата(SSerge @ Dec 22 2015, 11:42)  Вы оба правы  У F030 и F070 полином не изменяемый, а у остальных: F0x1, F0x2 и F0x8 можно дополнительно грузить полином и настраивать его длину 7, 8, 16, 32 бита. Для обоих в реф. мануалах пишут что можно писать байтами, полусловами или словами. Хорошо бы код посмотреть повнимательнее, потому что DR описан как __IO uint32_t DR; и если просто писать в CRC->DR то запись всегда будет происходить словами. именно так, у меня 071 и мне можно  да только толку-то... да, результат разный, если к DR обращаться напрямую или как *(uint8_t), да только все равно не совпадает
|
|
|
|
|
Dec 22 2015, 16:54
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(toweroff @ Dec 22 2015, 19:41)  Все, заработало. И? В чем была проблема? Цитата(toweroff @ Dec 22 2015, 19:41)  обращение к регистру данных через Код *(__IO uint8_t *)((uint32_t)&(CRC->DR)) = data8; Ужас. Зачем указатель явно приводить к 32-битному целому, чтобы потом его привести обратно к указателю? *(__IO uint8_t *)&CRC->DR было бы достаточно. Если уж хочется приводить к целому - то для этого есть специально заточенный uintptr_t, но здесь он не нужен. Совсем.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Feb 5 2016, 07:20
|
Гуру
     
Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025

|
Цитата(SSerge @ Dec 22 2015, 10:42)  Вы оба правы  У F030 и F070 полином не изменяемый, а у остальных: F0x1, F0x2 и F0x8 можно дополнительно грузить полином и настраивать его длину 7, 8, 16, 32 бита. Для обоих в реф. мануалах пишут что можно писать байтами, полусловами или словами. Подниму тему, у меня вопрос именно про CRC в STM32F070. Хочу использовать CRC 16-битный. Можно ли для этого задействовать аппаратный модуль данного МК ? Очень мутно написано в рефмануале про возможность выбора длины и вида полинома, в тексте есть такое: Цитата Uses CRC-32 (Ethernet) polynomial: 0x4C11DB7 X32 + X26 + X23 + X22 + X16 + X12 + X11 + X10 +X8 + X7 + X5 + X4 + X2+ X +1 • Alternatively uses a fully programmable polynomial with programmable size (7, 8, 16, 32 bits). • Handles 8-,16-, 32-bit data size • Programmable CRC initial value Но в списке регистров не вижу ничего, позволяющего "Alternatively uses a fully programmable polynomial with programmable size". То есть только CRC32 с полиномом 0x4C11DB7 ? И что будет считать быстрее: использовать имеющийся табличный расчет CRC16, или все-таки можно пробовать приспособить этот аппаратный модуль под что-то, дающее на выходе циклически рассчитанное 16-битное значение? Вопрос именно в скорости вычислений, нужно минимизировать задержку от момента появления данных до их отправки. Хм.Или вообще уйти от CRC на что-то ксоровидное, канал довольно чистый (межплатное соединение внутри корпуса), если аппаратный модуль не приклеивается...
|
|
|
|
|
Feb 5 2016, 13:19
|

Профессионал
    
Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877

|
Цитата(Ruslan1 @ Feb 5 2016, 10:20)  Хм.Или вообще уйти от CRC на что-то ксоровидное, канал довольно чистый (межплатное соединение внутри корпуса), если аппаратный модуль не приклеивается... Скажу банальность, но XOR - плохо. Лично наступал на грабли "при отвалившемся проводе принимаем 0xFF, контрольная сумма сходится". Хотя б байты складывать... (дополнил)Цитата(toweroff @ Feb 5 2016, 16:04)  Там все просто, пишем данные в регистр и после записи последнего слова имеем рассчитанную CRC Вот интересно мне, сиё для кого написано было?.. Цитата(SSerge @ Dec 22 2015, 11:42)  У F030 и F070 полином не изменяемый, а у остальных: F0x1, F0x2 и F0x8 можно дополнительно грузить полином и настраивать его длину 7, 8, 16, 32 бита. Цитата(Ruslan1 @ Feb 5 2016, 10:20)  Подниму тему, у меня вопрос именно про CRC в STM32F070. Хочу использовать CRC 16-битный.
--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
|
|
|
|
|
Feb 5 2016, 15:34
|
Гуру
     
Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025

|
Цитата(esaulenka @ Feb 5 2016, 15:19)  Скажу банальность, но XOR - плохо. Лично наступал на грабли "при отвалившемся проводе принимаем 0xFF, контрольная сумма сходится". Хотя б байты складывать... Да, понимаю, спасибо. Кстати, у меня было как-то, что CRC16 у разных пакетов данных сходились: делал базу на всего-то пару тысяч записей (примерно по 260 байт), и делал индексирование для быстрого поиска, индексом(сигнатурой) была CRC16 блока. И данные заведомо разные (там в том числе и дата-время были в блоке, и номер записи). Но вот повторяющиеся сигнатуры встречались, и нередко. Пришлось дополнительно еще и дату-время проверять у вытащенной по индексу записи, CRC16 в качестве уникальной сигнатуры не хватало  Но у меня условия будут тепличные (длина линии связи сантиметров пять), да и просто не придет такой тривиальный пакет (у меня там SLIP фреймы принимать будет), ну и на уровне приложения тоже есть некоторая проверка кроме контрольной суммы. Цитата(toweroff @ Feb 5 2016, 17:20)  а ведь и правда... пятница...  Я почитал- там и CRC32 как-то по-странному нужно задействовать, чтобы совпало с софтовой реализацией (инверсия битов подсовываемого байта ?), то есть не все так просто как хочется. Чистый маркетинг. Оно есть, но подходит совсем далеко не всем.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|