'TMS320'에 해당되는 글 58건

  1. 2014.08.19 SCI
  2. 2014.08.19 Cpu Timer(2)
  3. 2014.08.19 Cpu Timer(1) 1
  4. 2014.08.19 시스템 클럭의 설정과 관련하여
  5. 2014.08.18 ADC(2)
  6. 2014.08.18 ADC(1)
  7. 2014.08.18 Gpio
  8. 2014.08.18 기본자료
  9. 2014.08.11 28XDSP의 MMR선언과 배치 방법 정리
  10. 2014.08.11 구조체 명명법, MMR 관련 헤더 파일 종류
TMS320/F283352014. 8. 19. 20:43

SCI

SCI : Serial Communication Interface


비동기 통신 방식(UART : Universal Asynchronous Receive and Transmit)

범용 컴퓨터와 주로 RS-232C 규격으로 데이터를 교환한다. 장거리 통신이 가능하고 281X DSP가 150MHz 구동시 지원 가능한 최고 속도는 9.375Mbps라 한다.


FIFO(First In First Out)가 버퍼 역할을 해주기에 CPU가 통신에 대한 작업 부담을 덜 수 있다.

시리얼 부트로더 사용시 PC와 DSP간 Baud Rate가 정확히 맞아 떨어져야 한다.


고속 트랜시버가 필요한데, MAX3232의 경우 250Kbps에 불과하지만 SN75C3232와 같은 트랜시버는 1Mbps까지 지원한다.

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

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


28335는 3개의 SCI모듈을 지원하고 있고 이 셋 모두 그 형태가 같다.

또한 SCI는 LSPCLK의 클럭값을 가진다.





FIFO에 대해서는 위 그림을 보면 대충 이해가 갈것이라 본다. First In First Out 말 그대로 처음 들어온 송.수신값이 제일 우선 처리된다는 뜻으로 이해된다.



SCI-A의 레지스터이다. B,C또한 같다.

Description을 보면 그 내용 또한 명확히 알 수 있다.



SCICCR : SCI Communication Control Register




Stop Bits

0이면 1Stop Bits

1이면 2Stop Bits 

 EVEN/ODD PARITY

0 : 홀수 패리티

1 : 짝수 패리티 

PARITY ENABLE 

0 : 패리티 비트를 사용하지 않는다

1 : 패리티 비트를 사용한다 

LOOPBACK
ENA 

루프백 모드의 사용여부를 결정한다.

LoopBack Mode : 28335의 TX핀과 RX핀을 내부적으로 연결하여 TX핀으로 나가는 데이터가 다시 RX핀으로 들어오는 echo mode라고 할 수 있다. 송신 신호를 수신하여 송신값을 확인할 수 있다. 

IDLE/ADDR MODE 

0 : idle-line 모드 프로토콜 사용

1 : address-bit 모드 프로토콜 사용

idle-line 모드는 일반적인 1:1 통신 프로토콜이며 Address-bit모드 프로토콜은 한 비트를 추가한 다중 프로세서 통신 프로토콜이다. RS-232타입과는 호환되지 않고 이를 지원하는 프로세서 사이에서만 사용 가능하다. 

2-0 

SCICHAR2-0 

세 개의 비트로 0에서 7까지 선택할 수 있으며, 한 통신 패킷에 몇 개의 데이터 비트를 담을 것인지 결정한다. 0일 때 1개 비트, 7일 때 8개 비트를 담겠다는 뜻이다.(N+1) 


SCICTL1 : SCI Control Register1





 RX ERR INT ENA

통신 에러가 있을 때, SCIRXST의 7번 비트가 1로 set된다. 이 때 인터럽트의 가부를 설정한다.

1일 때 인터럽트 허용. 0일 때 허용하지 않는다

5

SW RESET 

값이 0일 때, SCI모듈의 플래그 값들을 모두 초기화 한다.

