Turn on suggestions

Auto-suggest helps you quickly narrow down your search results by suggesting possible matches as you type.

Showing results for

- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Mute
- Printer Friendly Page

CRC

Options

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content

2010-08-12 03:52 AM

CRC

8 REPLIES 8

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content

2011-05-17 05:01 AM

Try reading

.- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content

2011-05-17 05:01 AM

The first function will perform a CRC computation over a block of memory, assumed to be a multiple of 4 bytes (32-bits)

The second function simulates the action of the STM32 hardware register, and functions in a bit wise fashion. //**************************************************************************** DWORD CRC32WideFast(DWORD Crc, DWORD Size, BYTE *Buffer) { Size = Size >> 2; // /4 Size passed in as a byte count, assumed to be a multiple of 4 while(Size--) { static const DWORD CrcTable[16] = { // Nibble lookup table for 0x04C11DB7 polynomial 0x00000000,0x04C11DB7,0x09823B6E,0x0D4326D9,0x130476DC,0x17C56B6B,0x1A864DB2,0x1E475005, 0x2608EDB8,0x22C9F00F,0x2F8AD6D6,0x2B4BCB61,0x350C9B64,0x31CD86D3,0x3C8EA00A,0x384FBDBD }; Crc = Crc ^ *((DWORD *)Buffer); // Apply all 32-bits Buffer += 4; // Process 32-bits, 4 at a time, or 8 rounds Crc = (Crc << 4) ^ CrcTable[Crc >> 28]; // Assumes 32-bit reg, masking index to 4-bits Crc = (Crc << 4) ^ CrcTable[Crc >> 28]; // 0x04C11DB7 Polynomial used in STM32 Crc = (Crc << 4) ^ CrcTable[Crc >> 28]; Crc = (Crc << 4) ^ CrcTable[Crc >> 28]; Crc = (Crc << 4) ^ CrcTable[Crc >> 28]; Crc = (Crc << 4) ^ CrcTable[Crc >> 28]; Crc = (Crc << 4) ^ CrcTable[Crc >> 28]; Crc = (Crc << 4) ^ CrcTable[Crc >> 28]; } return(Crc); } //**************************************************************************** DWORD CrcSTM32(DWORD Crc, DWORD Data) { int i; Crc = Crc ^ Data; for(i=0; i<32; i++) if (Crc & 0x80000000) Crc = (Crc << 1) ^ 0x04C11DB7; // Polynomial used in STM32 else Crc = (Crc << 1); return(Crc); } //****************************************************************************
Tips, Buy me a coffee, or three.. PayPal Venmo

Up vote any posts that you find helpful, it shows what's working..

Up vote any posts that you find helpful, it shows what's working..

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content

2011-05-17 05:01 AM

Is it necessary to call your functions with CRC initialised to 0xFFFFFFFF

eg as CRC = CRC32WideFast(0xFFFFFFFF, 400, Buffer); and (initial call) CRC = CrcSTM32(0xFFFFFFFF, Data)- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content

2011-05-17 05:01 AM

It depends on your initial conditions, and whether you are chaining together multiple regions, sectors or blocks. The hardware only resets to 0xFFFFFFFF when you direct it too, the register itself is a linear feedback construct and accumulative in nature (actually more like a remainder from a long division), it will clear if you feedback the current value on itself.

crc = 0xFFFFFFFF; // Initial reset state, may be something else crc = CrcSTM32(crc, Data[0]); crc = CrcSTM32(crc, Data[1]); .. crc = 0xFFFFFFFF; // Initial reset state, may be something else crc = CRC32WideFast(crc, 512, Block0); crc = CRC32WideFast(crc, 512, Block1); .. For two iterations of the block crc, you get the value for 1024 bytes total. You could do it as 8 blocks of 128 bytes too, or 1 block of 1024 bytes, the value computed should be the same.
Tips, Buy me a coffee, or three.. PayPal Venmo

Up vote any posts that you find helpful, it shows what's working..

Up vote any posts that you find helpful, it shows what's working..

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content

2011-05-17 05:02 AM

OK, understood. Thankyou.

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content

2018-05-22 03:54 AM

Hi All,

I am trying to use CRC component of STM32F4.

Procedure I followed:-

For STM32F413, Selected uart2,uart6 and CRC from stm32Cubemx.

I am using below function to calculate CRC value.

HAL_CRC_Calculate(CRC_HandleTypeDef *hcrc, uint32_t pBuffer[], uint32_t BufferLength);

HAL_CRC_Calculate(&hcrc,(uint32_t *)Data,Length);

where Data = 'START'

Lenght = 5;

It is giving me some CRC computed value ...0x200004f0.

If I create other project with same above setting and do the the same procedure, I am getting different CRC computed value even if I pass the same data.

The CRC computed value coming for data 'START' should be same in both the project if I am not wrong.

Please provide your inputs if I am doing something wrong.

Can I directly use HAL_CRC_Calculate() function in my project or not ?

Thanks,

Poonam

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content

2018-05-22 06:41 AM

You're passing a 32-bit pointer, I'd assume the length is in words, not bytes. Check function usage expectations.

Tips, Buy me a coffee, or three.. PayPal Venmo

Up vote any posts that you find helpful, it shows what's working..

Up vote any posts that you find helpful, it shows what's working..

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content

2018-05-23 08:39 AM

Thanks Clive..

Related Content

- CMSIS_V2 causes "No rule to make target" error when used with ETH + LwIP in STM32 MCUs Embedded software
- UART Receive interrupt stuck issue in STM32 MCUs Products
- STM32H573 CUSTOM BOARD VCAP PIN NOT OUTPUTING VOLTAGE in STM32 MCUs Products
- Variable rolling to 255 in STM32 MCUs Products
- STM32H723 HAL example raises HAL_ETH_ErrorCallback on every packet, but still works! in STM32 MCUs Embedded software