'분류 전체보기'에 해당되는 글 229건

  1. 2014.08.18 ADC(1)
  2. 2014.08.18 GpioInit
  3. 2014.08.18 Gpio
  4. 2014.08.18 기본자료
  5. 2014.08.11 28XDSP의 MMR선언과 배치 방법 정리
  6. 2014.08.11 구조체 명명법, MMR 관련 헤더 파일 종류
  7. 2014.08.11 28계열의 MMR선언 및 조작(2)
  8. 2014.08.11 비트필드(Bit Field)
  9. 2014.08.11 28계열의 MMR선언 및 조작(1)
  10. 2014.08.08 MMR이란?
TMS320/F283352014. 8. 18. 17:32

출처 : http://blog.naver.com/zeratool2/80109561219


본인이 작성한것이 아니라 퍼온것임을 밝힌다.

읽으면서 이해하고 이후 프로젝트와 연결하여 다시 설명한다. 내용은 거의 같게 하겠다.


ADC Registers


ADCTRL1~3마다 각각 다루는 영역이 다르다.

====================================================================================================

ADCTRL1




14 : Reset 핀

ADC모듈의 소프트웨어 리셋. 1을 주면 DSP가 리셋되는듯이 ADC의 모든 값, 설정이 초기화 된다.


13~12 : SUSMOD[1:0]

에뮬레이션 도중 브레이크를 만났을때는 행동지침을 설정한다.

00:에뮬레이션 서스펜드를 무시한다. : 브레이크를 무시하고 그냥 진행한다.

01:현재 시퀀서의 동작이 완료된 후 ADC를 정지한다.

10:현재 변환중인 시퀀서가 변환을 완료한 후 정지한다. 

11:시퀀서나 로직을 그 즉시 정지한다.


11~8 : ACQ_PS[3:0]

데이터 수집 윈도우 사이즈. SOC펄스의 길이를 조절하기 위한 비트필드로 샘플링 스위치의 주기가 끝나는 시간을 정한다. SOC펄스의 길이는 ADCLK주기의 (ADCTRL1[11:8]+1)배이다.

무슨말이냐면 


순차 샘플링시 타이밍도와 변환주기 공식




동시 샘플링시 타이밍도와 변환 주기공식


위 두 경우의 ACQPS에 들어가는 값을 정해주는 것이다.

변환주기란, 변환을 시작하여 모든 채널의 변환을 끝마칠 때까지의 시간이다.

위의 식은 28335에서 제공하는 16개의 ADC채널을 모두 변환한다는 전제하의 공식이다.


ADC의 클럭설정의 처리과정은 아래와 같은데


ADC공급 클럭, S/H(sample-and-hold)의 생성과정


위 과정에서 제일 마지막에 ACQPS가 사용된다.

Tadcclk는 ADCCLK의 역수로써각각 주기와 주파수를 뜻한다.


7 : CPS

위 그림의 6번째 단계에서 ADCCLK를 정하기 위한 최종옵션으로 0이면 1분주, 1이면 2분주이다.

즉, ADCCLK = Fclk/1 or Fclk/2 인것이다.


6 : CONT RUN

Continuous run. 1일 때 Continuous run mode가 된다. 나는 잘 모르는 AVR의 프리런 모드와 같다는데, 한번의 변환이 끝나면 자동으로 다음 변환을 하게 된다고 한다. 0이면 단발성 변환인 Start-Stop mode가 된다고 한다.


5 : SEQ OVRD

Continus mode에서만 유효하다. 1일경우 Override mode가 활성화 된다.

Override mode의 경우, 선택된 모든 채널의 변환 결과가 저장된 후에도 시퀀서의 상태 레지스터가 초기화 되지 않는다.

16개의 결과저장 레지스터가 꽉 찬 후에야 다시 처음부터 채우기 시작한다.


0일 경우 1회 변환이 종료되었을 때, 상태 레지스터가 초기화 되므로 결과저장 레지스터가 16개 다 채워지지 않아도 다음 변환때 다시 처음부터 채우게 된다.


4 : SEQ CASC[Cascaded Sequencer operation]

1일 경우 직렬시퀀서 모드[Cascaded Sequencer Mode]를 활성화 시키고

0일 경우 병렬시퀀서 모드[Dual-sequencer Mode]를 활성화 시킨다.



사진의 하단부에 시퀀서 1, 2를 확인할 수 있다.

시퀀서 1은 ADC0~7을, 2는 ADC8~15를 관장한다. 또한 시퀀서 1은 입력수단이 3가지 2는 2가지 이다.

병렬시퀀서 모드는 시퀀서 1,2가 각각 핀들을 관장하며 직렬시퀀서 모드의 경우 시퀀서 1이 모든 핀을 관장한다.


개발자가 보내는 신호를 ADC시퀀서에서 디지털 신호로 변환하는데, 신호를 주는 방법은 총 3가지로

1. 소프트웨어적으로 특정 레지스터를 통해 신호를 주는 방법

2. ePWMx 내부 타이머에 의한 방법

3. 외부인터럽트2(XINT2)로 정해진 핀을 트리거 시키는 방법


직렬시퀀서 모드일 때는 시퀀서 1이 모든 입력채널을 관장하지만 8~15번 핀에 대해서 방법3을 사용할 수는 없다.


====================================================================================================

ADCTRL2





15 : ePWM_SOCB_SEQ

ePWM SOCB enable for cascaded sequencer (Note: This bit is active only in cascaded mode.)

직렬 시퀀서 모드에서만 사용가능하고 ePWM SOCB를 사용가능하게 한다.

ePWM SOCB를 변환의 시작신호로 사용할 수 있다. 1로 셋팅하면 사용가능하다.


14 : RST SEQ1

시퀀서 1 또는 직렬 시퀀서를 즉시 정지시키고 초기화한다. 다음 변환은 선택된 입력채널의 처음순서부터 변환을 시작한다.


13 : SOC_SEQ1

시퀀서 1에 변환시작신호를 전달한다(S/W신호).

시퀀서1이 이미 동작 중일 경우, 변환환료까지 대기하다 변환이 완료되는 즉시 대기중인 신호가 시퀀서에 전달되어 변환을 시작한다.

