[TMS320F28069M] GPIO 컨트롤, GPIO 설정, DSP GPIO 제어하기-2

728x90
반응형

https://vuzwa.tistory.com/entry/TMS320F28069M-GPIO-%EC%BB%A8%ED%8A%B8%EB%A1%A4-GPIO-%EC%84%A4%EC%A0%95-DSP-GPIO-%EC%A0%9C%EC%96%B4%ED%95%98%EA%B8%B0-1

 

[TMS320F28069M] GPIO 컨트롤, GPIO 설정, DSP GPIO 제어하기-1

예제를 불러와서 활용하는 방법까지 알아봤다. 어떤 회사에서.. 교육자료 등을 판매하길래 엄청나게 어려운가 보다 했는데 생각보다 어렵지 않다. 그럼 이제 GPIO 컨트롤부터 시작해보자. C2000 계

vuzwa.tistory.com

 

이전 포스팅에서 타이머와 gpio 동작을 LED를 통해 확인해봤다. 그럼 이제 GPIO 레지스터를 분석해보자.

레지스터를 보면 GPIO는 A와 B로 나눠진 걸 확인할 수 있다. 그리고 USB IO로 사용할 수 있고, Analog기능(ADC, DAC, PWM 등)으로 사용하기 위한 레지스터도 보인다. 바로 아래 내용도 확인해보면,

GPIO를 외부 Interrupt로 활용할 수 있고, low Power Mode에서 wake up 하기 위한 핀으로 사용하기 위한 레지스터도 보인다.  본 포스팅에서 레지스터 이름 중간에 x와 n이 들어가는데 x는 Port A 또는 B를 의미하는 것이고, n은 1 또는 2를 의미한다.(혹시나.. 해서 적는다.)

 

GPIO의 용도(Input, Output, Peripheral), GPIO 방향(입력 or 출력), GPIO 입력 검증, GPIO 상태 읽기, GPIO 출력  순서로 알아보자! 

 

1. GPIO의 용도(Input, Output, Peripheral) - GPxMUXn Register

GPxMUXn(X = A or B, n = 1 or 2) 레지스터를 통해 핀마다 기능을 지정할 수 있다. 

MUX(GPAMUX1, 2, GPBMUX1, 2) 레지스터에서 GPIO의 기능을 설정할 수 있다. 기본적으로는 GPIO Input/Output으로 설정되어 있다.

 

GPIO A의 15번을 예를 들어 살펴보면, 00으로 설정할 경우 기본적인 GPIO Input/Output으로 설정할 수 있고, 01(0x01)은 ECAP2, 10(0x02)은 SCIRXDB, 11(0x03)은 /SPISTEB로 사용하도록 설정 가능하다. 

 

코드로 살펴보면.

GpioCtrlRegs.GPAMUX1.all = 0x00000000;

GPIO A의 0~15번을 모두 0x00000000으로 초기화시키겠다는 의미다. 아래 코드처럼 각 GPIO마다 별도로 초기화시킬 수도 있다.

GpioCtrlRegs.GPAMUX1.bit.GPIO15 = 0x0;

 

지원하는 DSP의 Peripheral은 데이터 시트를 보면 확인할 수 있다.

2. GPIO 방향(입력 or 출력) - GPxDIR Register

GPIO의 방향을 설정하는 레지스터다. 방향? 입력 아니면 출력이지 뭐.. 기본적으로 입력으로 설정되어 있다.

코드로 살펴보면.

 

GpioCtrlRegs.GPADIR.all = 0x00008000;

GPIOA의 15번을 출력으로 설정하고 나머지는 입력으로 설정하는 코드다. 각 GPIO마다 별도로 설정을 하고 싶으면 아래 코드 참조

GpioCtrlRegs.GPADIR.bit.GPIO15 = 1;

 

여기까지 설정하면 기본적으로 GPIO의 용도를 설정할 수 있고, 방향(입력 or 출력)을 설정할 수 있다.

 

 

3. GPIO 입력 검증 - (GPxQSELn, GPxCTRL) Register

TI DSP에는 다른 MCU에서는 볼수없던 기능을 제공한다.(내가 다뤄본, Atmel, ESP, ST, NXP 등.. 에서는 아직 못 봤다. 있을 수도 있다.)

GPIO에 입력된 신호를 일정 횟수만큼 연속적으로 확인해 모두 일치한 경우만 정상적인 입력으로 받아들이는 기능이다. 

 

Input Qualificaion은 다시 3가지로 나눠진다. No Synchronization (asynchronous input), Synchronization to SYSCLKOUT Only, Qualification Using a Sampling Window 이 옵션의 선택은 GPxQSELn 레지스터에서 설정한다. 

 

3.1. No Synchronization (asynchronous input)