전송 속도 및 기타 다른 설정에는 영향을 미치지 않는다. 0인 동안에는 플래그 값이 초기화 된 채로 변경이 불가능하며 다시 1이 되었을 때 비로소 플래그 값이 SCI모듈의 상태에 따라 변화한다. 

3

TXWAKE 

다중 프로세서 관련. 

2

SLEEP 

다중 프로세서 관련 

1

TXENA 

송신 사용 여부를 설정한다.

SCITXEMU와 SCITXBUF로부터 데이터 출력을 차단(0)할 것인지 내보낼(1) 것인지를 결정한다. 

0

RXENA

수신 사용 여부를 설정한다.

SCIRXEMU와 SCIRXBUF로부터 데이터 입력을 차단(0)할 것인지 내보낼(1) 것인지를 결정한다. 


SCIHBAUD, SCILBAUD : 




통신속도를 정하기 위한 레지스터로 아래의 공식에 따라 결정 된다.


통신속도 = LSPCLK/[(레지스터값+1)*8]

16비트 레지스터를 사용하므로 값은 0부터 65535까지 설정 할 수 있다.


SCICTL2 : SCI Control Register2



TXRDY 

값이 1일 때, 송신버퍼(SCITXBUF)가 준비됐음을 나타내는 상태비트이다. 즉, 송신버퍼가 비어있으니 전송할 데이터를 받을 수 있다는 의미이다 

TX EMPTY 

값이 1일 때, 송신버퍼와 송신 시프트 레지스터(TXSHF)가 모두 비워져 있는 상태를 나타낸다. 

RX/BK INT ENA 

값이 1일 때, 수신 인터럽트를 허용한다. 

TX INT ENA 

값이 1일 때, 송신 인터럽트를 허용한다. 



SCIRXST : SCI Receiver Status Register




 7

 RX ERROR

수신 상태에서 에러가 있음을 알려주는 플래그.

브레이크 검출, 프레이밍 에러, 오버런 패리티 에러 중 하나 이상이 발생하면 비트가 1로 바뀐다. 

 6

RXRDY

수신 완료 플래그, 데이터 한 프레임이 모두 도착 했을 때, 이 플래그가 1로 바뀐다. 

BRKDT 

브레이크 검출 플래그. 브레이크 상황이 발생하면 이 비트가 1로 바뀐다 

FE 

프레이밍 에러 플래그 

OE 

오버런 에러 플래그 

PE 

패리터 에러 플래그 

RXWAKE 

수신 웨이크 업 검출 플래그 


SCIRXBUF : Reciver Data Buffer




 15

SCIFFFE 

FIFO모드에서 프레이밍 에러가 발생하면 1로 바뀐다. 

14 

SCIFFPE 

FIFO모드에서 패리티 에러가 발생하면 1로 바뀐다. 

7-0 

 RXDT

수신된 데이터가 저장된다. 저장이 완료 되면, SCICTL2의 RX/BK INT 플래그 비트가 1로 바뀌고, 데이터를 읽으면 플래그가 다시 0으로 클리어 된다 


SCITXBUF : SCI Transmit Data Buffer Register



SCI모듈에서 전송할 데이터를 집어 넣는 레지스터 이다. 이 레지스터에 데이터를 집어 넣으면, TXSHF레지스터를 통해 데이터가 밖으로 전송된다.


SCIRXEMU : SCI Emulation Data Buffer



에뮬레이터에 의해 SCIRXBUF레지스터를 보고자 할 때 사용된다.



SCIFFTX : SCI FIFO Registers[Transmit]



 15

SCIRST 

값이 0일 때, 수신/송신 FIFO채널을 초기화 한다. FIFO설정은 그대로 남는다.

1을 쓰면 다시 재 기능을 하게 된다. 

 14

SCIFFENA 

1을 쓰면, FIFO기능을 활성화 한다. 

13 

TXFIFO Reset

1일 때, 송신 FIFO 포인터를 초기화 하고, 그 상태를 유지한다. 0일 때, 다시 활성화 된다. 