신호가 들어가면 SOC_SEQ1은 0으로 클리어 된다.


11 : INT ENA SEQ1

시퀀서 1에 의한 인터럽트 활성화

인터럽트가 요청되면 해당 서비스 루틴을 실행한다.


10 : INT MOD SEQ1

인터럽트 모드의 선택비트

1일 경우 시퀀서1이 매번 두 번째 변환 종료 때마다 인터럽트가 요청 된다.

0일 때, 매번 변환 종료 때마다 인터럽트가 요청된다.


8 : ePWM SOC SEQ1

ePWM SOC1 신호를 변환 시작신호로 사용한다(1을 쓰면)

0으로 비활성화 시킨다.


7 : EXT SOC SEQ1[External signal start-of-conversion bit for SEQ1]

1을 쓰면 외부인터럽트2의 트리거 신호를 시퀀서1의 변환 시작신호로 쓴다.

0은 비활성화


6 : RST SEQ2

1을 쓰면, 시퀀서2를 즉시 초기화 하여 변환동작을 정지시킨다. 다음 변환은 선택된 입력채널의 처음순서부터 변환을 시작한다.


5 : SOC SEQ2

시퀀서 2에 변환시작신호 전달(S/W신호)

이미 동작 중이라면 변환완료까지 대기. 변환이 완료되면 즉시 대기중인 신호가 시퀀서에 전달되고 SOC SEQ2는 0으로 클리어


3 : INT ENA SEQ2

시퀀서2에 의한 인터럽트 활성화


2 : INT MOD SEQ2

인터럽트 모드 선택비트. 1일 경우 시퀀서2가 매번 두 번째 변환 종료 때마다 인터럽트가 요청 된다.

0일 때, 매번 변환 종료 때마다 인터럽트가 요청된다.


====================================================================================================

ADCTRL3



7~6 : ADCBGRFDN

ADC analog core의 Bandgap 회로와 Reference회로의 기동 혹은 정지를 제어한다.

1 : 기동, 0 : 정지


5 : ADCPWDN

Bandgap회로와 Reference회로를 제외한 모든 ADC analog회로를 제어한다.

1은 기동, 0은 정지


위 5~7에 대한 설명




4~1 : ADCCLKPS(Core Clock Divider ADCLK)

위의 tadcclk의 역수값으로 PLL회로의 HSPCLK를 거친 주파수를 또 한번 분주한다.

0일 때 : HSPCLK/1

1~15일 때 : HSPCLK/(2*ADCCLKPS)


0 : SMODE_SEL

샘플링 모드를 선택한다.

0은 순차 샘플링, 1은 동시 샘플링



그림을 다시 확인해 보면, ADCIN0~7에 대하여 A와 B로 나누어져 있음을 알 수 있다. 즉, ADCINA0~7, ADCINB0~7이다.

샘플링 모드와 시퀀서 모드가 각각 2가지씩 있으므로 모드의 조합은 총 4가지가 된다.

순차샘플링 모드에서는 선택된 입력채널 내에서 지정된 순서에 따라 순차적으로 한번에 하나씩 입력신호를 샘플링 한다.

동시샘플링 모드의 경우 시퀀서 1과 2에 대응하는 각각의 채널이 한 쌍을 이루어 처리된다.

입력채널의 처리순서는 시퀀서1에 해당되는 입력채널만으로 설정한다.(1에의해 2는 자동으로)

동시샘플링 모드에서 직렬시퀀서 모드일 경우, 입력채널 선택은 0~7만으로 한다.


ADC신호의 변환처리 순서 기준

1. 샘플링된 두개의 신호 중 먼저 변환모듈에 도착한 신호를 먼저 변환한다.

도중에 다른 신호가 동착한다면 변환중인 신호의 완료까지 대기한다.

2. 두 신호가 동시에 도착했을 경우 ADCINA를 우선한다.


단어:

SOC : Start Of Conversion

Bandgap 회로

Reference 회로

'TMS320 > F28335' 카테고리의 다른 글

Cpu Timer(2)  (0) 2014.08.19
Cpu Timer(1)  (1) 2014.08.19
ADC(2)  (0) 2014.08.18
Gpio  (0) 2014.08.18
기본자료  (0) 2014.08.18
Posted by 십자성군
Project/Balancing 283352014. 8. 18. 15:26

#include "DSP2833x_device.h"

#include "DSP2833x_GlobalPrototypes.h"

#include "GlobalProtoypesLee.h"


//***Include any other Headers which are necessary



void Init_GPIO()

