K60 하드웨어 에서 CRC32 계산
기술노트 85753
아키텍처:
ARM
컴포넌트:
general
업데이트:
2021-06-04 오전 4:22
소개
Freescale의 K60 디바이스는 하드웨어 CRC32 계산기를 내장하고 있습니다. (이는 알고리즘을 위해 코드 영역을 사용하지 않아도 프로그램에서 CRC32 계산을 사용할 수 있다는 것을 의미합니다).
IAR Embedded Workbench for ARM 버전 6.60 을 위한 방법
6.60 에서 옵션
옵션은 Project > Options > Linker > Checksum에서 ielftool 를 활성화 하여 하드웨어와 동일한 방식으로 CRC32 계산을 K60 디바이스에서 수행할 수 있습니다.
옵션은 다음과 같이 설정되어야 합니다:
Size: 4 bytes
Alignment: 4
Algorithm: CRC32(0x4C11DB7)
Complement: As is
Bit order: MSB first
[ ]Reverse byte order within word [unchecked]
Initial Value: 0x0
[X]Use as input [checked]
Checksum unit size: 32-bit
K60를 위한 예제
이 예제는 소스 코드, 링커 설정파일 및 링커 옵션 대화 상자의 해당 설정을 보여줍니다.
- Source code (snippet)
-
extern uint32_t __checksum;
uint32_t valCrc32;
uint32_t calcCrc32(uint32_t* data, uint32_t len, uint32_t startValue)
{
uint32_t result=0;
uint32_t *memptr;
memptr = data;
SIM_SCGC6 |= SIM_SCGC6_CRC_MASK;
CRC_CTRL = CRC_CTRL_WAS_MASK | CRC_CTRL_TCRC_MASK; /* 32bit CRC */
CRC_CRC = startValue; /* Seed */
CRC_CTRL = CRC_CTRL_TCRC_MASK; /* 32bit CRC */
CRC_GPOLY = 0x04C11DB7; /* Poly to match
IAR 32-bit default */
for (uint32_t i=0; i < len; i++)
{
CRC_CRC = *memptr++;
}
result = CRC_CRC;
return result;
}
void main (void)
{
// ROM content
uint32_t start_address = 0x410;
uint32_t end_address = 0x2ffb;
uint32_t len = (end_address + 1 - start_address) / 4;
valCrc32 = calcCrc32((uint32_t*)start_address, len, 0x0);
if (valCrc32 == __checksum)
{
// TBD
}
else
{
// TBD
}
// ROM content, including checksum
len++;
valCrc32 = calcCrc32((uint32_t*)start_address, len, 0x0);
if (valCrc32 == 0)
{
// TBD
}
else
{
// TBD
}
} - Linker configuration file (snippet)
-
define symbol __ICFEDIT_region_ROM_start__ = 0x00000000;
define symbol __ICFEDIT_region_ROM_end__ = 0x00002ffb;
"CHECKSUM":
place at address mem:0x00002ffc { readonly section .checksum };
keep { section .checksum}; - Linker options dialog
- Example Project:
Example (6.60).zip
모든 제품 이름은 해당 소유자의 상표 또는 등록 상표입니다.