12-8 

TXFFST4-0 

송신 FIFO에 데이터가 몇 BYTE 들어와 있는지를 표시해 준다. 

TXFFINT Flag 

TX FIFO인터럽트 상태를 나타내는 플래그 비트이다. 1이면 인터럽트가 요청된 것이다. 

TXFFINT CLR 

1을 쓰면, TXFFINT Flag를 클리어한다. 

TXFFIENA 

송신 FIFO 인터럽트의 사용 가불을 설정한다. 1이면 인터럽트를 허용한다. 

4-0 

TXFFIL4-0 

송신 FIFO에 몇 바이트가 차면 인터럽트를 발생시킬 것인지를 설정하는 레지스터이다.

즉, TXFFIL과 TXFFST의 값이 일치할 때, 인터럽트가 발생한다. 


SCIFFRX : SCI FIFO Registers[Receiver]


 15

RXFFOVF 

수신 FIFO에 16바이트가 모두 차고 1바이트가 더 전송되어 오버플로우가 일어났을 때, 1로 리셋된다. 

14 

RXFFOVR CLR 

1이면 RXFFOVF비트를 클리어 시킨다 

13 

RXFIFO Reset 

1일 때, 수신 FIFO포인터를 초기화 하고, 그 상태를 유지한다. 1일 때, 다시 활성화 된다. 

12-8 

RXFFST4-0 

수신 FIFO에 데이터가 몇 BYTE들어와 있는지를 표시해 준다. 

RXFFINT Flag 

수신 FIFO 인터럽틑 상태를 나타내는 플래그 비트이다. 1이면 인터럽트가 요청된 것이다. 

RXFFINT CLR 

1을 쓰면, RXFFINT Flag를 클리어 한다. 

RXFFIENA 

수신 FIFO 인터럽트의 사용 가불을 설정한다. 1이면 인터럽트를 허용한다. 

4-0

RXFFIL4-0 

수신 FIFO에 몇 바이트가 차면 인터럽트를 발생시킬 것인지를 설정하는 레지스터이다. 


SCIFFCT : SCI FIFO Registers[Control]




15-13

ABD,

ABD CLR,CDC 

Auto-baud detect기능을 사용하기 위한 설정으로써, 외부에서 들어오는 데이터의 전송속도를 자동으로 측정하는 기능이다.


사용방법:

1.CDC비트를 1로하고 ADBCLR에 1을써 ABD 비트를 0으로 한다.->autobaud-detect 모드 진입 

2.보레이트 레지스터(?)를 1이나 0으로 하여 보레이트를 500Kbps로 세팅한다.

3.RX핀으로 문자가 수신되게끔 한다.->내부적으로 수신되는 데이터의 보레이트를 계산하게됨

 ->ABD비트가 1로 바뀐다.

4.자동으로 보레이트 레지스터가 감지된 속도로 셋팅되고 CPU에 수신 완료 인터럽트를 요청한다

5.인터럽트에서 SCIFFCT레지스터의 ABD CLR비트를 1로 써주어 ABD비트를 0으로 클리어 해주고, CDC비트도 0으로 클리어 해주어야 한다. 마지막으로 수신 된 문자를 읽어온다.

 7-0

FFTXDLY7-0 

TX FIFO모드에서 TXSHF레지스터와 FIFOTXBUF레지스터 사이에 데이터가 복사되는 주기(딜레이)를 결정한다.

TX FIFO모드에서 사용작 SCITXBUF레지스터에 데이터를 집어 넣으면 그 데이터는 곧바로 FIFOTXBUF에 복사되고, 또 곧바로 TXSHF레지스터에 복사되는데 여기에서 FIFOTXBUF에서 TXSHF로 복사되는 주기(딜레이)를 결정하는것 

딜레이 계산 방법

딜레이 시간 = 1/(통신속도[bps])*FFTXDLY(8bit)