{

EALLOW ;

// GPIO MUX Set


GpioCtrlRegs.GPAMUX1.all=0x0000;

GpioCtrlRegs.GPAMUX2.all=0x0000;

GpioCtrlRegs.GPBMUX1.all=0x0000;

GpioCtrlRegs.GPBMUX2.all=0x0000;


GpioMuxRegs.GPAMUX.bit.PWM1_GPIOA0 = 1 ;    // PWM //용도불명

GpioMuxRegs.GPBMUX.bit.PWM7_GPIOB0 = 1 ;    // PWM


GpioCtrlRegs.GPAMUX2.bit.GPIO20=1; //QEP

GpioCtrlRegs.GPAMUX2.bit.GPIO21=1; //QEP

GpioCtrlRegs.GPAMUX2.bit.GPIO22=1; //QEP

GpioCtrlRegs.GPAMUX2.bit.GPIO23=1; //QEP


GpioCtrlRegs.GPAMUX1.bit.GPIO9=2; //SCITXDB

GpioCtrlRegs.GPAMUX1.bit.GPIO11=2; //SCIRXDB


GpioCtrlRegs.GPBMUX2.bit.GPIO62=1; //SCIRXDC

GpioCtrlRegs.GPBMUX2.bit.GPIO63=1; //SCITXDC



GpioMuxRegs.GPEMUX.bit.XINT1_XBIO_GPIOE0 = 1 ;

GpioMuxRegs.GPEQUAL.bit.QUALPRD = 0xff ;


GpioMuxRegs.GPFMUX.bit.SPICLKA_GPIOF2 = 1; //SPI_SCLK

GpioMuxRegs.GPFMUX.bit.SPISIMOA_GPIOF0 = 1; //SPI_SIMO

GpioMuxRegs.GPFMUX.bit.SPISOMIA_GPIOF1 = 1; //SPI_SOMI

GpioMuxRegs.GPFMUX.bit.SPISTEA_GPIOF3 = 1; //SPI_SS



// GPIO DIR Set

GpioMuxRegs.GPADIR.bit.GPIOA1 = 1 ;  // output for motor direction

GpioMuxRegs.GPADIR.bit.GPIOA2 = 1 ;  // 컨트롤주기 확인

GpioMuxRegs.GPADIR.bit.GPIOA4 = 0 ; // 시스템 중간값(offset) 시작위한 스위치. I/O로 설정

GpioMuxRegs.GPBDIR.bit.GPIOB1 = 1 ;  // output for motor direction

GpioMuxRegs.GPBDIR.bit.GPIOB2 = 1 ;  // output for motor break

// GpioMuxRegs.GPFDIR.bit.GPIOF3 = 1 ; // output for SS break

GpioMuxRegs.GPGDIR.bit.GPIOG4 = 1 ; // SCIB TX

GpioMuxRegs.GPGDIR.bit.GPIOG5 = 1 ; // SCIB RX


GpioMuxRegs.GPAQUAL.all = 0x05 ;


// GpioMuxRegs.


EDIS ;

GpioDataRegs.GPFDAT.bit.GPIOF5 = 0 ;

GpioDataRegs.GPADAT.bit.GPIOA1 = 1 ;

GpioDataRegs.GPADAT.bit.GPIOA2 = 1 ;

GpioDataRegs.GPADAT.bit.GPIOA4 = 0 ; // 시스템 중간값.. 해당포트를 입력으로 사용 스위치 켜면 3.3v 전압 인가해서 HIGH가 됨

GpioDataRegs.GPGDAT.bit.GPIOG4 = 1 ;

GpioDataRegs.GPGDAT.bit.GPIOG5 = 1 ;

// GpioDataRegs.GPFDAT.bit.GPIOF3 = 1 ;

}



'Project > Balancing 28335' 카테고리의 다른 글

Init_Timer  (0) 2014.08.19
Init_ADC  (0) 2014.08.19
Posted by 십자성군
TMS320/F283352014. 8. 18. 12:01

2812와는 약간 다른 명칭과 구조를 가지고 있다.



2812 

28335 

GpioMuxRegs 

GpioCtrlRegs

GpioDataRegs 

GpioDataRegs 

 

GpioIntRegs 


28335에서 GpioIntRegs는 인터럽트 관련 GPIO_INT_REGS 구조체변수로 구조체는 아래와 같다.

struct GPIO_INT_REGS {

   union  GPIOXINT_REG     GPIOXINT1SEL; // XINT1 GPIO Input Selection

   union  GPIOXINT_REG     GPIOXINT2SEL; // XINT2 GPIO Input Selection

   union  GPIOXINT_REG     GPIOXNMISEL;  // XNMI_Xint13 GPIO Input Selection

   union  GPIOXINT_REG     GPIOXINT3SEL; // XINT3 GPIO Input Selection

   union  GPIOXINT_REG     GPIOXINT4SEL; // XINT4 GPIO Input Selection

   union  GPIOXINT_REG     GPIOXINT5SEL; // XINT5 GPIO Input Selection

   union  GPIOXINT_REG     GPIOXINT6SEL; // XINT6 GPIO Input Selection

   union  GPIOXINT_REG     GPIOXINT7SEL; // XINT7 GPIO Input Selection

   union  GPADAT_REG       GPIOLPMSEL;   // Low power modes GP I/O input select

};


GpioDataRegs는 형태가 같으며 GpioCtrlRegs가 GpioMuxRegs를 대신하며 그 구조 역시 바뀌었다.

struct GPIO_MUX_REGS {

   union  GPAMUX_REG   GPAMUX;

   union  GPADIR_REG   GPADIR;

   union  GPAQUAL_REG  GPAQUAL;

   Uint16              rsvd1;

   union  GPBMUX_REG   GPBMUX;

   union  GPBDIR_REG   GPBDIR;

   union  GPBQUAL_REG  GPBQUAL;   

   Uint16              rsvd2[5];

   union  GPDMUX_REG   GPDMUX;

   union  GPDDIR_REG   GPDDIR;

   union  GPDQUAL_REG  GPDQUAL;   

   Uint16              rsvd3;

   union  GPEMUX_REG   GPEMUX;

   union  GPEDIR_REG   GPEDIR;

   union  GPEQUAL_REG  GPEQUAL;   

   Uint16              rsvd4;

   union  GPFMUX_REG   GPFMUX;

   union  GPFDIR_REG   GPFDIR;

   Uint16              rsvd5[2];

   union  GPGMUX_REG   GPGMUX;

   union  GPGDIR_REG   GPGDIR;

   Uint16              rsvd6[6];

};


struct GPIO_CTRL_REGS {

   union  GPACTRL_REG  GPACTRL;   // GPIO A Control Register (GPIO0 to 31)

   union  GPA1_REG     GPAQSEL1;  // GPIO A Qualifier Select 1 Register (GPIO0 to 15)

   union  GPA2_REG     GPAQSEL2;  // GPIO A Qualifier Select 2 Register (GPIO16 to 31)

   union  GPA1_REG     GPAMUX1;   // GPIO A Mux 1 Register (GPIO0 to 15)

   union  GPA2_REG     GPAMUX2;   // GPIO A Mux 2 Register (GPIO16 to 31)

   union  GPADAT_REG   GPADIR;    // GPIO A Direction Register (GPIO0 to 31)

   union  GPADAT_REG   GPAPUD;    // GPIO A Pull Up Disable Register (GPIO0 to 31)

   Uint32              rsvd1;

   union  GPBCTRL_REG  GPBCTRL;   // GPIO B Control Register (GPIO32 to 63)

   union  GPB1_REG     GPBQSEL1;  // GPIO B Qualifier Select 1 Register (GPIO32 to 47)

   union  GPB2_REG     GPBQSEL2;  // GPIO B Qualifier Select 2 Register (GPIO48 to 63)

