본문 바로가기
학부 자료/DSP(MCU)

[GPIO] General Purpose Input Output, 싱크웍스 예제 GPIO 입력, 외부 인터럽트로 사용, Input X-Bar

by jackMK 2023. 11. 18.

General Purpose Input Output(GPIO), 다용도 입출력

: 입력이나 출력을 포함한 동작이 런타임 시에 사용자에 의해 제어될 수 있는, 집적 회로나 전기 회로 기판의 디지털 신호 핀입니다. 디지털 신호의 입출력을 제어합니다.

 

지난 글에 이어 이번에는 GPIO를 입력과 외부 인터럽트로 사용하는 싱크웍스 실습 예제에 대해 다루어보겠습니다.

 

Part 1. Interrupt

인터럽트(Interrupt)란?

: CPU가 프로그램을 실행하고 있을 때, 입출력 하드웨어 등의 장치에 예외상황이 발생하여 처리가 필요할 경우에 CPU에게 알려 처리할 수 있도록 하는 것으로, 우선적으로 처리해야할 일이 발생하였을 때 그것을 처리하고 원래 동작으로 돌아오는 것을 말합니다.

 

1-1. Interrupt 구조

  • IER (Switch) : 인터럽트 활성화 스위치
  • IFR (Latch) : 인터럽트 신호 검출기
  • PIEIER : 확장된 개별 인터럽트 활성화
  • PIEIFR : 확장된 개별 인터럽트 신호 검출기
  • PIEACK : 인터럽트 처리되는 동안 다른 인터럽트가 CPU로 전파되는 것 방지

*PIE(Peripheral Interrupt Expansion) : 기본 CPU 인터럽트 요청을 확산하여 추가적인 인터럽트 처리를 가능하게 한다.

 

1-2. Interrupt 초기화

  • InitPieCtrl : PIEIER과 PIEIFR 초기화
  • IER 초기화 : IER = 0x0000
  • IFR 초기화 : IFR = 0x0000

글 아래에 있는 코드의 '외부 인터럽트 포함된 벡터 활성화' 부분에 대한 Data Sheet 사진입니다.

 

 

Part 2. Input X-Bar

Input X-Bar 기능이란?

: 입력신호가 필요한 일부 기능들(외부인터럽트 기능, 외부ADC트리거 기능, PWM 외부신호 동기화 기능 등)이 사용하는 핀을 특정핀으로 고정하지 않고, TMS320F2837xD가 가지고 있는 GPIO 핀 중 하나를 선택해서 사용하는 기능입니다.

 

Input X-Bar

 

 

 

Part 3. TEST(Code)

아래 코드는 싱크웍스의 Delfino 개발보드 F28377D 예제 2번의 CCS 코드입니다.

실습예제 사이트 바로가기

 

// 선행처리 지시
#include "F28x_Project.h" // Device Headerfile and Examples Include File
#define TMS320F28377D176 1  // TMS320F28377D-176 모듈 사용시

// 함수 선언
interrupt void Xint4_isr(void);
interrupt void Xint3_isr(void);
interrupt void Xint2_isr(void);
interrupt void Xint1_isr(void);

// 시스템에서 사용할 전역 변수 선언
Uint16 Loop_cnt;
Uint16 SW1_cnt, SW2_cnt, SW3_cnt, SW4_cnt;

//  ISR 함수 정의
interrupt void Xint1_isr(void){
    SW1_cnt++;
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}

interrupt void Xint2_isr(void){
    SW2_cnt++;
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}

interrupt void Xint3_isr(void){
    SW3_cnt++;
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP12;
}

interrupt void Xint4_isr(void){
    SW4_cnt++;
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP12;
}