SCIPRI : SCI Priority Control Register


SCI통신 중에 에뮬레이터에 의해 브레이크가 걸렸을 경우, 어떻게 동작할 것인가를 결정한다.

00 : 즉시 멈춘다.

10 : 현재의 TX또는 RX동작이 끝난 후에 멈춘다.

X1 : 브레이크와 상관없이 계속 동작한다.

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

인터럽트 관련 소스  (0) 2014.08.20
2812와 달라진 28335의 주변회로  (0) 2014.08.20
Cpu Timer(2)  (0) 2014.08.19
Cpu Timer(1)  (1) 2014.08.19
ADC(2)  (0) 2014.08.18
Posted by 십자성군
TMS320/F283352014. 8. 19. 17:53

DSP2833x_CpuTimers.c, h를 분석한다.


1. InitCpuTimers()

타이머 초기화 함수로써, 우리가 이 함수를 사용할 때는 그냥 호출하면 될것이다. 영어를 읽을 수 있을테니 주석을 잘 보도록 하자.


void InitCpuTimers(void)

{

    // CPU Timer 0

    // Initialize address pointers to respective timer registers:

    CpuTimer0.RegsAddr = &CpuTimer0Regs;

    // Initialize timer period to maximum:

    CpuTimer0Regs.PRD.all  = 0xFFFFFFFF;

    // Initialize pre-scale counter to divide by 1 (SYSCLKOUT):

    CpuTimer0Regs.TPR.all  = 0;

    CpuTimer0Regs.TPRH.all = 0;

    // Make sure timer is stopped:

    CpuTimer0Regs.TCR.bit.TSS = 1;

    // Reload all counter register with period value:

    CpuTimer0Regs.TCR.bit.TRB = 1;

    // Reset interrupt counters:

    CpuTimer0.InterruptCount = 0;



// CpuTimer2 is reserved for DSP BIOS & other RTOS

// Do not use this timer if you ever plan on integrating

// DSP-BIOS or another realtime OS.


    // Initialize address pointers to respective timer registers:

    CpuTimer1.RegsAddr = &CpuTimer1Regs;

    CpuTimer2.RegsAddr = &CpuTimer2Regs;

    // Initialize timer period to maximum:

    CpuTimer1Regs.PRD.all  = 0xFFFFFFFF;

    CpuTimer2Regs.PRD.all  = 0xFFFFFFFF;

    // Make sure timers are stopped:

    CpuTimer1Regs.TCR.bit.TSS = 1;

    CpuTimer2Regs.TCR.bit.TSS = 1;

    // Reload all counter register with period value:

    CpuTimer1Regs.TCR.bit.TRB = 1;

    CpuTimer2Regs.TCR.bit.TRB = 1;

    // Reset interrupt counters:

    CpuTimer1.InterruptCount = 0;

    CpuTimer2.InterruptCount = 0;

}


Timer2에 대한 경고사항이 나와있다. BIOS, RTOS일 때는 Timer2를 사용하지 말라고 한다.

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

void ConfigCpuTimer(struct CPUTIMER_VARS *Timer, float Freq, float Period)

{

    Uint32  temp;


    // Initialize timer period:

    Timer->CPUFreqInMHz = Freq;

    Timer->PeriodInUSec = Period;

    temp = (long) (Freq * Period);

    Timer->RegsAddr->PRD.all = temp;


    // Set pre-scale counter to divide by 1 (SYSCLKOUT):

    Timer->RegsAddr->TPR.all  = 0;

    Timer->RegsAddr->TPRH.all  = 0;


    // Initialize timer control register:

    Timer->RegsAddr->TCR.bit.TSS = 1;      // 1 = Stop timer, 0 = Start/Restart Timer

    Timer->RegsAddr->TCR.bit.TRB = 1;      // 1 = reload timer

    Timer->RegsAddr->TCR.bit.SOFT = 1;

    Timer->RegsAddr->TCR.bit.FREE = 1;     // Timer Free Run

    Timer->RegsAddr->TCR.bit.TIE = 1;      // 0 = Disable/ 1 = Enable Timer Interrupt


    // Reset interrupt counter:

    Timer->InterruptCount = 0;

}

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

