|
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)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|