   union  GPB1_REG     GPBMUX1;   // GPIO B Mux 1 Register (GPIO32 to 47)

   union  GPB2_REG     GPBMUX2;   // GPIO B Mux 2 Register (GPIO48 to 63)

   union  GPBDAT_REG   GPBDIR;    // GPIO B Direction Register (GPIO32 to 63)

   union  GPBDAT_REG   GPBPUD;    // GPIO B Pull Up Disable Register (GPIO32 to 63)

   Uint16              rsvd2[8];

   union  GPC1_REG     GPCMUX1;   // GPIO C Mux 1 Register (GPIO64 to 79)

   union  GPC2_REG     GPCMUX2;   // GPIO C Mux 2 Register (GPIO80 to 95)

   union  GPCDAT_REG   GPCDIR;    // GPIO C Direction Register (GPIO64 to 95)

   union  GPCDAT_REG   GPCPUD;    // GPIO C Pull Up Disable Register (GPIO64 to 95)

};


2812와 비교해 새로운 것은 CTRL과 PUD의 존재이다.
============================================================================================
GPIOMUX

아래를 참고하자





Mux값을 설정하여 핀의 기능을 정할 수 있다.


28335는 총 88개의 핀이 존재하며 이는 A,B,C로 나뉜다. 또한 여기서도 각각 MUX1, MUX2의 2부분으로 나뉜다.

GPIOA

-GPAMUX1 : 0~15(16 pin)

-GPAMUX2 : 16~31(16 pin)


GPIOB

-GPBMUX1 : 32~47(16 pin)

-GPBMUX2 : 48~63(16 pin)


GPIOC

-GPCMUX : 64~79(16 pin)

-GPCMUX : 80~87(8 pin)


이 핀들은 MUX설정에 따라 어떤 기능을 할 것인가를 정할 수 있으며 최대 4종류가 있기에 핀당 2비트가 할당되어있다.

따라서 MUX1, MUX2모두 32비트씩을 갖는다.


============================================================================================

GPIOCTRL




DSP에서 받는 신호는 우리가 원하는 신호뿐만 아니라 노이즈(잡음)이 섞여 들어오기도 한다. 따라서 Qualification이라는 단계에서 수집된 신호에 대한 샘플링(동기화)를 하게 되는데, 여기서 중요한것이 Sampling Window이다.


실례를 들면서 설명하자.


SYSCLKOUT cycle : 시스템클럭의 주기(한 클럭당 시간).

SYSCLKOUT : 시스템클럭 주파수. 초당 클럭 수

QUALPRD(CTRL) : 동기 펄스 갯수

Sampling Window : 샘플링 횟수(샘플링 횟수-1)


3번째와 4번째는 같은 말인것 같지만 넘어가자...

위 그림에서는 Sampling Window = 6-1=5이다.


(SYSCLKOUT cycle*2*QUALPRD)    [1단계]

QUALPRD가 n이라고 할 때, Qualification 단계에 진입하는 신호의 2*n개째에서 값이 수집 된다. 만약 SYSCLKOUT cycle 이 10ms라고 하자. 이는 10ms당 1클럭씩 신호가 들어온다는 것이다. QUALRPD=4라고 한다면 2*4번째 신호를 샘플링 한다. 즉, 8*10ms주기로 신호를 수집한다는 것이다.


(SYSCLKOUT cycle*2*QUALPRD)*5    [2단계]

Sampling Window(width)=6일 때, 6-1=5 길이의 신호가 같은 값이면 이를 인정한다. 즉 80ms주기로 채집한 신호가 5회 연속으로 같은 값이어야 정상적인 신호로 인정한다는 것이다. 그렇다면 정상적인 한 신호의 판별에 최소 80*5ms가 걸린다는 의미가 될것이다.


QUALPRD는 총 8핀으로 값을 정할 수 있다. 0x00~0xFF까지 정할 수 있으며 0xFF일 때는 SYSCLKOUT cycle*2*255가 1단계의 길이(시간)이 될것이다.


P.S C포트에는 이 레지스터가 존재하지 않는다.

============================================================================================

GP QSEL[Qualification Select)(1,2)


이는 위에서 나온 Sampling window's width의 설정이다.

한 핀당 2비트씩 할당되어 4가지 설정이 가능하다.


00:미사용 (0샘플링. 시스템 클럭에만 동기화)

01 : width = 2(3샘플링)

10 : width = 5(6샘플링)

11 : 시스템 클럭에 비동기하게. 입력 신호의 샘플링 없이 연속적으로 받아들인다. 특수핀(주변회로)때만 유효하고 단순 GPIO일 경우 00과 같다.


============================================================================================

GPDIR

입, 출력 방향성 설정으로 GPIO로 쓸 경우 유효.

0 : 입력

1 : 출력


GPPUD

한 핀당 1비트씩 할당. I/O, 특수핀 모두 유효하며 0이면 내부 풀업. 1이면 Disable


============================================================================================

GPIO Data Registers


DAT : 32비트 레지스터. 헤당 핀의 출력의 Data를 결정

SET : 32비트 레지스터. 헤당 핀을 High로. 1만 사용 가능

CLEAR : 32비트 레지스터. 헤당 핀을 LOW로. 1만 사용 가능

TOGGLE : 32비트 레지스터. 헤당 핀의 상태를 반전. 1만 사용 가능


============================================================================================

GPIO INTx Select


GPIOXINT(1,2)SEL

하위 5비트(0~31)을 이용하여 A포트의 아무 핀이나 외부인터럽트 1,2기능을 부여 가능.

XINTnCR레지스터에서 설정 가능


GPIOXINT(3~7)SEL

하위 5비트(0~31)을 이용하여 B포트의 아무 핀이나 외부인터럽트 3~7기능을 부여 가능.

XINTnCR레지스터에서 설정 가능


GPIOXNMISEL

GPIOXINT(1,2)SEL

하위 5비트(0~31)을 이용하여 A포트의 아무 핀이나 Non-Maskable Interrupt(XNMI_XINT13핀)기능 부여 가능


GPIOLPMSEL

저전력 모드 관련

'TMS320 > F28335' 카테고리의 다른 글