ConfigCpuTimer(&CpuTimer0, 150, 1000);


인수는 설정할 CpuTimer의 주소, 주파수(MHz), 주기(uSeconds)이다. 인수에 따른 설정 후 각종 레지스터를 초기화 시켜준다.

위의 경우는 초당 150*10^6회, 인터럽트는 1000us:0.001초당 한번씩 발생하도록 하였다.

두 수를 곱하면 150000으로 초당 150000회의 인터럽트가 발생하는 것이다.


주파수 부분에 아무 값이나 넣으면 안된다. 현재 설정한 SYSCLKOUT의 값을 넣어주도록 하자. 기본적으로 150MHz로 잡혀있다.

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

DSP2833x_CpuTimer.h를 보면 레지스터 및 명령 정의가 나와있다. 예를들어 아래와 같다.


// Start Timer:

#define StartCpuTimer0()   CpuTimer0Regs.TCR.bit.TSS = 0


// Stop Timer:

#define StopCpuTimer0()   CpuTimer0Regs.TCR.bit.TSS = 1


// Reload Timer With period Value:

#define ReloadCpuTimer0() CpuTimer0Regs.TCR.bit.TRB = 1


// Read 32-Bit Timer Value:

#define ReadCpuTimer0Counter() CpuTimer0Regs.TIM.all


// Read 32-Bit Period Value:

#define ReadCpuTimer0Period() CpuTimer0Regs.PRD.all


친절하게 설명이 나와있으니 사용하는데는 문제가 없다고 본다.

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

2812와 달라진 28335의 주변회로  (0) 2014.08.20
SCI  (0) 2014.08.19
Cpu Timer(1)  (1) 2014.08.19
ADC(2)  (0) 2014.08.18
ADC(1)  (0) 2014.08.18
Posted by 십자성군
TMS320/F283352014. 8. 19. 17:47

CPU Timer에 대하여 소스 및 구조차원에서 접근한다.


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


위의 내용과 함께 보충하여 설명한다.




28335는 CPU Timer 0/1/2 세 개의 모듈을 가지고 있다. 내부 구조는 모두 동일하다.

DSP에 OS를 포팅 시켜서 RTOS로 사용할 경우, CPU Timer2는 BIOS스케쥴링에 사용하게 되어 Timer0과 Timer1만을 사용할 수 있다.


CPU타이머는 PLL을 거친 SYSCLKOUT을 공급받아 돌아가게 된다. 이와 관련된 소스차원의 간략한 글을 올려놓았으니 참고하자.

동작원리를 설명한다


-TDDRH:TDDR(16bit:16bit)와 PSCH:PSC는 AVR의 프리스케일러와 같다.

-타이머가 가동되면 PSCH:PSC는 TDDRH:TDDR의 값을 그대로 복사해오고, SYSCLKOUT 한 클럭당 1씩 Down-Counting을 한다.

-Down-Counting으로 1씩 빼다가 0이 넘어가면 TIMH:TIM에 1클럭의 신호를 보낸다.

-TIMH:TIM 또한 타이머가 가동되면서 PRDH:PRD의 값을 복사해오고, 대기중에 PSCH:PSC로부터 넘어오는 한 클럭당 1씩 DOWN-Counting을 한다.

-Down-Counting에 의해 0이 넘어가는 순간 TINT에 신호를 보내고 인터럽트가 발생한다.


위를 종합하여 인터럽트 주기는

(1/SYSCLKOUT)*(TDDRH:TDDR+1)*(PRDH:PRD+1)

이 된다. (1/SYSCLKOUT)은 1클럭당 주기임을 알아두자.



레지스터 표이다.