레지스터 값을 11b(0x03)으로 설정한 경우다. GPIO를 Peripheral 기능 중 일부로 사용하는 경우에 유효하며 GPIO 핀을 Input, Output으로 설정한 경우 이 옵션은 유효하지 않게 된다. 

 

3.2. Synchronization to SYSCLKOUT Only

레지스터 값을 00b(0x00)으로 설정한 경우다. 레지스터의 default 값이며, 입력을 시스템 클럭과 동기화시켜 최대 SYSCLKOUT만큼 입력 지연이 발생할 수 있고 신호는 검증하지 않는다.

 

3.3. Qualification Using a Sampling Window 

레지스터 값을 01b(0x01), 10b(0x20)으로 설정한 경우다. 입력의 검증을 3회 또는 6회 샘플링해 검증하겠다는 설정이다. 

 

3.1은 특별히 살펴볼 내용이 없고, 3.2와 3.3에 대해 알아보겠다.

 

 

데이터 시트 117페이지에 나와있는 Block diagram을 보면

GPIO의 입력이 버퍼를 통해 SYNC를 거쳐 Qualificaion을 통해 신호가 입력된다. 3개 또는 6개로 샘플링해 검증된 입력 신호만을 받아들이겠다..?

조금 내려보면 자세한 내용이 나온다.

 

위 Block Diagram을 보면 GPIO Signal이 입력된 시점부터 SYSCLKOUT과 동기화돼 GPxQSELn에서 설정된 샘플링 횟수만큼 샘플링을 해서 모두 같은 값인 경우만 통과(Output From Qualifier)시킨다.

 

입력을 SYSCLKOUT과 동기화시키는 동안 입력에 지연시간(tW(IQSW))이 발생되고, 입력간의 tW(SP)샘플링 주기(Sampling Period)는 GPxCTRL[QUALPRDn] 레지스터에서 사용자가 설정할 수 있다. 

 

레퍼렌스 메뉴얼의 내용을 보면 더 헷갈려서 내가 이해하고 정리한 내용으로 설명해보도록 하겠다.

 

입력 간에 샘플링 주기는 GPxCTRL 레지스터에서 사용자가 설정할 수 있다. 레지스터 값이 0 인경우는 TSYSCLKOUT 값이 입력 간 샘플링 주기가 된다. SYSCLKOUT 값이 60MHz 라면, TSYSCLKOUT 값은 t = 1/f = 1/60MHz = 16.67nsec 가 된다. 레지스터 값이 0보다 큰 경우는 아래 수식으로 계산한다. 

 

tW(SP) = 2 * GPxCTRL * TSYSCLKOUT

 

GPxCTRL 값을 6으로 예를 들면 2*6*16.67nsec = 200.04nsec 가 된다. 입력 간 샘플링 주기를 Sampling WIndow 개수-1 만큼 곱해주면 전체 샘플링 주기가 나온다. Sampling Window 값은 GPxQSELn에서 3 sample과 6 sample로 설정할 수 있다. 6 sample로 계산해보면 

 

 

tW(IQSW) = 5 * tW(SP) = 5 * 200.04nsec = 1,000.2 = 1.002 usec

 

 

입력 신호를 6회 샘플링해 검증하면 총 1.002 usec의 시간이 소요된다. 여기서 숫자 5는 6회 입력이면 입력 간 간격이 5기 때문에 5가 된다. 

 

아.. 이거 쓰는데 하루 종일 걸렸다. 설명이 어렵네 휴..

 

여하튼 여기까지가 입력 검증에 대한 내용이다. 

 

 

 

4. GPIO 상태 읽기 GPxDAT Register

GPIO의 상태는 GPxDAT 레지스터를 통해 확인할 수 있다.

GPxDAT 레지스터는 GPIO가 출력으로 설정되어 있으면 출력 상태를 설정할 수 있고, 입력으로 설정되어 있으면 GPIO의 상태를 읽어올 수 있다. GPIO의 상태는 위의 3번에서 설명한 GPIO 입력 검증이 완료된 상태다. 어려운 내용이 없기 때문에 이 정도만 설명하면 될 것 같다. 

 

5. GPIO 출력 GPxSET, GPxCLEAR, GPxTOGGLE Register

GPIO의 출력은 Set, Clear, Toggle 이렇게 총 3가지 레지스터가 있다. GPxSET 레지스터는 GPIO 상태를 High로 만들고, GPxCLEAR 레지스터는 GPIO 상태를 Low 만든다. 마지막으로 GPxTOGGLE 레지스터는 GPIO를 현재 상태에서 반대로 반드는 레지스터다. High일 경우 Low로, Low 일 경우 High로.

 

 

 

하. 힘들었다. 본 포스팅에서 가장 중요한 내용은 3번의 입력 검증 부분이다. 이 부분을 정확하게 이해하고 넘어가야 할 것 같다. 

 

- 끝 -

728x90
반응형