Cpu Timer(2)  (0) 2014.08.19
Cpu Timer(1)  (1) 2014.08.19
ADC(2)  (0) 2014.08.18
ADC(1)  (0) 2014.08.18
기본자료  (0) 2014.08.18
Posted by 십자성군
TMS320/F283352014. 8. 18. 11:35




tms320f28335.pdf


'TMS320 > F28335' 카테고리의 다른 글

Cpu Timer(2)  (0) 2014.08.19
Cpu Timer(1)  (1) 2014.08.19
ADC(2)  (0) 2014.08.18
ADC(1)  (0) 2014.08.18
Gpio  (0) 2014.08.18
Posted by 십자성군
TMS320/Study2014. 8. 11. 18:10

핸드북의 4.5절 EALLOW, EDIS에 대한 설명은 생략하였다. 중요한 내용임에는 분명하다 블로그에 게재할 속성의 내용은 아닌듯 하여 넘어간다. 4.6절의 MMR선언과 배치 방법 정리라는 제목으로 도표로 일목요연하게 다루기 때문에 이는 꼭 봐두어야 할 필요성이 있다.

 

 

 

 

'TMS320 > Study' 카테고리의 다른 글

I2C 참고  (0) 2016.05.23
구조체 명명법, MMR 관련 헤더 파일 종류  (0) 2014.08.11
28계열의 MMR선언 및 조작(2)  (0) 2014.08.11
28계열의 MMR선언 및 조작(1)  (0) 2014.08.11
MMR이란?  (0) 2014.08.08
Posted by 십자성군
TMS320/Study2014. 8. 11. 17:03

공부하는 내용


 


Start!

 

더 자세한 내용은 TI에서 제공하는 유저가이드를 참고해야 하겠지만 여기서는 간단히 한다.

 

AdcRegs    : ADC회로 MMR

EvaRegs    : Event Manage A의 MMR

SciaRegs    : SCI_A포트 MMR

GpioMuxRegs    : Gpio Mux 그룹 MMR

GpioDataRegs    : Gpio Data 그룹 MMR

CpuTimer0Regs  : Cpu Timer 0의 MMR

 

접두사가 주변 회로를 나타냄을 간단히 알 수 있다.

구조체의 이름이 헷갈릴 경우는 그와 관련된 헤더파일을 참고하면 된다.

아래는 핸드북에서 제공되는 매우 중요한, 헤더 파일 종류의 표이다. 선언문은 생략한다..

 

구분

 목적

헤더 파일 

구조체 명

System Control 

 시스템 설정

DSP281x_SysCtrl.h 

 SysCtrlRegs

CsmRegs

CsmPwl

FlashRegs

CPU Timer 

DSP281x_CpuTimer.h 

CpuTimer0Regs 

GPIO 

DSP281x_Gpio.h 

GpioMuxRegs

GpioDataRegs 

EMIF

DSP281x_Xintf.h 

XintfRegs 

Emulation 

DSP281x_DevEmu.h 

DevEmuRegs 

PIE 

인터럽트 설정 

DSP281x_PieCtrl.h 

PieCtrlRegs

PieVectTable 

External Int 

DSP_Xintrupt 

XIntruptRegs 

ADC 

 ADC 및 EV

DSP281x_Adc.h 

AdcRegs 

Event Manager 

DSP281x_Ev.h 

EvaRegs

EvbRegs

 McBSP

 통신 모듈 관련

DSP281x_Mcbsp.h 

McbspaRegs 

SCI 

DSP281x_Sci.h 

SciaRegs

ScibRegs 

 SPI

DSP281x_Spi.h 

SpiaRegs 

CAN 

DSP281x_ECan.h 

ECanaRegs

ECanaMboxes

ECanaLAMRegs

ECanaMOTORegs

ECanaMOTSRegs 

 

주의.

ADC와 EV는 DSP Core의 HSPCLK 경로로부터 동일 클럭을 공급받는다. 따라서 둘의 분주비는 항상 같다.

28x의 CAN모듈은 32비트 회로로 구성되어 있기에 일부 레지스터는 32비트를 워드 단위로 사용한다. 16비트 단위로 접근할 때, 다음과 같이 접근한다.

PeripheralName.RegisterName.half.LSW

PeripheralName.RegisterName.half.MSW

 

32비트를 반쪽으로 나눠서 각각에 접근할 수 있다.

 

'TMS320 > Study' 카테고리의 다른 글

I2C 참고  (0) 2016.05.23
28XDSP의 MMR선언과 배치 방법 정리  (0) 2014.08.11
28계열의 MMR선언 및 조작(2)  (0) 2014.08.11
28계열의 MMR선언 및 조작(1)  (0) 2014.08.11
MMR이란?  (0) 2014.08.08
Posted by 십자성군
TMS320/Study2014. 8. 11. 15:33

공부하는 내용

 

#pragma 전처리기


Start!

 

핸드북에서는 #pragma에 대하여 섹션설정과 관련햇 설명해 놓았다. 물론 MMR과 관련하여 설명하고 있으므로 그것으로 충분할지도 모른다. 하지만 MMR선언 및 조작과 관련하여서는 앞의 글로 충분하다고 생각하며 우리가 cmd를 확인할 수는 있어도 함부로 만질일은 거의 없을 것이다. 따라서 MMR과 관련된 섹션 설정 및 cmd작성은 '제어'를 목표로 그 선행지식을 위한 본 블로그에 맞지 않기에 핸드북에 맡기기로 하고 간단하게 #pragma에 대해서 다루기로 하겠다. 만약 device driver관련한 dll, lib등에 관심있다면 그와 관련된 전문서적을 참고하는것이 나을 듯 하다.

 

예전에 pragma에 대해서 다음과 같이 언급하였다.

 

pragma는 전처리기(preprocessor)을 의미하고 C컴파일러에 지시를 내릴 때 사용하는 명령이다. pragma의 지시어는 once, comment, loop등 다양하다.

 

아래를 숙지하자.

 

1.전처리문은 다양한 종류가 있다.

2.전처리기 앞에는 #을 적는다.

3.전처리기의 긑에는 ;을 붙이지 않는다

4.한줄에 하나의 전처리기만 사용 할 수 있다.