TIMERxTCR 레지스터이다.



15 

인터럽트가 요청 됐는지의 유무를 표시해준다.

1이면 인터럽트가 요청된 것이다. 

여기에 1을 써주어 강제 클리어 할 수 있다.

14 

1을 입력하면 타이머 인터럽트를 사용할 수 있다. 

 11-10

JTAG와 같은 에뮬레이터를 사용할 때 쓰는 옵션이다.

컴파일러에서 브레이크 포인트를 걸고 실행했을 때, 브레이크 포인트를 만나면 아래와 같이 작동한다.


00 일 때 : TIMH:TIM의 바로 다음 카운팅에서 타이머가 멈춘다.

01 일 때 : TIMH:TIM이 0까지 감소한 후 타이머가 멈춘다

10or11 : 브레이크 포인트를 만나더라도 타이머는 계속 카운팅을 한다. 

 5

1만 쓸 수 있으며 1을 쓸 경우, TIM이 PRD의 값을 다시 복사해 온다. 0밖에 읽히지 않는다.

 

이게 무슨 의미를 가질까? TIM단계의 카운팅을 새로 한다는 뜻이겠지만 어떤 때 쓰이는지 모르겟다.

1을 쓰면 타이머가 멈춘다. 0을 써주면 즉시 타이머가 카운팅을 시작한다. 


다음 글에서는 소스코드 분석


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

SCI  (0) 2014.08.19
Cpu Timer(2)  (0) 2014.08.19
ADC(2)  (0) 2014.08.18
ADC(1)  (0) 2014.08.18
Gpio  (0) 2014.08.18
Posted by 십자성군
TMS3202014. 8. 19. 15:35

SysCtrl.c에 관한 글을 보았다면 알 수 있듯이 pll(Phase Lock Loop)와 HSPCLK,LSPCLK의 설정을 통해 주변회로 클럭을 설정할 수 있다.


HSPCLK를 필요로 하는 ADC나 EV를 위한 설정을 알아보자.


프로그램을 작성하기 전에 필수적으로 불러오는 함수 InitSysCtrl()을 확인해보자.


void InitSysCtrl(void)

{


   // Disable the watchdog

   DisableDog();


   // Initialize the PLL control: PLLCR and DIVSEL

   // DSP28_PLLCR and DSP28_DIVSEL are defined in DSP2833x_Examples.h

   InitPll(DSP28_PLLCR,DSP28_DIVSEL);


   // Initialize the peripheral clocks

   InitPeripheralClocks();

}


1.

InitPll(DSP28_PLLCR,DSP28_DIVSEL);


그냥 값을 넣으면 되었던 2812와는 달리 28335는 위의 DPS28_PLLCR, DPS28_DIVSEL의 값을 정해주어야 한다. 그 정의로 들어가면

#define DSP28_DIVSEL     2

#define DSP28_PLLCR   10

을 확인할 수 있다. 입력 클럭에 대한 PLL의 출력을 10배와 1/2배를 적용한다. 2812에서는 1/2배는 고정되어 있었으나 28335에서는 변경이 가능하다.


2.

InitPeripheralClocks()의 초반 부분을 보면 

SysCtrlRegs.HISPCP.all = 0x0001;

SysCtrlRegs.LOSPCP.all = 0x0002;


가 있다. SysCtrl.c에 대하여 게시한 글을 확인하면 0x0001인 상태에서는 SYSCLKOUT/2로 적용된다.


3.

클럭을 넣을 주변회로 결정

SysCtrlRegs.PCLKCR.all = 0x00FF;


위 1,2,3의 결과를 모두 적용할 경우 HISPCP = SYSCLKOUT/2 = (30(MHz)*10/2)/2 = 75MHz일 것이다.


Posted by 십자성군
TMS320/F283352014. 8. 18. 21:10

ADCMAXCPNV : Maximum Conversion Channels Register





