TI의 TMS320F28377D는 C2000 Delfino 시리즈의 32비트 마이크로컨트롤러로, 고성능 연산을 위한 FPU(Floating-Point Unit), 삼각함수 연산에 특화된 TMU(Trigonometric Math Unit), 그리고 복소수 및 비터비(Viterbi) 연산, CRC 계산을 지원하는 VCU-II(Viterbi, Complex Math, and CRC Unit II)를 포함합니다. 이 문서는 FPU, TMU, VCU-II의 상세한 설정 방법과 실용적인 예제 코드를 제공하여, 모터 제어, 디지털 신호 처리(DSP), 전력 변환 등 고성능 연산 애플리케이션에 활용할 수 있도록 돕습니다.
1. FPU, TMU, VCU-II 모듈 개요
TMS320F28377D는 고속 연산을 위해 다음과 같은 하드웨어 가속 유닛을 제공합니다:
1.1 FPU (Floating-Point Unit)
- 기능: IEEE 754 단정밀 부동소수점 연산 지원
- 특징:
- 32비트 단정밀 부동소수점 연산 (덧셈, 뺄셈, 곱셈, 나눗셈, 제곱근 등)
- 고속 연산으로 CPU 부하 감소
- FPU 레지스터: R0H~R7H (8개의 32비트 부동소수점 레지스터)
- 주요 용도: 모터 제어, 필터링, 제어 알고리즘
- 클럭: 시스템 클럭(SYSCLK, 최대 200MHz)
1.2 TMU (Trigonometric Math Unit)
- 기능: 삼각함수 및 고속 부동소수점 연산 최적화
- 특징:
- 사인(sin), 코사인(cos), 아크탄젠트(atan2), 나눗셈, 제곱근 연산 지원
- 단정밀 부동소수점 입력/출력
- 고속 연산 (예: sin/cos 연산 약 2~3 사이클)
- 주요 용도: 모터 제어(Clarke/Park 변환), 신호 처리
- 활성화: TMU는 FPU와 통합되어 별도 클럭 활성화 불필요
1.3 VCU-II (Viterbi, Complex Math, and CRC Unit II)
- 기능: 복소수 연산, 비터비 디코딩, CRC 계산
- 특징:
- 복소수 곱셈, 덧셈, 뺄셈 (16비트 또는 32비트)
- 비터비 디코딩 (통신 애플리케이션)
- CRC 계산 (CRC-8, CRC-16, CRC-32)
- VCU 레지스터: VR0~VR7 (복소수 연산용)
- 주요 용도: 통신 프로토콜, 데이터 무결성 검증, 복소수 기반 신호 처리
- 클럭 활성화: CpuSysRegs.PCLKCR0.bit.VCU = 1
2. FPU, TMU, VCU-II 설정 상세
FPU, TMU, VCU-II는 주로 C2000Ware의 헤더 파일(F2837xD_device.h)과 라이브러리(FPUfastRTS, VCU2_Lib)를 통해 접근합니다. Bitfield 구조는 VCU-II의 일부 레지스터에 적용되며, FPU와 TMU는 주로 소프트웨어 라이브러리 호출로 동작합니다.
2.1 FPU 설정
- 헤더 파일: F2837xD_device.h, fpu.h
- 라이브러리: FPUfastRTS.lib (TI 제공)
- 주요 함수:
- float32_t FPUadd(float32_t a, float32_t b): 부동소수점 덧셈
- float32_t FPUdiv(float32_t a, float32_t b): 부동소수점 나눗셈
- float32_t FPUsqrt(float32_t a): 부동소수점 제곱근
- 활성화: 별도 클럭 활성화 불필요 (기본적으로 SYSCLK 사용)
- 레지스터: R0H~R7H (직접 접근 가능, 어셈블리 사용 시)
2.2 TMU 설정
- 헤더 파일: fpu.h
- 라이브러리: FPUfastRTS.lib
- 주요 함수:
- float32_t sinPU(float32_t angle): 사인 (각도: 0~1.0, per-unit)
- float32_t cosPU(float32_t angle): 코사인 (각도: 0~1.0)
- float32_t atan2PU(float32_t y, float32_t x): 아크탄젠트 (per-unit)
- 활성화: TMU는 FPU와 통합, 별도 설정 불필요
- 특징: 각도는 per-unit (0
1.0, 02π에 매핑) 사용 권장
2.3 VCU-II 설정
- 헤더 파일: F2837xD_vcu2.h
- 라이브러리: VCU2_Lib.lib
- 주요 레지스터 (Bitfield 구조):
- VSTATUS: VCU 상태 레지스터
- bit.VCU_BUSY: VCU 연산 진행 상태
- bit.CRC_PASS: CRC 계산 결과
- VCRC: CRC 계산 레지스터
- bit.CRC_RESULT: CRC 결과 저장
- VCMPLX: 복소수 연산 레지스터
- bit.REAL, bit.IMAG: 실수/허수부
- VSTATUS: VCU 상태 레지스터
- 주요 함수:
- uint32_t VCU2_crc8(uint8_t *data, uint16_t length): CRC-8 계산
- void VCU2_complexMultiply(int32_t *in1, int32_t *in2, int32_t *out): 복소수 곱셈
- void VCU2_viterbiDecode(uint16_t *data, uint16_t length, uint16_t *output): 비터비 디코딩
- 클럭 활성화:
EALLOW; CpuSysRegs.PCLKCR0.bit.VCU = 1; // VCU-II 클럭 활성화 EDIS;
3. FPU, TMU, VCU-II 설정 절차
FPU, TMU, VCU-II를 효과적으로 사용하려면 다음 단계를 따릅니다:
- 시스템 초기화:
- InitSysCtrl()로 시스템 클럭과 PLL 초기화
- 인터럽트 비활성화 및 PIE 초기화 (DINT, InitPieCtrl, InitPieVectTable)
- VCU-II 클럭 활성화 (필요 시):
- CpuSysRegs.PCLKCR0.bit.VCU = 1
- 보호된 레지스터 접근을 위해 EALLOW와 EDIS 사용
- 라이브러리 포함:
- FPUfastRTS.lib (FPU, TMU)
- VCU2_Lib.lib (VCU-II)
- 헤더 파일: F2837xD_device.h, fpu.h, F2837xD_vcu2.h
- FPU/TMU 연산:
- FPUfastRTS 라이브러리 함수 호출 (sinPU, cosPU, FPUadd 등)
- 각도 입력은 per-unit (0~1.0) 사용 권장
- VCU-II 연산:
- CRC 계산: VCU2_crc8, VCU2_crc16, VCU2_crc32
- 복소수 연산: VCU2_complexMultiply, VCU2_complexAdd
- 비터비 디코딩: VCU2_viterbiDecode
- 결과 확인:
- VCU-II는 VSTATUS 레지스터로 상태 확인
- FPU/TMU는 반환값 직접 사용
4. FPU, TMU, VCU-II 설정 고려사항
- FPU/TMU:
- 연산 결과는 단정밀 부동소수점 (32비트)으로 처리
- TMU의 per-unit 각도 사용 시 0
2π를 01.0으로 정규화 - 높은 연산 속도를 위해 어셈블리 최적화 가능
- VCU-II:
- 복소수 연산은 16비트 또는 32비트 입력 지원
- CRC 계산 시 데이터 길이와 폴리노미얼 설정 확인
- 비터비 디코딩은 통신 프로토콜에 따라 적절한 파라미터 설정 필요
- 성능 최적화:
- FPU/TMU는 단일 사이클 연산에 최적화
- VCU-II는 복잡한 연산을 하드웨어로 가속
- 디버깅:
- FPU 레지스터 (R0H~R7H) 및 VCU-II 레지스터 (VSTATUS, VCRC) 모니터링
- CCS의 Expressions 창 활용
5. 실용적인 FPU, TMU, VCU-II 예제 코드
아래는 FPU, TMU, VCU-II를 활용한 7개의 실용적인 예제 코드로, Code Composer Studio와 C2000Ware 환경에서 실행 가능합니다.
5.1 예제 1: FPU를 사용한 기본 부동소수점 연산
// File: fpu_basic.c
// Description: TMS320F28377D FPU 기본 부동소수점 연산 예제
// Compiler: Code Composer Studio (TI C2000 Compiler)
// Target: TMS320F28377D
#include "F28x_Project.h"
#include "fpu.h"
void main(void) {
// 시스템 초기화
InitSysCtrl(); // 시스템 클럭 및 PLL 초기화
DINT; // 모든 인터럽트 비활성화
InitPieCtrl(); // PIE 초기화
IER = 0x0000; // CPU 인터럽트 비활성화
IFR = 0x0000; // 대기 중인 인터럽트 플래그 지우기
InitPieVectTable(); // PIE 벡터 테이블 초기화
// GPIO 설정 (LED 표시용)
EALLOW;
GpioCtrlRegs.GPBDIR.bit.GPIO31 = 1; // GPIO31을 출력(LED)으로 설정
GpioDataRegs.GPBSET.bit.GPIO31 = 1; // LED 켜기
EDIS;
// FPU 연산
float32_t a = 10.5f;
float32_t b = 5.25f;
float32_t result_add, result_div, result_sqrt;
result_add = a + b; // 덧셈 (FPU 사용)
result_div = FPUdiv(a, b); // 나눗셈 (FPUfastRTS 함수)
result_sqrt = FPUsqrt(a); // 제곱근 (FPUfastRTS 함수)
// 결과 확인 (CCS 디버깅 창에서 확인)
// result_add = 15.75, result_div = 2.0, result_sqrt ≈ 3.24037
for(;;); // 무한 루프
}
설명:
- 기능: FPU를 사용한 기본 부동소수점 연산(덧셈, 나눗셈, 제곱근)
- 설정: FPUfastRTS.lib 링크, fpu.h 포함
- GPIO: GPIO31(LED)
- 출력: result_add, result_div, result_sqrt를 CCS Expressions 창에서 확인
5.2 예제 2: TMU를 사용한 삼각함수 연산
// File: tmu_trig.c
// Description: TMS320F28377D TMU 삼각함수 연산 예제
// Compiler: Code Composer Studio (TI C2000 Compiler)
// Target: TMS320F28377D
#include "F28x_Project.h"
#include "fpu.h"
void main(void) {
// 시스템 초기화
InitSysCtrl(); // 시스템 클럭 및 PLL 초기화
DINT; // 모든 인터럽트 비활성화
InitPieCtrl(); // PIE 초기화
IER = 0x0000; // CPU 인터럽트 비활성화
IFR = 0x0000; // 대기 중인 인터럽트 플래그 지우기
InitPieVectTable(); // PIE 벡터 테이블 초기화
// GPIO 설정 (LED 표시용)
EALLOW;
GpioCtrlRegs.GPBDIR.bit.GPIO31 = 1; // GPIO31을 출력(LED)으로 설정
GpioDataRegs.GPBSET.bit.GPIO31 = 1; // LED 켜기
EDIS;
// TMU 연산
float32_t angle = 0.25f; // per-unit 각도 (90도 = π/2 = 0.25)
float32_t sin_result, cos_result;
sin_result = sinPU(angle); // 사인 (TMU 사용)
cos_result = cosPU(angle); // 코사인 (TMU 사용)
// 결과 확인 (CCS 디버깅 창에서 확인)
// sin_result ≈ 0.7071 (sin(π/2)), cos_result ≈ 0.7071 (cos(π/2))
for(;;); // 무한 루프
}
설명:
- 기능: TMU를 사용한 사인/코사인 연산 (90도 입력)
- 설정: FPUfastRTS.lib 링크, fpu.h 포함, per-unit 각도 사용
- GPIO: GPIO31(LED)
- 출력: sin_result, cos_result를 CCS Expressions 창에서 확인
5.3 예제 3: VCU-II를 사용한 CRC-16 계산
// File: vcu2_crc16.c
// Description: TMS320F28377D VCU-II CRC-16 계산 예제 (Bitfield 구조)
// Compiler: Code Composer Studio (TI C2000 Compiler)
// Target: TMS320F28377D
#include "F28x_Project.h"
#include "F2837xD_vcu2.h"
void main(void) {
// 시스템 초기화
InitSysCtrl(); // 시스템 클럭 및 PLL 초기화
DINT; // 모든 인터럽트 비활성화
InitPieCtrl(); // PIE 초기화
IER = 0x0000; // CPU 인터럽트 비활성화
IFR = 0x0000; // 대기 중인 인터럽트 플래그 지우기
InitPieVectTable(); // PIE 벡터 테이블 초기화
// GPIO 설정 (LED 표시용)
EALLOW;
GpioCtrlRegs.GPBDIR.bit.GPIO31 = 1; // GPIO31을 출력(LED)으로 설정
GpioDataRegs.GPBSET.bit.GPIO31 = 1; // LED 켜기
EDIS;
// VCU-II 클럭 활성화
EALLOW;
CpuSysRegs.PCLKCR0.bit.VCU = 1; // VCU-II 클럭 활성화
EDIS;
// CRC-16 계산
uint8_t data[] = {0x12, 0x34, 0x56, 0x78}; // 샘플 데이터
uint16_t length = sizeof(data);
uint32_t crc_result;
Vcu2Regs.VCRCPOLY = 0x8005; // CRC-16 폴리노미얼 (IBM CRC-16)
Vcu2Regs.VCRCSEED = 0x0000; // 초기 시드 값
for (uint16_t i = 0; i < length; i++) {
Vcu2Regs.VCRCDATA = data[i]; // 데이터 입력
}
while (Vcu2Regs.VSTATUS.bit.VCU_BUSY); // VCU 연산 완료 대기
crc_result = Vcu2Regs.VCRCRESULT; // CRC 결과
// 결과 확인 (CCS 디버깅 창에서 확인)
// crc_result = CRC-16 계산 결과
for(;;); // 무한 루프
}
설명:
- 기능: VCU-II를 사용한 CRC-16 계산
- 설정: VCU2_Lib.lib 링크, F2837xD_vcu2.h 포함, VCU-II 클럭 활성화
- GPIO: GPIO31(LED)
- 출력: crc_result를 CCS Expressions 창에서 확인
5.4 예제 4: VCU-II를 사용한 복소수 곱셈
// File: vcu2_complex_mult.c
// Description: TMS320F28377D VCU-II 복소수 곱셈 예제 (Bitfield 구조)
// Compiler: Code Composer Studio (TI C2000 Compiler)
// Target: TMS320F28377D
#include "F28x_Project.h"
#include "F2837xD_vcu2.h"
void main(void) {
// 시스템 초기화
InitSysCtrl(); // 시스템 클럭 및 PLL 초기화
DINT; // 모든 인터럽트 비활성화
InitPieCtrl(); // PIE 초기화
IER = 0x0000; // CPU 인터럽트 비활성화
IFR = 0x0000; // 대기 중인 인터럽트 플래그 지우기
InitPieVectTable(); // PIE 벡터 테이블 초기화
// GPIO 설정 (LED 표시용)
EALLOW;
GpioCtrlRegs.GPBDIR.bit.GPIO31 = 1; // GPIO31을 출력(LED)으로 설정
GpioDataRegs.GPBSET.bit.GPIO31 = 1; // LED 켜기
EDIS;
// VCU-II 클럭 활성화
EALLOW;
CpuSysRegs.PCLKCR0.bit.VCU = 1; // VCU-II 클럭 활성화
EDIS;
// 복소수 곱셈
int32_t in1[2] = {100, 200}; // 복소수 1 (실수:100, 허수:200)
int32_t in2[2] = {300, 400}; // 복소수 2 (실수:300, 허수:400)
int32_t out[2]; // 결과 (실수, 허수)
Vcu2Regs.VCMPLXIN1R = in1[0]; // 입력1 실수부
Vcu2Regs.VCMPLXIN1I = in1[1]; // 입력1 허수부
Vcu2Regs.VCMPLXIN2R = in2[0]; // 입력2 실수부
Vcu2Regs.VCMPLXIN2I = in2[1]; // 입력2 허수부
Vcu2Regs.VCONTROL.bit.CMPLXMULT = 1; // 복소수 곱셈 명령
while (Vcu2Regs.VSTATUS.bit.VCU_BUSY); // VCU 연산 완료 대기
out[0] = Vcu2Regs.VCMPLXOUTR; // 결과 실수부
out[1] = Vcu2Regs.VCMPLXOUTI; // 결과 허수부
// 결과 확인 (CCS 디버깅 창에서 확인)
// out[0] = -50000, out[1] = 100000 (100+200i)*(300+400i)
for(;;); // 무한 루프
}
설명:
- 기능: VCU-II를 사용한 복소수 곱셈
- 설정: VCU2_Lib.lib 링크, F2837xD_vcu2.h 포함, VCU-II 클럭 활성화
- GPIO: GPIO31(LED)
- 출력: out[0], out[1]를 CCS Expressions 창에서 확인
5.5 예제 5: FPU/TMU를 사용한 Clarke 변환
// File: tmu_clarke_transform.c
// Description: TMS320F28377D FPU/TMU를 사용한 Clarke 변환 예제
// Compiler: Code Composer Studio (TI C2000 Compiler)
// Target: TMS320F28377D
#include "F28x_Project.h"
#include "fpu.h"
void clarke_transform(float32_t ia, float32_t ib, float32_t *ialpha, float32_t *ibeta) {
*ialpha = ia;
*ibeta = (ia + 2.0f * ib) * 0.577350269f; // 1/sqrt(3) ≈ 0.577350269
}
void main(void) {
// 시스템 초기화
InitSysCtrl(); // 시스템 클럭 및 PLL 초기화
DINT; // 모든 인터럽트 비활성화
InitPieCtrl(); // PIE 초기화
IER = 0x0000; // CPU 인터럽트 비활성화
IFR = 0x0000; // 대기 중인 인터럽트 플래그 지우기
InitPieVectTable(); // PIE 벡터 테이블 초기화
// GPIO 설정 (LED 표시용)
EALLOW;
GpioCtrlRegs.GPBDIR.bit.GPIO31 = 1; // GPIO31을 출력(LED)으로 설정
GpioDataRegs.GPBSET.bit.GPIO31 = 1; // LED 켜기
EDIS;
// Clarke 변환 입력
float32_t ia = 1.0f; // 3상 전류 Ia
float32_t ib = 0.5f; // 3상 전류 Ib
float32_t ialpha, ibeta;
// Clarke 변환 수행 (FPU 사용)
clarke_transform(ia, ib, &ialpha, &ibeta);
// 결과 확인 (CCS 디버깅 창에서 확인)
// ialpha = 1.0, ibeta ≈ 1.1547
for(;;); // 무한 루프
}
설명:
- 기능: FPU를 사용한 Clarke 변환 (3상 전류를 αβ 좌표로 변환)
- 설정: FPUfastRTS.lib 링크, fpu.h 포함
- GPIO: GPIO31(LED)
- 출력: ialpha, ibeta를 CCS Expressions 창에서 확인
5.6 예제 6: TMU를 사용한 Park 변환
// File: tmu_park_transform.c
// Description: TMS320F28377D FPU/TMU를 사용한 Park 변환 예제
// Compiler: Code Composer Studio (TI C2000 Compiler)
// Target: TMS320F28377D
#include "F28x_Project.h"
#include "fpu.h"
void park_transform(float32_t ialpha, float32_t ibeta, float32_t theta, float32_t *id, float32_t *iq) {
float32_t sin_theta = sinPU(theta); // TMU를 사용한 사인 계산
float32_t cos_theta = cosPU(theta); // TMU를 사용한 코사인 계산
*id = ialpha * cos_theta + ibeta * sin_theta; // d축 전류
*iq = -ialpha * sin_theta + ibeta * cos_theta; // q축 전류
}
void main(void) {
// 시스템 초기화
InitSysCtrl(); // 시스템 클럭 및 PLL 초기화
DINT; // 모든 인터럽트 비활성화
InitPieCtrl(); // PIE 초기화
IER = 0x0000; // CPU 인터럽트 비활성화
IFR = 0x0000; // 대기 중인 인터럽트 플래그 지우기
InitPieVectTable(); // PIE 벡터 테이블 초기화
// GPIO 설정 (LED 표시용)
EALLOW;
GpioCtrlRegs.GPBDIR.bit.GPIO31 = 1; // GPIO31을 출력(LED)으로 설정
GpioDataRegs.GPBSET.bit.GPIO31 = 1; // LED 켜기
EDIS;
// Park 변환 입력
float32_t ialpha = 1.0f; // α축 전류
float32_t ibeta = 0.5f; // β축 전류
float32_t theta = 0.25f; // per-unit 각도 (90도 = π/2 = 0.25)
float32_t id, iq;
// Park 변환 수행 (FPU/TMU 사용)
park_transform(ialpha, ibeta, theta, &id, &iq);
// 결과 확인 (CCS 디버깅 창에서 확인)
// id ≈ 0.8536, iq ≈ 0.8536 (θ = π/2 기준)
for(;;); // 무한 루프
}
설명:
- 기능: TMU를 사용한 Park 변환 (αβ 좌표를 dq 좌표로 변환, 모터 제어용)
- 설정: FPUfastRTS.lib 링크, fpu.h 포함, per-unit 각도 사용
- GPIO: GPIO31(LED)
- 출력: id, iq를 CCS Expressions 창에서 확인
5.7 예제 7: VCU-II를 사용한 비터비 디코딩
// File: vcu2_viterbi_decode.c
// Description: TMS320F28377D VCU-II 비터비 디코딩 예제 (Bitfield 구조)
// Compiler: Code Composer Studio (TI C2000 Compiler)
// Target: TMS320F28377D
#include "F28x_Project.h"
#include "F2837xD_vcu2.h"
void main(void) {
// 시스템 초기화
InitSysCtrl(); // 시스템 클럭 및 PLL 초기화
DINT; // 모든 인터럽트 비활성화
InitPieCtrl(); // PIE 초기화
IER = 0x0000; // CPU 인터럽트 비활성화
IFR = 0x0000; // 대기 중인 인터럽트 플래그 지우기
InitPieVectTable(); // PIE 벡터 테이블 초기화
// GPIO 설정 (LED 표시용)
EALLOW;
GpioCtrlRegs.GPBDIR.bit.GPIO31 = 1; // GPIO31을 출력(LED)으로 설정
GpioDataRegs.GPBSET.bit.GPIO31 = 1; // LED 켜기
EDIS;
// VCU-II 클럭 활성화
EALLOW;
CpuSysRegs.PCLKCR0.bit.VCU = 1; // VCU-II 클럭 활성화
EDIS;
// 비터비 디코딩 설정
uint16_t data[] = {0xFFFF, 0x0000, 0xAAAA, 0x5555}; // 샘플 입력 데이터
uint16_t length = sizeof(data) / sizeof(data[0]);
uint16_t output[4]; // 출력 버퍼
// 비터비 디코딩 파라미터 설정
Vcu2Regs.VVITERBICFG.bit.K = 7; // 제약 길이 K=7
Vcu2Regs.VVITERBICFG.bit.RATE = 0; // 코드율 1/2
Vcu2Regs.VVITERBICFG.bit.POLY0 = 0x4F; // 생성 다항식 G0
Vcu2Regs.VVITERBICFG.bit.POLY1 = 0x6D; // 생성 다항식 G1
// 입력 데이터 로드
for (uint16_t i = 0; i < length; i++) {
Vcu2Regs.VVITERBIDATA = data[i];
}
// 디코딩 수행
Vcu2Regs.VCONTROL.bit.VITERBI = 1; // 비터비 디코딩 명령
while (Vcu2Regs.VSTATUS.bit.VCU_BUSY); // VCU 연산 완료 대기
// 결과 읽기
for (uint16_t i = 0; i < length; i++) {
output[i] = Vcu2Regs.VVITERBIOUT;
}
// 결과 확인 (CCS 디버깅 창에서 확인)
// output[] = 디코딩된 데이터
for(;;); // 무한 루프
}
설명:
- 기능: VCU-II를 사용한 비터비 디코딩 (통신 시스템의 오류 정정)
- 설정: VCU2_Lib.lib 링크, F2837xD_vcu2.h 포함, VCU-II 클럭 활성화
- GPIO: GPIO31(LED)
- 출력: output[]를 CCS Expressions 창에서 확인
6. 사용 방법
6.1 환경 설정
- C2000Ware 설치: C:\ti\c2000\C2000Ware_x_xx_xx_xx에서 라이브러리 다운로드
- CCS 프로젝트: TMS320F28377D 타겟으로 프로젝트 생성, F28x_Project.h, fpu.h, F2837xD_vcu2.h 포함
- 라이브러리 추가:
- FPUfastRTS.lib (FPU/TMU)
- VCU2_Lib.lib (VCU-II)
- 링커 파일: device_support\f2837xd 폴더에서 링커 파일 추가
6.2 코드 실행
- 각 예제를 별도의 .c 파일로 저장하거나, main.c에 복사
- 원하는 예제만 실행되도록 다른 코드 주석 처리
6.3 하드웨어 준비
- LED: GPIO31에 LED 연결 (정상 동작 확인용)
- 디버깅 장비: JTAG 디버거 및 CCS 필요
- VCU-II 테스트: CRC 계산, 복소수 연산, 비터비 디코딩 결과 확인용 데이터 준비
6.4 디버깅
- CCS Expressions 창: FPU 결과(result_add, sin_result 등), VCU-II 레지스터(VCRCRESULT, VCMPLXOUTR, VVITERBIOUT) 확인
- VCU-II 상태: Vcu2Regs.VSTATUS.bit.VCU_BUSY 모니터링
- 문제 해결:
- 연산 오류: 입력 데이터 범위 및 정규화 확인
- VCU-II 동작 실패: 클럭 활성화 및 VCRCPOLY, VVITERBICFG 설정 확인
7. 추가 팁
- 캘리브레이션: FPU/TMU 사용 시 Device_cal() 호출로 클럭 보정
- 성능 최적화: TMU의 per-unit 각도 사용, VCU-II의 하드웨어 가속 활용
- C2000Ware 참고: C:\ti\c2000\C2000Ware_x_xx_xx_xx\device_support\f2837xd\examples\cpu1\fpu
- 문제 해결:
- FPU/TMU 연산 오류: FPUfastRTS.lib 링크 확인
- VCU-II 동작 실패: CpuSysRegs.PCLKCR0.bit.VCU 설정 확인
- TI 리소스: TI E2E 포럼, C2000Ware 예제, TRM(Technical Reference Manual)
8. 결론
이 문서는 TMS320F28377D의 FPU, TMU, VCU-II를 활용한 설정 방법과 실용적인 예제 코드를 제공하여, 고성능 연산 애플리케이션에 쉽게 적용할 수 있도록 구성했습니다. FPU의 부동소수점 연산, TMU의 삼각함수 연산, VCU-II의 CRC 계산, 복소수 연산, 비터비 디코딩 예제를 통해 모터 제어, 신호 처리, 통신 프로토콜 등 다양한 분야에 활용 가능합니다.
키워드: TMS320F28377D, FPU, TMU, VCU-II, C2000, 부동소수점, 삼각함수, 복소수 연산, CRC 계산, 비터비 디코딩, Code Composer Studio, 모터 제어, 신호 처리