5.하나의 전처리기를 여러 줄로 나누어 처리하려면 줄 끝에 \(역 슬래쉬)를 붙인다.

 

전처리기의 종류는

 

1.#include                                             : 파일 처리를 위한 전처리문

2.#define, #undef                                   : 형태의 정의를 위한 전처리문

3.#if, #ifdef, #ifndef, #else, #elif, #endif    : 조건처리를 위한 전처리문

4.#pragma                                            : 컴파일 옵션 처리를 위한 전처리문

 

우리는 이중 4.#pragma에 대해 '짧게' 다루고자 한다.

 

#pragma는 전처리기 중 하나로 컴파일러에 명령을 내린다.

 

컴파일러에 대해 naver 백과사전의 내용을 인용하겠다.

고급언어(ex. c)로 쓰인 프로그램이 대상 기계(컴퓨터, 임베디드 장치 등)가 직접 이해할 수 있는 목적언어(어셈블리, 기계어 등)로 바꾸는 일을 하는 프로그램이다.[.out, .obj 등을 만들어 준다]

 

#pragma에 대해서 몇몇 예시를 들어 간단히 설명한다.

 

1.#pragma once() : 컴파일을 한번만 실행

:헤더 파일에서 자주 쓰이며 여러 소스 또는 헤더에서 참조될 때 중복참조의 여지가 있을 때 자주 사용된다.

 

2.#pragma pack() : 메모리 공간 최적화(구조체의 정렬 방식 지정)

()안에 숫자가 들어가며 구조체의 공간을 아낄 수 있다. 자세한 설명은 : http://euro87.tistory.com/150

3.#pragma warning() : 특정 경고 설정

 

4.#pragma DATA_SECTION, CODE_SECTION

 

실제로 dsp등을 사용하면서 다룰만한 것은 once나 pack 정도일 것이다. 섹션 설정은 크게 다룰 일은 없을 것이다.

'TMS320 > Study' 카테고리의 다른 글

28XDSP의 MMR선언과 배치 방법 정리  (0) 2014.08.11
구조체 명명법, MMR 관련 헤더 파일 종류  (0) 2014.08.11
28계열의 MMR선언 및 조작(1)  (0) 2014.08.11
MMR이란?  (0) 2014.08.08
cmd 파일  (0) 2014.08.07
Posted by 십자성군
Software/Programming2014. 8. 11. 12:19

프로그래밍 목적이라기 보다는 DSP에서 한번 나왔던 개념이기에 혹시 궁금하신 분들은 참고하길 바랍니다~

 

사전적인 의미

:구조체의 구성 요소(member)의 선언에서 ':'을 함께하는 정수식을 지정하는 방법

 

목적

:메모리의 낭비를 줄이기 위함

 

요즘 컴퓨터는 성능이 매우 좋아서 별로 쓰이지 않지만, DSP와 같이 자원이 한정적인 기기들에는 여전히 유용하다.

예를들어 Int형 정수를 사용하는데 그 값은 0아니면 1만 나온다고 하자.(가령 GPIOA의 MUX는 0아니면 1이면 충분하다.) Uint16이라고 해도 16비트 즉 2바이트다. 1비트면 충분한데 16비트로 사용한다면 정말 큰 메모리 낭비이지 않겠는가? 이때, 선언은 16비트라도 메모리를 1비트로 사용할 수 있다.

 

아래 구조체를 보자

 

struct BitFieldTest    {

unsinged int a : 2;

unsinged int b : 3;

};

 

이 구조체에 대한 size는 32비트(16X2)로 잡히고 하위 두 비트(0,1 번째)와 그 위의 세 비트(2,3,4 번째)가 사용되고 나머지 비트들은 사용되지 않는다. 따라서 메모리를 아낄 수 있다.

 

단점을 들자면 이 32비트 메모리에서 특정 비트들만 값을 변경할 때, 예를 들어 BitFieldTest.a = 1을 하면 단순히 a에 1을 대입하는 것이 아니라 (BitFieldTest & 3 | 1)로 처리되어 비트 연산을 수행하기 때문에 메모리는 아끼지만 속도가 느려지게 된다. MCU에서 MUX레지스터를 자주 바꾸지는 않을테니 큰 문제는 되지 않을것이라 본다.

위의 (BitFieldTest & 3 | 1)이 무슨 의미냐 하면 3이란 숫자는 0b11로 2비트를 의미하기 때문에 BitField의 2비트를 &로 추려내고 여기에 or연산자로 1을 대입하는 것이다. 따라서 한번 연산할 것을 2번연산하게 되는 것이다.

 

struct GPAMUX_BITS    {

Uint16 PWM1_GPIOA0 : 1;

Uint16 PWM2_GPIOA1 : 1;

...

};

 

DSP 28x의 GPAMUX_BITS이다 단지 ON, OFF 만 사용한다면 0,1이면 되기에 1비트만으로도 충분하다.

 

signed 변수를 사용할 때 오버플로우 또는 언더플로우가 발생하지 않도록 값의 대입을 조심하도록 하자.

또한 당연하겠지만 비트수에 따른 표현 가능한 수의 갯수는 2의 n승이다.

Posted by 십자성군
TMS320/Study2014. 8. 11. 12:01

공부하는 내용

구조체를 기반으로 한 MMR조작 및 선언의 기본


Start!

 

 

GPAMUX BIT 

Peripheral Name 

GPIO Name 

GPADIR Bit 

Type 

Reset 

PWM1 

GPIOA0 

R/W 

1

PWM2

GPIOA1

1

R/W 

0

2

PWM3

GPIOA2

2

R/W 

0

3

PWM4

GPIOA3

3

R/W 

0

4

PWM5

GPIOA4

4

R/W 

0

5

PWM6

GPIOA5

5

R/W 

0

6

T1PWM_T1CMP

GPIOA6

6

R/W 

0

7

T2PWM_T2CMP

GPIOA7

7

R/W 

0

8

CAP1_QEP1

GPIOA8

8

R/W 

0

9

CAP2_QEP2

GPIOA9

9

R/W 

0

10

CAP3_QEPI1

GPIOA10

10

R/W 

0

11

TDIRA

GPIOA11

11

R/W 

0

12

TCLKINA

GPIOA12

12

R/W 

0

13