MAX_CONVn 비트필드는 자동변환 세션에서의 최대 변환채널 수를 정해준다. 시퀀서 모드(병렬, 직렬)에 따라 사용하는 비트필드 및 작업이 다양하다.


시퀀서1에 대해서 MAX_CONV1[2:0] (0~2번)이 사용되며

시퀀서2에 대해서 MAX_CONV2[2:0] (4~6번)이 사용된다.

위 둘 모두 병렬 시퀀서의 경우가 될 것이다.


직렬 시퀀서 모드일 때, 두 시퀀서 1,2를 하나의 시퀀서처럼 사용하기 때문에 총 16개 채널을 입력으로 설정할 수 있으며 이 설정을 위해 4비트를 사용한다.





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

ADCCHSELSEQ1~4 : ADC Input Channel Select Sequecning Control Registers


DSP의 ADC가 한번의 변환주기에 여러 개의 채널에서 신호를 입력받아 한번에 처리하는데 그 처리 순서와 관련된 레지스터이다.

각각이 4비트의 레지스터를 가지며 아래의 초기화 예시를 보면 이해가 갈것이다.


AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0; // Setup conv from ADCINA0 & ADCINB0

AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x1; // Setup conv from ADCINA1 & ADCINB1

AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x2; // Setup conv from ADCINA2 & ADCINB2

AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 0x3; // Setup conv from ADCINA3 & ADCINB3

AdcRegs.ADCCHSELSEQ3.bit.CONV08 = 0x4; // Setup conv from ADCINA4 & ADCINB4

AdcRegs.ADCCHSELSEQ3.bit.CONV09 = 0x5; // Setup conv from ADCINA5 & ADCINB5

AdcRegs.ADCCHSELSEQ3.bit.CONV10 = 0x6; // Setup conv from ADCINA6 & ADCINB6

AdcRegs.ADCCHSELSEQ3.bit.CONV11 = 0x7; // Setup conv from ADCINA7 & ADCINB7


0에서 7은 ADCINA0~7을, 8~15는 ADCINB0~7 입력채널을 의미한다.


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

ADCASEQSR : Autosequence Status Register



11~8 : SEQ_CNTR [Sequencing counter status bits]

시퀀서 변환채널 카운터, SEQ_CNTR[3:0]의 비트필트는 4비트의 카운터로 변환과정 시작과 동시에 MAX CONVn레지스터(입력채널 개수 설정)의 값을 여기로 불러와 매 변환마다 1씩 감소하여 남은 변환채널 갯수를 표시한다. 병렬시퀀서 모드의 경우 시퀀서1과 2의 입력채널 개수를 더한 값을 Load한다.

6~4 : SEQ2_STATE

SEQ2인 ADCINB의 입력채널 중 어떤 채널이 변환 중인지 표시된다

3~9 : SEQ1_STATE

SEQ1인 ADCINA의 입력채널 중 어떤 채널이 변환 중인지 표시된다.


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

ADCST : ADC Status and Flag Register




read-only 상태레지스터


7 : EOS_BUF2[End of sequence buffer bit for SEQ2]

시퀀서 2의 변환완료횟수 버퍼. 인터럽트 모드0(매 변환 완료때마다 인터럽트 발생)에서는 사용되지 않으며 모드1에서 매 EOS마다 Toggle된다.

인터럽트 Flag비트의 Clear나 시퀀서의 리셋에 의해서 Clear되지 않으며 오직 칩의 리셋 과정에서 Clear된다.


6 : EOS_BUF1[End of sequence buffer bit for SEQ1]

시퀀서 1 변환완료 횟수 버퍼. 위와 같다


5 : INT_SEQ2_CLR[Interrupt clear bit]

1을 쓰면 INT_SEQ2비트를 클리어 한다.

인터럽트 서비스 루틴 마지막에는 항상 INT_SEQ2비트를 클리어 해주는 코드가 있어야 한다.


4 : INT_SEQ1_CLR[Interrupt clear bit]

