General Purpose Input Output(GPIO), 다용도 입출력
: 입력이나 출력을 포함한 동작이 런타임 시에 사용자에 의해 제어될 수 있는, 집적 회로나 전기 회로 기판의 디지털 신호 핀입니다. 디지털 신호의 입출력을 제어합니다.
Part 1. GPIO Register
32bit, I/O Port의 수(total 169)
- Port A : GPIO0 ~ GPIO31
- Port B : GPIO32 ~ GPIO63
- Port C : GPIO64 ~ GPIO95
- Port D : GPIO96 ~ GPIO127
- Port E : GPIO128 ~ GPIO159
- Port F : GPIO160 ~ GPIO168
내부 MUX를 통하여 더 많은 주변장치들과 연결되어있습니다. → 한 PIN에 최대 8가지 기능을 수행 가능합니다. MUX Register를 통해 기능 선택 가능.(ex. GPIO, ePWM, MCLKRA, eCAP, ...)
입력 신호 중 Noise 및 Glitch를 제거합니다.→ input signal은 input qualifier를 통해 검증 후 DSP 내부에 저장합니다.
GPIO Register는 GPIO Data Register와 GPIO Control Register로 나뉩니다.
Part 2. GPIO Data Register
- GPyDAT Registers: PIN의 Logic H/L 제어
- GPySET Registers: Logic High 출력
- GPyCLEAR Registers: Logic Low 출력
- GPyTOGGLE Registers: 현재 Logic Value toggle
Part 3. GPIO Control Register
- GPyMUXn, GPyGMUXn : GPIO 내부 동작회로 선택, 2bit씩 구성되어 있습니다.
- GPyDIR: PIN의 입, 출력 상태 선택하며 핀 방향을 제어합니다.
- Input Qualifier: Input Signal 검증
- GPxCTRL: Sampling Period/Frequency 설정 → Signal Qualify
- GPyPUD: pull-up Resistance 설정
- GPyDAT : GPIO의 High/Low를 제어합니다.
3-1. GPnGMUXn, GPnMUXn : 2bit씩 구성되어 있으며 조합하여 기능의 Register를 설정합니다.
3-2. GPxDIR : GPIO 값에 따라 GPIO mode 설정합니다. (1: input / 0 : output)
3-3. GPyDAT : GPxDIR 값이 Input으로 설정되어 있으면 PIN에 입력되는 신호를 HIGH/LOW로 읽습니다.
(ex. GPyDIR 값이 출력으로 설정되어 있으면 PIN의 출력을 HIGH/LOW로 설정 가능)
3-4. GPySET : GPySET 값이 출력으로 설정되어 있으면 1(Logic High)을 출력하고, 출력으로 설정되어 있지 않을 경우 무시합니다.
3-5. GPyCLEAR : GPyDIR값이 출력으로 설정되어 있으면 0을 출력하고, 출력으로 설정되어 있지 않을 경우 무시합니다.
3-6. GPyTOGGGLE : GPyDIR이 출력으로 설정되어 있고 상태가 1이면 0 출력하고, 상태가 0이면 1을 출력합니다.
출력으로 설정되어 있지 않을 경우엔 무시합니다.
3-7. GPyPUD : 0은 pull-up을 사용하고, 1은 pull-up을 사용하지 않습니다.
Part 4. Code(Test)
아래 코드는 싱크웍스의 Delfino 개발보드 F28377D 예제 1번의 CCS 코드입니다.
#include "F28x_Project.h" // Device Headerfile and Examples Include File
// 시스템에서 사용할 전역 변수 선언
Uint16 Loop_cnt;
Uint16 SW1, SW2, SW3, SW4;
// 메인 함수 - 시작
void main(void)
{
// Step 1. 전역 인터럽트 해제
DINT;
// Step 2. 시스템 클럭 초기화
InitSysCtrl();
// Step 3. GPIO 초기화
EALLOW; // 보호레지스터 해제
// 핀 기능 선택: GPIO43, 42, 70, 69 기능 사용
GpioCtrlRegs.GPBGMUX1.bit.GPIO43 = 0;
GpioCtrlRegs.GPBGMUX1.bit.GPIO42 = 0;
GpioCtrlRegs.GPCGMUX1.bit.GPIO70 = 0;
GpioCtrlRegs.GPCGMUX1.bit.GPIO69 = 0;
GpioCtrlRegs.GPBMUX1.bit.GPIO43 = 0;
GpioCtrlRegs.GPBMUX1.bit.GPIO42 = 0;
GpioCtrlRegs.GPCMUX1.bit.GPIO70 = 0;
GpioCtrlRegs.GPCMUX1.bit.GPIO69 = 0;
// GPIO 입출력 방향 선택: GPIO43, 42, 70, 69 입력 사용
GpioCtrlRegs.GPBDIR.bit.GPIO43 = 0;
GpioCtrlRegs.GPBDIR.bit.GPIO42 = 0;
GpioCtrlRegs.GPCDIR.bit.GPIO70 = 0;
GpioCtrlRegs.GPCDIR.bit.GPIO69 = 0;
EDIS; // 보호레지스터 설정
// Step 4. 변수 초기화
SW1 = 0;
SW2 = 0;
SW3 = 0;
SW4 = 0;
Loop_cnt = 0;
// 전역 인터럽트 활성화 및 and 리얼타임 디버깅 이벤트 활성화
EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM
// IDLE loop. Just sit and loop forever
for (;;)
{
SW1 = GpioDataRegs.GPBDAT.bit.GPIO43;
SW2 = GpioDataRegs.GPBDAT.bit.GPIO42;
SW3 = GpioDataRegs.GPCDAT.bit.GPIO70;
SW4 = GpioDataRegs.GPCDAT.bit.GPIO69;
Loop_cnt++;
}
// 메인 함수 - 끝
- Power : dock보드와 모듈의 전원 인가 (정상연결되면 J-TAG에 불빛이 들어옵니다.)
- J-TAG : PC에서 짠 C-Code를 기계어로 변환하여 dock-module에 전송합니다. (정상 동작 시 3개의 불이 점등됩니다.)
- Switch : Pull-down 저항으로 구성된 4개의 스위치 회로입니다.
- Module은 TMS28379D 를 사용하였습니다.
- Dock board : DSP chip의 핀을 4개의 channel로 구분하여 연결해주는 보조 보드입니다.
이상으로 GPIO에 대한 기본적인 설명을 마치도록 하겠습니다.
긴 글 읽어주셔서 감사합니다.
DataSheet에 기반하여 작성한 글이며 해당 파일이 용량이 큰 관계로 필요하신 분은 댓글로 이메일 남겨주시면 보내드리겠습니다.
다음 포스팅은 GPIO의 입력으로 외부 인터럽트를 받는 것과
Input X-Bar, Output X-Bar를 사용하는 것에 대해 올리도록 하겠습니다.