TMS320F28X 개발보드 V2 예제
[F28P65x / CPU1] 28X 칩과 USB 마우스간 연결 예제 (USB Host Mouse, Bitfield/DriverLib/FreeRTOS)
인터럽트
2026.09.28 15:26:46
조회수 30
1. 실습 안내
본 예제는 TMS320F28P65x(F28P650DK9 산업용 / F28P659DK8-Q1 차량용) 제어 모듈이 탑재된 TMS320F28X 개발보드(EVM) V2를 대상으로 합니다.F28P65x 칩의 On-Chip USB(USB0)를 호스트(Host) 모드로 동작시켜 개발보드 '(5) USB 통신 회로'의 표준 4핀 USB 커넥터(Top 면)에 연결된 USB 마우스의 좌우(X축) 움직임을 읽어들이고, 그 값을 그대로 개발보드 '(8) 범용 LED 16개' 블록에 반영해 점등 위치를 좌우로 이동시킵니다. 마우스를 왼쪽/오른쪽으로 움직이면 보드 위 LED가 실시간으로 따라 움직이는 것을 눈으로 바로 확인할 수 있습니다.
F28P55x용으로 이미 올라와 있는 USB 마우스 예제(SCI-to-USB 시리얼 터미널로 좌표를 확인하는 방식)와 달리, 이번 F28P65x 버전은 LED16 블록으로 결과를 즉시 눈으로 확인할 수 있게 만들었고, 학습 목적에 따라 Bitfield / DriverLib / FreeRTOS 3가지 구현을 모두 제공합니다.
2. 실습 준비
본 예제는 아래의 개발환경에서 테스트 되었습니다.1) CCS 버전 : Code Composer Studio v12.x / v20.x / v21.x (Theia)
2) 컴파일러 버전 : TI v22.6.3.LTS 이상
3) 개발보드 : TMS320F28X 개발보드 V2
4) 프로세서 모듈 : 싱크웍스 TMS320F28P65x 모듈 (F28P650DK9 / F28P659DK8-Q1)
5) 예제버전 : v1.00
6) 기타 : USB 마우스(HID 표준 마우스), 필요 시 USB 허브
7) 프로젝트 구성 : 학습 목적에 따라 3가지 버전을 모두 제공합니다.
- Bitfield : 애플리케이션 코드가 DriverLib을 전혀 호출하지 않고 레지스터 비트필드 구조체만으로 구현 (usblib 자체의 숨은 driverlib 의존성만 링크)
- Driverlib : TI 표준 HAL API 라이브러리를 활용한 모던 C2000Ware 구현 (가독성/이식성)
- FreeRTOS : USB 호스트 폴링을 태스크 1개(UsbMouseTask)로 감싼 구현, 완전 정적 메모리 할당(Zero Heap)
3. 실습 예제 다운로드 (GitHub ZIP 다운로드 안내)
초보자분들도 손쉽게 다운로드하여 사용하실 수 있도록 전체 소스 코드를 GitHub에 공개해 두었습니다.아래 안내에 따라 ZIP 압축 파일로 다운로드하세요.
[다운로드 순서]
① 아래의 링크를 클릭하여 GitHub 저장소 페이지로 이동합니다.
>> [GitHub] EVM_V2_F28P65x_05_USB_HostMouse 저장소 바로가기
(※ 다이렉트 ZIP 다운로드 : EVM_V2_F28P65x_05_USB_HostMouse.zip 클릭하여 바로받기)
② GitHub 페이지 우측 상단의 초록색 <> Code ▼ 버튼을 클릭합니다.
③ 나타나는 메뉴 맨 아래의 Download ZIP 항목을 클릭하여 압축 파일을 다운로드합니다.
④ 다운로드한 ZIP 파일의 압축을 해제합니다.
- 권장 설치 경로 : C:/SyncWorks/TMS320F28X_EVM_V2_28P65x/5_USB_HostMouse
(※ 주의 : 경로 상에 한글이나 공백이 포함되지 않도록 주의해 주세요.)
4. CCS 프로젝트 불러오기 (CCS V20 기준) 및 컴파일
>> [유튜브] CCS V20 예제 프로젝트 불러오기 방법 소개 영상① Code Composer Studio(CCS)를 실행합니다.
② 상단 메뉴에서 File > Import Projects... 를 클릭합니다.
③ Specify Search Directory 버튼을 눌러 앞서 압축을 해제한 폴더를 선택합니다. (ZIP 파일을 바로 "Select archive file"로 지정해도 됩니다.)
④ 검색된 프로젝트 목록 중 실습하고자 하는 프로젝트(5_USB_HostMouse_Bitfield, 5_USB_HostMouse_Driverlib, 5_USB_HostMouse_Freertos 중 원하는 프로젝트)를 체크하여 선택합니다.
⑤ Finish 버튼을 클릭하여 프로젝트를 워크스페이스로 불러옵니다.
⑥ 프로젝트를 마우스 우클릭하여 Build Project를 수행합니다. (기본 설정: CPU1_RAM 또는 필요 시 CPU1_FLASH)
5. 예제 실행을 위한 하드웨어 점퍼선 연결 안내
개발보드의 '(5) USB 통신 회로'는 F2837x/F2838x용 ControlCARD 구성을 기준으로 만들어져 있어, F28P65x 모듈에서는 아래처럼 A/B Side 핀-헤더에서 점퍼 케이블로 직접 연결해야 합니다.| 신호 | EVM V2 핀-헤더 | 할당 신호명 | 연결 대상 |
| USB D- | A Side 15번 핀 | GPIO42 / USB0DM | (5) 블록 "D-" |
| USB D+ | A Side 17번 핀 | GPIO43 / USB0DP | (5) 블록 "D+" |
| USB VBUS | A Side 19번 핀 | GPIO46 | (5) 블록 "VBUS" |
| USB ID | A Side 21번 핀 | GPIO47 | (5) 블록 "ID" |
| USB EPEN | B Side 45번 핀 | GPIO50 | (5) 블록 "EPEN" — 연결 안 하면 VBUS 전원 스위치가 꺼져 마우스가 열거되지 않습니다 |
| USB PFLT | B Side 47번 핀 | GPIO49 | (5) 블록 "PFLT" |
| LED × 16 | A Side 65~95번 핀(홀수) | GPIO0~15 | (8) 범용 LED 16개 블록 입력 16핀에 순서대로 연결 |
* EPEN/PFLT의 GPIO 번호(50/49)는 F28P65x 전용입니다. 매뉴얼의 F2838x 배선표는 같은 물리적 핀-헤더 위치(B Side 45/47번)에서 GPIO121/120이라고 적혀 있는데, F28P65x는 GPIO121이 이 패키지(256ZEJ)에 존재하지 않는 예약 핀이라 실제로는 다른 GPIO(50/49)가 옵니다.
USB 마우스는 (5)번 회로 Top면의 4핀 표준 USB 커넥터(Type-A)에 직접 연결하거나 USB 허브를 통해 연결하세요.
(클릭하시면 큰 이미지로 자세히 확인하실 수 있습니다.)
6. 예제 실행 및 동작 확인
① JTAG 에뮬레이터를 연결하고 디버그(Debug, F11) 후 실행(Resume, F8)합니다.② CCS WATCH 창 관찰 (기존 Expressions) :
상단 메뉴 View > Watch (기존 CCS v12 이하는 View > Expressions) 창을 열고 Continuous Refresh를 켠 뒤 아래 변수를 등록합니다.
- `usbHostState` : 0=미연결, 1=마우스 초기화 중, 2=마우스 연결됨, 3=미지원 장치, 4=전원 오류
- `ledIndex` : 0~15, 현재 점등된 LED 위치
- `mouseCursorX` : 누적 X 이동량(디버깅용)
- `mouseButtons` : bit0=좌클릭, bit1=우클릭, bit2=휠클릭
③ 마우스 연결 확인 :
마우스를 꽂으면 `usbHostState`가 0 → 1 → 2로 바뀌어야 정상입니다.
④ LED 좌우 이동 확인 :
마우스를 좌우로 움직이면 `ledIndex` 값이 따라 바뀌고, 실제 보드 위에서도 점등된 LED가 좌우로 이동하는 것이 눈으로 보이면 정상입니다. 양쪽 끝(0, 15)에서는 더 이상 넘어가지 않고 멈춥니다.

7. 참고 — 3가지 버전 실측 메모리 사용량 비교
동일한 동작을 세 가지 방식으로 구현했을 때 RAM 사용량(CPU1_RAM 빌드 기준)이 얼마나 달라지는지 실제로 빌드해서 비교했습니다.| 버전 | 코드 | 데이터/BSS/CONST | 스택 | 합계 |
| Bitfield | 13,323 B | 2,429 B | 1,016 B | 16.4 KB |
| DriverLib | 16,384 B | 3,518 B | 1,016 B | 20.5 KB |
| FreeRTOS | 16,384 B | 6,604 B | 1,016 B | 23.5 KB |
Bitfield 버전이 가장 작은 이유는 usblib.lib 자체의 코드/데이터 크기는 동일하지만 애플리케이션 코드가 DriverLib 함수 호출 대신 레지스터를 직접 건드려 호출 오버헤드가 줄어들기 때문이고, FreeRTOS 버전이 가장 큰 이유는 커널 자체 코드/데이터(태스크 스택, TCB, 스케줄러)가 추가되기 때문입니다.
| 번호 | 제목 | 작성자 | 날짜 |
|---|
- 1




