STM32에서 CRC 사용하기

이번 포스팅에서는 AN4187(Using the CRC peripheral on STM32 microcontrollers)를 번역하여 STM32에서 제공하는 CRC에 대해 알아보도록 하겠습니다.

개요

CRC(cyclic redundancy check:순환 중복 검사 )는 데이터 신뢰성을 얻기 위해 강력하고 쉽게 구현된 기술입니다. 오류가 수정 기능은 없으며 데이터 전송 또는 저장 무결성 검사에서 오류를 감지하는 데 주로 사용됩니다.

진단 범위는 기본 안전 표준의 요구 사항을 충족하므로 IEC 60335-1 및 IEC 607030-1 표준("Class B" 요구 사항)을 준수하도록 인증된 ST 펌웨어에서 플래시 메모리 콘텐츠 무결성 자체 테스트 검사에 사용됩니다. 자세한 내용은 AN3307(Guidelines for obtaining IEC 60335 Class B certification for any STM32 application) 및 다양한 제품군 전용 관련 펌웨어 패키지를 참조하십시오.

CRC 체크섬 정보가 링커에 의해 사용자 코드에 직접 배치되어야 하는 경우(대부분 CRC 설명자 데이터 테이블의 형식으로) 컴파일러 설명서에서 필요한 CRC 설정을 확인하십시오.

CRC는 다항식 산술을 기반으로 하며 갈루아 필드의 다항식 나누기 나머지를 두 요소로 다른 요소로 계산합니다. 나머지는 체크섬, 피제수는 데이터, 제수는 생성 다항식입니다.

*피제수(dividend)라고 부르는 하나의 숫자는 제수(divisor)라고 부르는 다른 숫자에 의해 나뉘어서 몫(quotient)이라는 결과를 낳는다.

이 문서에서는 STM32 32비트 Arm® Cortex® MCU에 내장된 CRC 주변 장치의 기능과 이를 구성하는 데 필요한 단계를 설명합니다.

• 섹션 1에서는 STM32 CRC 구현 알고리즘과 그 이점에 대해 설명합니다.

• 섹션 2는 DMA를 CRC 데이터 전송 컨트롤러로 사용하는 방법을 설명합니다.

• 섹션 3은 STM32 장치를 통한 CRC의 마이그레이션을 설명합니다. 실행 시간 측정과 함께 두 가지 예가 설명되어 있습니다.

• CRC_usage 예: CPU를 데이터 전송 컨트롤러로 사용하여 CRC를 구성하는 방법.

• CRC_DMA 예: DMA를 CRC 데이터 전송 컨트롤러로 사용하는 방법.

CRC peripheral overview

모든 STM32 마이크로컨트롤러(Arm®(a) Cortex® 코어 기반)에 내장된 CRC 주변 장치는 지원되는 데이터 유형의 CRC 체크섬 코드를 제공하는 데 사용됩니다. 이 섹션에서는 먼저 소프트웨어 CRC 알고리즘을 소개한 다음 STM32 CRC 하드웨어 가속기를 소개하고 그 이점을 강조합니다.

CRC computing algorithm

그림 1에서 볼 수 있듯이 CRC 알고리즘에는 데이터 입력이 있으며 입력 매개변수에 따라 고정된 체크섬 코드 길이를 생성합니다.

그림 1

하나의 CRC 알고리즘은 하드웨어 또는 저수준 구현에 가장 적합한 비트 메시지 XOR-ing 기술을 사용한 다항식 나누기입니다.

입력 매개변수는 다음과 같습니다.

• 피제수: 입력 데이터라고도 하며 "Input_Data"로 약칭됩니다.

• 약수: 생성기 다항식이라고도 하며 "POLY"로 약칭됩니다.

• 초기 CRC 값: "Initial_Crc"로 약칭

그림 2는 CRC 알고리즘을 보여줍니다.

그림 2

시작할 때 알고리즘은 CRC를 Input_Data와 함께 Initial_Crc XOR로 설정합니다.