// 메인 함수 - 시작 
void main(void){
// Step 1. 전역 인터럽트 해제
DINT;

// Step 2. 시스템 클럭 초기화:
InitSysCtrl();

// Step 3. 인터럽트 초기화:
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();

// Vector Remapping
EALLOW;
PieVectTable.XINT4_INT = &Xint4_isr;  //Peripheral Interrupt Expansion
PieVectTable.XINT3_INT = &Xint3_isr;
PieVectTable.XINT2_INT = &Xint2_isr;
PieVectTable.XINT1_INT = &Xint1_isr;
EDIS;

// 외부 인터터트 포합된 백터 활성화
PieCtrlRegs.PIEIER12.bit.INTx2 = 1; // PIE 인터럽트(XINT4) : Enable
PieCtrlRegs.PIEIER12.bit.INTx1 = 1; // PIE 인터럽트(XINT3) : Enable
PieCtrlRegs.PIEIER1.bit.INTx5 = 1; // PIE 인터럽트(XINT2) : Enable
PieCtrlRegs.PIEIER1.bit.INTx4 = 1; // PIE 인터럽트(XINT1) : Enable
IER |= M_INT1 | M_INT12 ; // CPU 인터럽트(INT1, INT12) : Enable

// Step 4. GPIO 초기화
EALLOW; // 보호레지스터 해제

// 핀 기능 선택: GPIO44, GPIO45, GPIO46, GPIO47 기능 사용
GpioCtrlRegs.GPBGMUX1.bit.GPIO44 = 0;
GpioCtrlRegs.GPBGMUX1.bit.GPIO45 = 0;
GpioCtrlRegs.GPBGMUX1.bit.GPIO46 = 0;
GpioCtrlRegs.GPBGMUX1.bit.GPIO47 = 0;
GpioCtrlRegs.GPBMUX1.bit.GPIO44 = 0;
GpioCtrlRegs.GPBMUX1.bit.GPIO45 = 0;
GpioCtrlRegs.GPBMUX1.bit.GPIO46 = 0;
GpioCtrlRegs.GPBMUX1.bit.GPIO47 = 0;

// GPIO 입출력 방향 선택: GPIO44, GPIO45, GPIO46, GPIO47  입력 사용
GpioCtrlRegs.GPBDIR.bit.GPIO44 = 0;
GpioCtrlRegs.GPBDIR.bit.GPIO45 = 0;
GpioCtrlRegs.GPBDIR.bit.GPIO46 = 0;
GpioCtrlRegs.GPBDIR.bit.GPIO47 = 0;

EDIS; // 보호레지스터 설정

// Step 5. XINT 초기화
EALLOW;
// Input-X Bar 설정
InputXbarRegs.INPUT13SELECT = 44; // Input-X Bar 13(XINT4) - GPIO44(SW4) 설정
InputXbarRegs.INPUT6SELECT = 45; // Input-X Bar 6(XINT3) - GPIO45(SW3) 설정
InputXbarRegs.INPUT5SELECT = 46; // Input-X Bar 5(XINT2) - GPIO46(SW2) 설정
InputXbarRegs.INPUT4SELECT = 47; // Input-X Bar 4(XINT1) - GPIO47(SW1) 설정
EDIS;

// 외부 인터럽트 발생 조건 설정
XintRegs.XINT4CR.bit.POLARITY = 3;      // 입력 신호의 하강 & 상승 엣지
XintRegs.XINT3CR.bit.POLARITY = 2;      // 입력 신호의 하강 엣지
XintRegs.XINT2CR.bit.POLARITY = 1;      // 입력 신호의 하강 엣지
XintRegs.XINT1CR.bit.POLARITY = 0;      // 입력 신호의 하강 엣지

// 외부 인터럽트 기능 활성화 설정
XintRegs.XINT4CR.bit.ENABLE = 1;        // XINT4 인터럽트 : Enable
XintRegs.XINT3CR.bit.ENABLE = 1;        // XINT3 인터럽트 : Enable
XintRegs.XINT2CR.bit.ENABLE = 1;        // XINT2 인터럽트 : Enable
XintRegs.XINT1CR.bit.ENABLE = 1;        // XINT1 인터럽트 : Enable

// Step 6. 변수 초기화
SW1_cnt = 0;
SW2_cnt = 0;
SW3_cnt = 0;
SW4_cnt = 0;
Loop_cnt = 0;

// 전역 인터럽트 활성화 및 and 리얼타임 디버깅 이벤트 활성화
EINT;   // Enable Global interrupt INTM
ERTM;   // Enable Global realtime interrupt DBGM

// IDLE loop. Just sit and loop forever :
for(;;){
Loop_cnt++;
}

}
// 메인 함수 - 끝 

코드 출력 후 공부한 사진입니다. example2 부분은 보지 않으셔도 됩니다.

 

 

 

  • 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, 입력, 외부 인터럽트로 사용, Input X-Bar에 대한 설명을 마치도록 하겠습니다.

읽어주셔서 감사합니다.

 

DataSheet에 기반하여 작성한 글이며 해당 파일이 용량이 큰 관계로 필요하신 분은 댓글로 이메일 남겨주시면 보내드리겠습니다.


loading