1을 쓰면 INT_SEQ1비트를 클리어 한다.

인터럽트 서비스 루틴 마지막에는 항상 INT_SEQ1비트를 클리어 해주는 코드가 있어야 한다.


3 : SEQ2_BSY[SEQ2 busy status bit]

1이면 시퀀스2의 입력채널이 변환중임을 뜻한다.


2 : SEQ1_BSY[SEQ1 busy status bit]

1이면 시퀀스1의 입력채널이 변환중임을 뜻한다.


1 : INT_SEQ2[SEQ2 interrupt flag bit]

시퀀서2의 인터럽트 요청 플래그 비트


0 : INT_SEQ1[SEQ1 interrupt flag bit]

시퀀서1의 인터럽트 요청 플래그 비트


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

ADCREFSEL[ADC Reference Select Register]


내부 레퍼런스 전압 설정 레지스터




15~14

00일 때, 내부 레퍼런스 전압을 사용한다 

 

01일 때, 외부의 2.048V를 ADCREFIN핀을 통해서 레퍼런스 전압으로 사용한다 

 

10일 때, 외부의 1.500V를 ADCREFIN핀을 통해서 레퍼런스 전압으로 사용한다 

 

11일 때,  외부의 1.024V를 ADCREFIN핀을 통해서 레퍼런스 전압으로 사용한다


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

ADCOFFTRIM[ADC Offset Trim Register]




DSP초기화 함수에서 선행 함수인 InitSysCtrl()함수 안에 InitPeripheralClock()이라는 함수가 있다.

이 함수 안의 ADC_cal()이라는 함수에서 사용되는 레지스터로 ADC_cal()함수는 ADC의 INL,DNL,Gain,Offset오차 중 Gain과 Offset오차를 교정하기 위해서 사용한다. 과정은 아래와 같다.



1. GND와 연결되어 있는 ADCLO핀을 20번 AD변환을 한다.

2. AD변환 값이 0이 나오지 않을 때까지 OFFTRIM에 십진수 40을 계속 더한다.

3. AD변환 값이 0이 나오지 않으면 AD변환 값들의 평균치를 계산한다.

4. ADCOFFTRIM에 평균치를 빼고 OFFTRIM에 저장되어 실제 offset에러 값이 저장되게 된다.

5. ADC결과값에 ADCOFFTRIM레지스터에 있는 값을 뺀다.

6. 교정된 ADC결과값이 저장된다.


ADCLO는 AGND와 직결되어 있으므로 0V이다. 즉, 0V를 ADC하여 오차를 잡는 작업이다.


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

ADCRESULT


16개의 12비트 결과 저장 레지스터.

개당 두 개의 주소를 가지며 0x7108~0x7117에는 왼쪽 정렬되어 저장

0ㅌ0B00~0x0B0F에는 오른쪽 정렬되어 저장




결과 저장 레지스터의 저장 규칙이 있는데

1. 순차샘플링 & 직렬시퀀서 모드

:무조건 먼저 ADC변환된 순서대로 ADCRESULT0부터 차례대로 채워진다.

2. 순차샘플링 & 병렬시퀀서 모드

:시퀀서1은 변환된 순서대로 ADCRESULT0부터 차례대로

:시퀀서2는 먼저 변환된 순서대로 ADCRESULT8부터 차례대로 저장

3. 동시샘플링 모드

:최대 8번 변환을 하며 한번에 두 채널씩 변환을 한다(시퀀서1 1회, 시퀀서2 1회)

ADCRESULT0부터 채워지며 시퀀서1의 결과가 2의 결과보다 먼저 채워진다.

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

Cpu Timer(2)  (0) 2014.08.19
Cpu Timer(1)  (1) 2014.08.19
ADC(1)  (0) 2014.08.18
Gpio  (0) 2014.08.18
기본자료  (0) 2014.08.18
Posted by 십자성군
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 십자성군
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 십자성군