CRC MSB가 1이 되면 알고리즘은 CRC를 왼쪽으로 1비트 이동하고 POLY와 XOR합니다. 그렇지 않으면 CRC를 왼쪽으로 한 비트만 이동합니다.

그림 3은 다음 조건에 대한 단계별 알고리즘 실행을 보여줍니다.

– 입력 데이터 = 0xC1

– 폴리 = 0xCB

– 초기_Crc = 0xFF

그림 3

CRC peripheral configuration

모든 STM32 장치는 위에 설명된 대로 CRC 주변 장치를 구현합니다. CRC 계산 장치에는 단일 32비트 읽기/쓰기 데이터 레지스터(CRC_DR)가 있어 새 데이터를 입력하고(쓰기 액세스) 이전 CRC 계산 결과를 유지하는 데 사용됩니다(읽기 액세스). 데이터 레지스터에 대한 각 쓰기 작업은 이전 CRC 값(CRC_DR에 저장됨)과 새 값의 조합을 생성합니다.

그림 4

지원되는 데이터의 CRC를 계산하려면 다음 단계를 수행하세요.

1. RCC 주변 장치를 통해 CRC 주변 장치 클록을 활성화합니다.

2. 초기 CRC 값 레지스터(CRC_INIT)를 구성하여 CRC 데이터 레지스터를 초기 CRC 값으로 설정합니다. 최신 STM32 시리즈에서는 이전 CRC 계산을 기반으로 CRC 계산을 초기 값으로 연결할 수 있습니다. 이 경우 CRC_IDR 레지스터(CRC_CR의 리셋 비트에 영향을 받지 않음)를 사용할 수 있습니다. HAL에서는 HAL_CRC_Calculate에 의해 구현됩니다.

3. CRC 제어 레지스터(CRC_CR)에서 각각 REV_IN[1:0] 및 REV_OUT 비트를 통해 I/O 반전 비트 순서를 설정합니다.

4. CRC 제어 레지스터(CRC_CR) 및 CRC 다항식 레지스터(CRC_POL)의 POLYSIZE[1:0] 비트를 통해 다항식 크기 및 계수를 각각 설정합니다.

5. CRC 제어 레지스터(CRC_CR)의 리셋 비트를 통해 CRC 주변 장치를 리셋합니다.

6. CRC 데이터 레지스터에 데이터를 설정합니다.

7. CRC 데이터 레지스터의 내용을 읽습니다.

8. CRC 주변 장치 클록을 비활성화합니다.

펌웨어 패키지에서 CRC_usage 예제는 256 지원 데이터 유형의 배열 데이터(DataBuffer)를 계산하는 CRC 체크섬 코드를 실행합니다. 자세한 설명은 CRC_usage 폴더의 Readme.txt 파일을 참조하십시오.

CRC hardware implementation benefits

CRC_usage 예제는 소프트웨어 CRC 알고리즘 구현과 CRC 주변 장치 간의 호환성을 확인하고 실행 시간을 측정하기 위해 개발되었습니다.

예제는 다음 조건에서 실행되었습니다.

– 하드웨어: STM32373C-EVAL 보드(STM32F37x 디바이스)

– 시스템 클록: HSE(8MHz 수정 발진기)

– 툴체인: Keil® V4.60.0.0

– CRC 구성: CRC 레지스터의 기본값

CRC_CR: 0x0000 0000; POLYSIZE는 32, REV_IN 및 REV_OUT 없음

CRC_INIT: 0XFFFF FFFF

CRC_POLY: 0X04D11 CDB7

– 입력 데이터: 256words

표 1은 CRC 알고리즘의 실행 시간과 STM32 CRC를 사용하여 달성한 시간을 비교한 것입니다.

표 1

하드웨어 구현은 소프트웨어 알고리즘보다 약 60배 빠릅니다. CPU는 데이터 전송을 제어하며 이 단계에서는 명령 처리가 허용되지 않습니다.

응용 프로그램 개발자는 다른 주변 장치를 컨트롤러로 선택하여 다른 작업을 위해 CPU를 확보할 수 있습니다. DMA는 데이터 전송을 관리하므로 데이터 버퍼의 CRC 체크섬 코드를 계산하기 위한 대안이 됩니다.