C1TRIP

GPIOA13

13

R/W 

0

14

C2TRIP

GPIOA14

14

R/W 

0

15

C2TRIP 

GPIOA15 

15 

R/W  

GPAMUX 레지스터 구조

 

struct GPAMUX_BITS  {        // bits   description
   Uint16 PWM1_GPIOA0:1;     // 0 
   Uint16 PWM2_GPIOA1:1;     // 1
   Uint16 PWM3_GPIOA2:1;     // 2 
   Uint16 PWM4_GPIOA3:1;     // 3 
   Uint16 PWM5_GPIOA4:1;     // 4 
   Uint16 PWM6_GPIOA5:1;     // 5
   Uint16 T1PWM_GPIOA6:1;    // 6 
   Uint16 T2PWM_GPIOA7:1;    // 7       
   Uint16 CAP1Q1_GPIOA8:1;   // 8
   Uint16 CAP2Q2_GPIOA9:1;   // 9
   Uint16 CAP3QI1_GPIOA10:1; // 10
   Uint16 TDIRA_GPIOA11:1;   // 11
   Uint16 TCLKINA_GPIOA12:1; // 12
   Uint16 C1TRIP_GPIOA13:1;  // 13 
   Uint16 C2TRIP_GPIOA14:1;  // 14 
   Uint16 C3TRIP_GPIOA15:1;  // 15  
        
};

 

GPAMUX에 대한 구조체를 위와같이 선언하였다. Uint16은 typedef unsinged int    Uint16

으로 선언된 16비트 부호없는 정수를 의미한다. 또한 각각의 변수는 비트필드로 1비트만을 사용하도록 하였다. PWM1등 GPIOA의 기능을 확인할 수 있다.

 

아래를 보자

 

union GPAMUX_REG {
   Uint16             all;
   struct GPAMUX_BITS bit;
};

 

union구조체 사용하여 GPAMUX에 대하여 bit또는 all을 이용하여 접근할 수 있음을 알 수 있다.

 

또한 아래와 같이

 

struct GPIO_MUX_REGS {
   union  GPAMUX_REG   GPAMUX;
   union  GPADIR_REG   GPADIR;
   union  GPAQUAL_REG  GPAQUAL;
   Uint16              rsvd1;
   union  GPBMUX_REG   GPBMUX;
   union  GPBDIR_REG   GPBDIR;
   union  GPBQUAL_REG  GPBQUAL;  
   Uint16              rsvd2[5];
   union  GPDMUX_REG   GPDMUX;
   union  GPDDIR_REG   GPDDIR;
   union  GPDQUAL_REG  GPDQUAL;  
   Uint16              rsvd3;
   union  GPEMUX_REG   GPEMUX;
   union  GPEDIR_REG   GPEDIR;
   union  GPEQUAL_REG  GPEQUAL;  
   Uint16              rsvd4;
   union  GPFMUX_REG   GPFMUX;
   union  GPFDIR_REG   GPFDIR;
   Uint16              rsvd5[2];
   union  GPGMUX_REG   GPGMUX;
   union  GPGDIR_REG   GPGDIR;
   Uint16              rsvd6[6];
};

 

GPIO A~BDEFG의 MUX레지스터군을 확인할 수 있다.

또한 아래와 같이 선언하여 다른 코드에서 GPIO_MUX_REGS에 참조가 가능하도록 하고 있다.

DSP281x_Gpio.h.를 참고하라

 

extern volatile struct GPIO_MUX_REGS GpioMuxRegs;

 

이와 관련된 섹션설정은 DSP281x_GlobalVariableDefs.c에서 확인할 수 있다.

 

#pragma DATA_SECTION(GpioMuxRegs,"GpioMuxRegsFile");

 

volatile struct GPIO_MUX_REGS GpioMuxRegs;

 

또한 nonBIOS.cmd에서 아래를 확인할 수 있다.

 

GpioMuxRegsFile   : > GPIOMUX,     PAGE = 1

 

여하튼 우리는 GpioDataRegs를 통해 GPIO_MUX_REGS 구조체에 접근할 수 있으며 GPIOA에 대한 설정도 가능한 것이다.

 

예를들어

 

GpioMuxRegs.GPAMUX.all = 0x0000 ;
GpioMuxRegs.GPAMUX.bit.PWM1_GPIOA0 = 1 ;    // PWM

 

위 코드를 보면, GPAMUX_REG 구조체의 all을 통해서 총 16비트에 한번에 값을 주거나, GPAMUX_BITS  구조체를 갖는 bit에 접근하여 개개의 비트에 접근할 수도 있다.

 

=============================================================================

기본은 마쳤지만 Tip으로써 아래를 보자.

 

/*

GpioMuxRegs.GPAMUX.bit.PWM1_GPIOA    =1;

GpioMuxRegs.GPAMUX.bit.PWM2_GPIOA    =1;

GpioMuxRegs.GPAMUX.bit.PWM3_GPIOA    =1;

GpioMuxRegs.GPAMUX.bit.PWM5_GPIOA    =1;

GpioMuxRegs.GPAMUX.bit.PWM6_GPIOA    =1;

*/

 

GpioMuxRegs.GPAMUX.all=0x0037;

 

위의 주석처리를 1번이라하고 그 아래를 2번이라고 하자. 두 코드 모두 같은 의미를 가지고 있다. 하지만 1번은 5사이클, 2번은 1사이클로 명령처리를 끝낸다. 큰 차이는 안나겠지만 되도록이면 2번과 같이 코드를 짜는것이 나을것이다. 하지만 개발하는 입장에서 인수인계의 문제를 생각한다면 1번이 더 편하겠지. 따라서 위와같이 1,2번 둘다 기재하고 1번을 주석처리하는 것이 여러모로 편할 것이다.

'TMS320 > Study' 카테고리의 다른 글

구조체 명명법, MMR 관련 헤더 파일 종류  (0) 2014.08.11
28계열의 MMR선언 및 조작(2)  (0) 2014.08.11
MMR이란?  (0) 2014.08.08
cmd 파일  (0) 2014.08.07
DSP281x_GlobalVariableDefs.c  (0) 2014.08.07
Posted by 십자성군
TMS320/Study2014. 8. 8. 16:55

