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

 
 
> Подсчет CRC16 для ModBus на STM32L0x3
maxgora
сообщение Nov 18 2015, 16:19
Сообщение #1





Группа: Участник
Сообщений: 6
Регистрация: 22-04-13
Пользователь №: 76 573



Столкнулся с некорректной реализацией подсчета CRC в stm32l0xx_hal_crc.c
Пришлось копнуть поглубже. Кому интересно моё решение, спрашивайте, напишу подробнее.
Вот что в итоге получилось для CRC16 с полиномом 0xA001 (для CRC32 придется слегка подправить):

CODE
#include <stdint.h>
#include "stm32l0xx.h"
#include "core_cm0plus.h"
#include "stm32l0xx_hal.h"

extern CRC_HandleTypeDef hcrc;

void MB_CRC_Init(void)
{
hcrc.Instance = CRC;
hcrc.Init.DefaultPolynomialUse = DEFAULT_POLYNOMIAL_DISABLE;
hcrc.Init.DefaultInitValueUse = DEFAULT_INIT_VALUE_ENABLE;
hcrc.Init.GeneratingPolynomial = 0x8005;
hcrc.Init.CRCLength = CRC_POLYLENGTH_16B;
hcrc.Init.InputDataInversionMode = CRC_INPUTDATA_INVERSION_WORD;
hcrc.Init.OutputDataInversionMode = CRC_OUTPUTDATA_INVERSION_ENABLED;
hcrc.InputDataFormat = CRC_INPUTDATA_FORMAT_BYTES;
HAL_CRC_Init(&hcrc);
}

uint16_t usMBCRC16(uint8_t* pBuffer, uint32_t size)
{
hcrc.Instance->CR |= CRC_CR_RESET;

while (size > 3)
{
*(uint32_t volatile*) (&hcrc.Instance->DR) = *(uint32_t*)pBuffer;
pBuffer += 4;
size -= 4;
}
if (size != 0)
{
if (size == 1)
{
*(uint8_t volatile*) (&hcrc.Instance->DR) = *pBuffer;
}
else if (size == 2)
{
*(uint16_t volatile*) (&hcrc.Instance->DR) = *(uint16_t*)pBuffer;
}
else if (size == 3)
{
*(uint16_t volatile*) (&hcrc.Instance->DR) = *(uint16_t*)pBuffer;
pBuffer += 2;
*(uint8_t volatile*) (&hcrc.Instance->DR) = *pBuffer;
}
}
return (*(uint16_t volatile*) (&hcrc.Instance->DR));
}
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Lagman
сообщение Nov 19 2015, 20:23
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 875
Регистрация: 28-10-05
Пользователь №: 10 245



https://ru.wikipedia.org/wiki/%D0%A6%D0%B8%....BE.D0.BC.D1.8B
Go to the top of the page
 
+Quote Post
maxgora
сообщение Nov 20 2015, 11:58
Сообщение #3





Группа: Участник
Сообщений: 6
Регистрация: 22-04-13
Пользователь №: 76 573



Цитата(Lagman @ Nov 20 2015, 02:23) *


Хотели удивить ? sm.gif
В МК stm32l053 есть аппаратный блок подсчета CRC. Речь как раз про его использование ч/з библиотеки HAL.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме


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

 


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


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