Using CRC through DMA

STM32 임베디드 DMA는 CPU를 컨트롤러로 사용하지 않도록 데이터 전송 핸들러로 사용할 수 있습니다. DMA 구성은 선택한 아키텍처에 따라 다릅니다. 거의 동일한 구성으로 채널이 있는 DMA와 스트림이 있는 DMA의 두 가지 범주가 있습니다.

DMA back-to-back transfer mode

펌웨어 패키지에서 사용할 수 있는 CRC_DMA 예제는 그림 5에 설명된 기술을 구현합니다. 이 기술은 DMA_IRQ 핸들러 루틴 콜백을 사용하는 DMA 연속 데이터 전송 모드입니다.

그림 5

이 경우 DMA는 데이터 전송 카운터를 제어하고 NVIC DMA_IRQ 핸들러 루틴을 실행하기 위해 전송 완료 플래그를 기다립니다. NVIC DMA_IRQ 루틴은 시스템 타이머(systick) 카운터를 중지하고 CRC 계산 값을 반환해야 합니다. CPU 사용량은 DMA 인터럽트 요청 루틴의 실행으로만 제한됩니다.

DMA configuration

위에서 언급했듯이 STM32 장치는 다중 DMA 아키텍처를 통합하고 있습니다. 아래 구성의 단계들은 두 DMA 아키텍처에 공통입니다.

1. RCC 주변 장치를 통해 DMA 주변 장치 클록을 활성화합니다.

2. DMA 채널/스트림을 구성합니다(두 구성에 대해서는 표 2 참조).

3. 섹션 CRC peripheral configuration 처음 다섯 단계에 설명된 대로 CRC를 구성합니다.

4. DMA 전송 완료 인터럽트를 활성화합니다.

5. DMA NVIC IRQ를 구성합니다.

6. DMA 채널/스트림을 활성화합니다.

7. DMA 전송이 완료될 때까지 기다립니다.

8. DMA 채널을 비활성화합니다. 스트림 아키텍처가 있는 DMA의 경우 컨트롤러는 전송이 종료될 때 자동으로 채널을 비활성화하지만, 다른 경우에는 NVIC DMA_IRQ 루틴이 나중에 사용하기 위해 채널을 비활성화해야 합니다.

9. DMA IT Pending(보류) 비트를 지웁니다.

참고: 추가 정보는 CRC_DMA 예제 폴더 아래의 Readme.txt 파일을 참조하십시오.

표 2

CRC_DMA 예제는 CPU와 DMA를 Transfer Handler로 사용할 때의 호환성 결과를 확인하고, DMA를 Transfer Handler로 사용할 때의 CPU 부하를 측정하기 위해 개발되었습니다.

DMA usage benefits

DMA 연속 데이터 전송 모드 동안 CPU는 CRC 및 DMA 구성 동안과 DMA 인터럽트 핸들러 실행 중에 작동합니다. 예제의 실행 조건은 지원하는 데이터 타입의 8192가 된 입력 데이터 크기를 제외하면 섹션 CRC hardware implementation benefits 절과 동일합니다.

표 3

전반적으로 CPU 로드는 CPU가 데이터 전송 핸들러로 사용될 때 100%이고 DMA를 사용할 때 0.72%로 감소합니다.

CRC migration

표 4는 CRC 기능을 나열하고 각 시리즈에 대한 소프트웨어 호환성 분석을 제공합니다.

표 4

번역을 마치면서 아래 참조(CRC (Cyclic Redundancy Check) + Flash Integrity Check + SRecord) 블로그에 방문하시면 STM32CubeMX에서 코드를 만드는 방법과 SRecord를 이용해 Binary 이미지의 CRC를 구해 컴파일러에 적용하는 방법을 확인 해 보실 수 있습니다.

출처 : https://www.st.com/resource/en/application_note/an4187-using-the-crc-peripheral-in-the-stm32-family-stmicroelectronics.pdf

참조 : https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=eziya76&logNo=221507312819