공부하는 내용


 

Start!

앞의 글을 반드시 이해한 상태에서 공부하자! 

 

앞선 학습에서도 언급 됐었지만 MMR이란 Memory Mapped Register의 약자이다.

메모리처럼 조작 가능한 레지스터를 의미한다. 그리고 DSP Controller등 Controller 계통의 마이크로 프로세서에는 주변회로가 다양하기에 레지스터가 매우 많다.

 

 

내부(internal) 레지스터

 

계산용으로 사용되는 내부 레지스터는 계산과정에서 자연스럽게 접근이 가능하기에 주소를 부여하지 않는다.

번지를 가진 레지스터는 데이터 메모리 주소 생성 회로를 거쳐서 해당 번지를 부여받고 데이터 교환 작업이 이뤄지기에 사이클이 더 소모된다.

 

계산에는 Accmulator 레지스터, 곱셈을 위한 T, P레지스터 등이 필요하다.

 

이러한 내부 레지스터는 번지가 없기 때문에 데이터 교환으로 레지스터간 전용 통로를 구축하며 이를 레지스터 라 부른다.

레지스터 버스를 이용하면 주소 생성 과정이 필요없어지고 -> 데이터 교환 작업 등이 매우 신속하게 처리된다.

그러나 처리 속도면에서는 좋을 수 있으나 레지스터간 채널이 급격하게 증가하여 칩이 커지게 된다. 또한 전력소비도 많아진다.

메모리를 다루는 고수준 언어에서 주소가 없으니 레지스터를 다룰 수 없다.

 

시대가 지나면서 MPU에 주변회로가 함께 집적되어 CPU가 필요로 하는 레지스터가 많아지고 C언어 등 프로그래밍 언어가 보편화 되어 이를 이용한 개발 환경 구축이 요구되었다. 칩 사이즈를 줄이기 위해 레지스터 버스의 증가를 억제하고 처리능력을 올리기 위한 해결책으로 데이터 버 활용하게 되었다. 이를 통해서 레지스터의 내용을 메모리처럼 입출력하고 조작가능하게 되었다. 이를 통해 C언어와 같은 고수준 언어를 통한 조작이 가능해 진것이고 MMR의 개념이 생겨난 것이다.

 

결론을 말하자면

레지스터의 관리를 용이하도록 하기 위해, 메모리 주소와 같은 주소를 레지스터마다 부여하였으며, 이로 인해 C언어와 같은 데이터 메모리 조작형 언어에서도 어셈블리의 도움없이 레지스터 조작이 가능해진 것이다.

 

정리

1.내부 레지스터에는 사이클의 단축을 위해서 번지를 부여하지 않았으며 데이터 교환을 위한 전용 통로로 레지스터 버스를 활용한다.

2.레지스터 버스의 사용은 칩의 사이즈 증가와 전력소비 증가를 야기한다.

3.이를 줄이기 위해 데이터 버스를 활용하게 되었고 이를 통해 레지스터마다 고수준 언어인 C를 통해 어셈블리 없이 메모리 조작이 가능해졌다.

 

==============================================================================

MMRs(Memory Mapped Registers)

 

일반 입출력 핀인 GPIO(General Pulpose Input Output)을 예시로 들어본다.

GPIO는 개발자가 임의로 입출력 상태를 설정할 수 있다. 이 레지스터는 모두 MMR이며 개발자의 의도가 GPIO장치에 대한 레지스터에 올바르게 반영되어야 할것이다. 개발자는 이 레지스터에, 메모리 값을 사용하듯 읽거나 쓰면서 레지스터 내용을 정할 수 있다.

 

DSP에는 많은 핀들이 달려있고 전원, ADC, JTAG등의 핀을 제외하고는 모두 GPIO로 쓰일 수 있다. '쓰일 수 있다'라는 말의 의미는 '다른 용도도 있다'라고 들릴 수 있다. 리셋 직후에는 GPIO A0인 핀을 '설정 여부에 따라' PWM1로 사용할 수 있다.

 

 

 

GPIO핀 구조

 

위 그림을 보면 알 수 있듯이, GPxMUX레지스터의 설정에 따라 GPIO핀의 기능을 정할 수 있다.

GPxMUX를 0으로 설정하여 일반 입출력 포트로 설정할 경우, 이를 입력으로 사용할 것인지 출력으로 사용할 것인지를 GPxDIR레지스터로 정할 수 있다.

일반 입출력포트를 입력으로 정했다면 이 포트의 값을 읽을 있어야 하고 출력으로 정했다면 값을 정해줘야 할 것이다. 이를 위한 레지스터가 GPxDAT이다.

 

이런 제어를 위한 MCU에는 다양한 주변회로가 탑재되어 있고 이를 다루기 위한 많은 레지스터가 있다. 이 레지스터들을 C언어처럼 데이터 메모리를 조작하기 위해 레지스터에 메모리 주소를 부여하였다.

예를들어 GPAMUX레지스터를 조작학 싶다면 0x70C0라는 데이터 메모리 번지를 조작하면 되는 것이다. 간단히 말해 0x70C0번지에 있는 변수를 조작하는 것과 동일하다.

 

이처럼 번지를 부여받은 레지스터를 MMR(Memory Mapped Register)이라고 하며, 이 덕에 C언어에서 어셈블리 없이 MMR의 조작이 가능하다.

 

정리

1.GPxMUX로 핀의 기능을 정할 수 있다.

2.GPxDIR을 조작하여 일반 입출력 핀의 입출력 여부를 정할 수 있다.

3.GPxDAT값으로 값을 읽거나 쓸 수 있다.

4.레지스터의 메모리 주소를 통해서 C언어처럼 조작할 수 있다.

5.이렇게 주소를 부여받은 레지스터를 MMR이라고 한다.

'TMS320 > Study' 카테고리의 다른 글

28계열의 MMR선언 및 조작(2)  (0) 2014.08.11
28계열의 MMR선언 및 조작(1)  (0) 2014.08.11
cmd 파일  (0) 2014.08.07
DSP281x_GlobalVariableDefs.c  (0) 2014.08.07
DSP281x_Device.h  (0) 2014.08.07
Posted by 십자성군