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

  1. 2014.07.23 [초기화3] Init_EVA(), Init_EVB()
  2. 2014.07.23 [초기화2] Init_GPIO()
  3. 2014.07.23 [초기화1] DSP_Init()
  4. 2014.07.23 들어가면서
  5. 2014.07.23 [2812]부트모드 선택
  6. 2014.07.22 [28346]부트와 간단한 예제
  7. 2014.07.21 [28346]작업환경 구성하기
  8. 2014.07.18 CMD파일
  9. 2014.07.17 rts2800_xxx.lib
  10. 2014.07.17 GlobalVariableDefs.c
Project/Balancing Robot2014. 7. 23. 14:50

void Init_EVA()
{


 // PWM Operation
 // Setup TxPR according to the desired PWM(carrier) period
 // Setup TxCON to specify the counting mode and clock source, and start the operation
 // Load TxCMPR with values corresponding to the on-line calculated widths (duty cycles) of PWM pulses
 // GP Timer counting operation은 4가지가 있다 SPRU065의 1.4.17 참조
 // stop/hold mode, 연속 업 카운팅 모드, 방향성 업 다운 카운팅 모드, 연속 업 다운 카운팅 모드
 // 아래는 연속 업 카운팅 모드를 사용하여 비대칭 PWM을 생성한다.

 

 EvaRegs.T1PR = 1500 ; //75kHz

 EvaRegs.T2PR = 0xffff ;

:GP Timer Period Register

 EvaRegs.T1CMPR = 0x7fff ;

 EvaRegs.T2CMPR = 0xffff ;

:GP Timer Compare Register


 EvaRegs.CMPR1 = 0x0000 ;
 EvaRegs.CMPR2 = 0x0000 ;
 EvaRegs.CMPR3 = 0x0000 ;

:Compare Register

 

 EvaRegs.T2CNT = 0x0000 ;
 EvaRegs.T1CNT = 0x0000 ;

:GP Timer Counter Register


 EvaRegs.T1CON.bit.TMODE = 0x02 ; // 연속 업 카운트
 EvaRegs.T1CON.bit.TPS = 0x00 ;   // HSPCLK / 1
 EvaRegs.T1CON.bit.TENABLE = 0x00 ; // T1 동작 정?
 EvaRegs.T1CON.bit.TCLKS10 = 0x00 ; // 내부클럭 HSPCLK사용
 EvaRegs.T1CON.bit.TCLD10 = 0x00 ; // Timer compare register reload시점을 counter이 0일때 갱신
 EvaRegs.T1CON.bit.TECMPR = 0x01 ; // Timer compare enable

:GP Timer1 Control Register.

 

 EvaRegs.T2CON.bit.TMODE = 0x03 ;
 EvaRegs.T2CON.bit.TPS = 0x00 ;
 EvaRegs.T2CON.bit.T2SWT1 = 0x00 ; // Timer2의 동작의 start/stop Timer1의 TENABLE에 따름
 EvaRegs.T2CON.bit.TCLKS10 = 0x03 ;  // QEP
 EvaRegs.T2CON.bit.TCLD10 = 0x00 ;
 EvaRegs.T2CON.bit.TECMPR = 0x01 ;
 EvaRegs.T2CON.bit.SET1PR = 0x00 ; // Timer2?period를 Timer1의 것을 사용
 EvaRegs.T2CON.bit.TENABLE = 0x01 ;

 

 EvaRegs.EVAIFRA.all = 0x0000 ;

:Interrupt Flag Register A
 EvaRegs.EVAIMRA.bit.PDPINTA = 0 ;

:Interrupt Mask Register A

 

 EvaRegs.GPTCONA.bit.T2CTRIPE = 0x00 ; // T2CTRIP disable
 EvaRegs.GPTCONA.bit.T1CTRIPE = 0x00 ; // T1CTRIP disable

 // T2CTRIP, T1CTRIP가 enable 되어 있을경우 PWM 출력중 TxCTRIP핀이 low가 되면
 // 해당 PWM 출력핀의 출력이 Hi-Z가 된다.
 EvaRegs.GPTCONA.bit.T2TOADC = 0x00 ; // ADC 이벤트 사용안함
 EvaRegs.GPTCONA.bit.T1TOADC = 0x00 ;
 // Timerx의 underflow, period match, compare match시 ADC의 start trigger로 사용할수 있음
 EvaRegs.GPTCONA.bit.TCMPOE = 0x01 ;  // TxPWM_TxCMP 출력 사용
 EvaRegs.GPTCONA.bit.T2CMPOE = 0x01 ;
 EvaRegs.GPTCONA.bit.T1CMPOE = 0x01 ;
 // reserved (EXTCONA bit 0 참조)
 EvaRegs.GPTCONA.bit.T2PIN = 0x02 ; // Active High
 EvaRegs.GPTCONA.bit.T1PIN = 0x01 ; // Active Low
 // Compare match가 발생했을때 Active High(Low -> High 로 천이)
 // Active Low는 High->Low로 천이
 // Forced Low(High)는 강제로 선택된 Low(High)로 유지

:GP Timer Control Register A

 

 EvaRegs.COMCONA.bit.CENABLE = 0x01 ; // Full Compare logic 사용
 EvaRegs.COMCONA.bit.CLD = 0x00 ;
 EvaRegs.COMCONA.bit.SVENABLE = 0x00 ;
 EvaRegs.COMCONA.bit.ACTRLD = 0x00 ;
 EvaRegs.COMCONA.bit.FCOMPOE = 0x01 ;  // PWM 1/2/3/4/5/6 출력 사용
 EvaRegs.COMCONA.bit.FCMP3OE = 0x00 ;
 EvaRegs.COMCONA.bit.FCMP2OE = 0x00 ;
 EvaRegs.COMCONA.bit.FCMP1OE = 0x00 ;

:Compare Control Register
 // reserved (EXTCONA bit 0 참조)

/*
 EvaRegs.ACTRA.bit.CMP6ACT = 0x01 ;
 EvaRegs.ACTRA.bit.CMP5ACT = 0x01 ;
 EvaRegs.ACTRA.bit.CMP4ACT = 0x01 ;
 EvaRegs.ACTRA.bit.CMP3ACT = 0x01 ;
 EvaRegs.ACTRA.bit.CMP2ACT = 0x01 ;
 EvaRegs.ACTRA.bit.CMP1ACT = 0x01 ;
 // PWM1 - 6 = Active Low
*/


 EvaRegs.ACTRA.all = 0x0555 ;
 // *****************************************************
 // ACTRA Register은 bit단위로 설정을 하면 동작하지 않음.
 // *****************************************************

:Compare Action Control Register

 

 EvaRegs.CAPCONA.bit.CAPRES = 0 ;

:Capture Control Register
 asm(" RPT #12 || nop ") ;   // Reset는 3 ADC_CLK 지연이 발생한다.

 

 EvaRegs.DBTCONA.bit.DBT = 0x08 ; // Dadeband 8 * (x/8) clock
 EvaRegs.DBTCONA.bit.EDBT3 = 0x00 ;
 EvaRegs.DBTCONA.bit.EDBT2 = 0x00 ;
 EvaRegs.DBTCONA.bit.EDBT1 = 0x00 ;
 // Dadeband enable
 EvaRegs.DBTCONA.bit.DBTPS = 0x03 ; // Dadebank timer x/8

:Dead-Band Timer Control Register A

 

 EvaRegs.EXTCONA.bit.EVSOCE = 0x00 ; // EVSOC output disable
 EvaRegs.EXTCONA.bit.QEPIE = 0x00 ; // 코더 입력용 QEP index disable
 EvaRegs.EXTCONA.bit.QEPIQUAL = 0x00 ; // Qualification mode disable
 EvaRegs.EXTCONA.bit.INDCOE = 0x00 ; // compare output mode 개별설정 disable

:GP Extension Control Register A

 

 EvaRegs.T1CON.bit.TENABLE = 0x01 ; // Timer1 and 2 start


}

 

void Init_EVB()
{


 // PWM Operation
 // Setup TxPR according to the desired PWM(carrier) period
 // Setup TxCON to specify the counting mode and clock source, and start the operation
 // Load TxCMPR with values corresponding to the on-line calculated widths (duty cycles) of PWM pulses
 // GP Timer counting operation은 4가지가 있다 SPRU065의 1.4.17 참조
 // stop/hold mode, 연속 업 카운팅 모드, 방향성 업 다운 카운팅 모드, 연속 업 다운 카운팅 모드
 // 아래는 연속 업 카운팅 모드를 사용하여 비대칭 PWM을 생성한다.

 

 EvbRegs.T3PR = 1500 ; // 75MHz / 3000 = 25KHz
 EvbRegs.T4PR = 0xffff ;
 EvbRegs.T3CMPR = 0x7fff ;
 EvbRegs.T4CMPR = 0xffff ;
 EvbRegs.T3CNT = 0x0000 ;
 EvbRegs.T4CNT = 0x0000 ;
 EvbRegs.CMPR4 = 0 ;
 EvbRegs.CMPR5 = 0 ;
 EvbRegs.CMPR6 = 0x7fff ;

 

 EvbRegs.T3CON.bit.TMODE = 0x02 ; // 연속 ?카운트
 EvbRegs.T3CON.bit.TPS = 0x00 ;   // HSPCLK / 128 = 585937.5Hz
 EvbRegs.T3CON.bit.TENABLE = 0x00 ; // T1 동작 정지
 EvbRegs.T3CON.bit.TCLKS10 = 0x00 ; // 내부클럭 HSPCLK사?
 EvbRegs.T3CON.bit.TCLD10 = 0x00 ; // Timer compare register reload시점을 counter이 0일때 갱신
 EvbRegs.T3CON.bit.TECMPR = 0x01 ; // Timer compare disable

 

 EvbRegs.T4CON.bit.TMODE = 0x03 ;
 EvbRegs.T4CON.bit.TPS = 0x00 ;
 EvbRegs.T4CON.bit.T4SWT3 = 0x00 ; // Timer2의 동작의 start/stop을 Timer1의 TENABLE에 따름
 EvbRegs.T4CON.bit.TCLKS10 = 0x03 ;
 EvbRegs.T4CON.bit.TCLD10 = 0x00 ;
 EvbRegs.T4CON.bit.TECMPR = 0x01 ;
 EvbRegs.T4CON.bit.SET3PR = 0x00 ; // Timer2의 period를 Timer1의 것을 사용
 EvbRegs.T4CON.bit.TENABLE = 0x01 ;

 

 EvbRegs.EVBIFRA.all = 0x0000 ;
 EvbRegs.EVBIMRA.bit.PDPINTB = 0 ;

 

 EvbRegs.GPTCONB.bit.T4CTRIPE = 0x00 ; // T2CTRIP disable
 EvbRegs.GPTCONB.bit.T3CTRIPE = 0x00 ; // T1CTRIP disable
 // T2CTRIP, T1CTRIP가 enable 되어 있을경우 PWM 력?TxCTRIP핀이 low가 되면
 // 당 PWM 출력핀의 출력이 Hi-Z가 된다.
 EvbRegs.GPTCONB.bit.T4TOADC = 0x00 ; // ADC 이벤트 사용안함
 EvbRegs.GPTCONB.bit.T3TOADC = 0x00 ;
 // Timerx의 underflow, period match, compare match시 ADC의 start trigger로 사용할수 있음
 EvbRegs.GPTCONB.bit.TCMPOE = 0x01 ;  // TxPWM_TxCMP ?사용
 EvbRegs.GPTCONB.bit.T4CMPOE = 0x01 ;
 EvbRegs.GPTCONB.bit.T3CMPOE = 0x01 ;
 // reserved (EXTCONA bit 0 참조)
 EvbRegs.GPTCONB.bit.T4PIN = 0x02 ; // Active High
 EvbRegs.GPTCONB.bit.T3PIN = 0x01 ; // Active Low
 // Compare match가 발생했을때 Active High(Low -> High 로 천이)
 // Active Low는 High->Low로 천?
 // Forced Low(High)는 강제로 선택된 Low(High)로 유지

 

 EvbRegs.COMCONB.bit.CENABLE = 0x01 ; // Full Compare logic nonuse
 EvbRegs.COMCONB.bit.CLD = 0x00 ;
 EvbRegs.COMCONB.bit.SVENABLE = 0x00 ;
 EvbRegs.COMCONB.bit.ACTRLD = 0x00 ;
 EvbRegs.COMCONB.bit.FCOMPOE = 0x01 ;
 EvbRegs.COMCONB.bit.FCMP6OE = 0x00 ;
 EvbRegs.COMCONB.bit.FCMP5OE = 0x00 ;
 EvbRegs.COMCONB.bit.FCMP4OE = 0x00 ;
 // reserved (EXTCONA bit 0 참조)

/*
 EvaRegs.ACTRA.bit.CMP6ACT = 0x01 ;
 EvaRegs.ACTRA.bit.CMP5ACT = 0x01 ;
 EvaRegs.ACTRA.bit.CMP4ACT = 0x01 ;
 EvaRegs.ACTRA.bit.CMP3ACT = 0x01 ;
 EvaRegs.ACTRA.bit.CMP2ACT = 0x01 ;
 EvaRegs.ACTRA.bit.CMP1ACT = 0x01 ;
 // PWM1 - 6 = Active Low
*/
 EvbRegs.ACTRB.all = 0x0555 ;


 // *****************************************************
 // ACTRA Register은 bit단위로 설정을 하면 동작하지 않음.
 // *****************************************************

 EvbRegs.DBTCONB.bit.DBT = 0x08 ; // Dadeband 8 * (x/8) clock
 EvbRegs.DBTCONB.bit.EDBT3 = 0x00 ;
 EvbRegs.DBTCONB.bit.EDBT2 = 0x00 ;
 EvbRegs.DBTCONB.bit.EDBT1 = 0x00 ;
 // Dadeband enable
 EvbRegs.DBTCONB.bit.DBTPS = 0x03 ; // Dadebank timer x/8

 

 EvbRegs.EXTCONB.bit.EVSOCE = 0x00 ; // EVSOC output disable
 EvbRegs.EXTCONB.bit.QEPIE = 0x00 ; // 엔코더 입력?QEP index disable
 EvbRegs.EXTCONB.bit.QEPIQUAL = 0x00 ; // Qualification mode disable
 EvbRegs.EXTCONB.bit.INDCOE = 0x00 ; // compare output mode 개별설정 disable

 

 EvbRegs.T3CON.bit.TENABLE = 0x01 ; // Timer1 and 2 start


}

 

----------------------------------------------------------------------------------------------------------

DataSheet의 58p,

4.2 Event Manager Modules(EVA, EVB)를 참고한다

 

 

위의 표에서 알 수 있듯이 EMM은 아래와 같은 항목을 포함한다

- GP(general-purpose) timer

- Full-compare/PWM units

- Capture units

- Quadrature-encoder pulse circuits

 

EVA, EVB, compare units, capture units 는 독립적으로 동작한다.

 

EVA의 레지스터는 아래와 같다.

 

 

아래는 function block 이다

 

 

----------------------------------------------------------------------------------------------------------

<코드분석과 설명>

GPx x=1,2는 EVA에 대한 것이며, x=3,4는 EVB에 대한 것이다.

참고문서를 올려놓는다. 출처는 Texas Instrument 이다.

Even manager reference.pdf

 

152페이지의 방대한 분량은 다루지 못하고, 의미하는바만 작성하도록 한다.

 

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

[초기화5] Init_SPI()  (0) 2014.07.23
[초기화4] Init_SCIA(), Init_SCIB()  (0) 2014.07.23
[초기화2] Init_GPIO()  (0) 2014.07.23
[초기화1] DSP_Init()  (0) 2014.07.23
들어가면서  (0) 2014.07.23
Posted by 십자성군
Project/Balancing Robot2014. 7. 23. 14:48

void Init_GPIO()
{


 EALLOW ;


 // GPIO MUX Set
 GpioMuxRegs.GPAMUX.all = 0x0000 ;
 GpioMuxRegs.GPAMUX.bit.PWM1_GPIOA0 = 1 ;    // PWM
 GpioMuxRegs.GPAMUX.bit.CAP1Q1_GPIOA8 = 1 ;  // QEP
 GpioMuxRegs.GPAMUX.bit.CAP2Q2_GPIOA9 = 1 ;  // QEP

 

 GpioMuxRegs.GPBMUX.all = 0x0000 ;
 GpioMuxRegs.GPBMUX.bit.PWM7_GPIOB0 = 1 ;    // PWM
// GpioMuxRegs.GPBMUX.bit.PWM8_GPIOB1=1
// GpioMuxRegs.GPBMUX.bit.PWM9_GPIOB2 = 1 ;    // PWM

 GpioMuxRegs.GPBMUX.bit.CAP4Q1_GPIOB8 = 1 ;  // QEP
 GpioMuxRegs.GPBMUX.bit.CAP5Q2_GPIOB9 = 1 ;  // QEP

 

 GpioMuxRegs.GPDMUX.all = 0x0000 ;


 GpioMuxRegs.GPEMUX.all = 0x0000 ;
 GpioMuxRegs.GPEMUX.bit.XINT1_XBIO_GPIOE0 = 1 ;
 GpioMuxRegs.GPEQUAL.bit.QUALPRD = 0xff ;

 

 GpioMuxRegs.GPFMUX.all = 0x0000 ;
 GpioMuxRegs.GPFMUX.bit.SCIRXDA_GPIOF5 = 1 ; // Serial RX_A
 GpioMuxRegs.GPFMUX.bit.SCITXDA_GPIOF4 = 1 ; // Serial TX_A

 

 GpioMuxRegs.GPGMUX.all = 0x0000 ;
 GpioMuxRegs.GPGMUX.bit.SCIRXDB_GPIOG5 = 1 ; // Serial Rx_B
 GpioMuxRegs.GPGMUX.bit.SCITXDB_GPIOG4 = 1 ; // Serial TX_B

 

 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 ;


}

 

---------------------------------------------------------------------------------------------------------

<GPIO Mux Register>

용도 : 핀들의 기능(작동)을 선택하기 위해서

각각이 Digital I/O 로써 동작하거나 Peripheral I/P 신호에 접속될 수 있다.

Digital I/O 모드로 선택될 경우, 핀의  방향성을 설정할 수 있고(GPxDIR registers) 입력신호의 노이즈를 없애도록 해줄 수 있다(GPxQUAL register)    ???

 

 

 

핀맵을 참고하자

 

 

 

---------------------------------------------------------------------------------------------------------

<설명>

그렇구나 하고 대충 훓어보기 바란다.

 

MUX Register에 대한 구조체부터 살펴보면

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];
};

 

위와같이 A,B,D,E,F,G에 대한 구조를 확인 할 수 있다. 각각 MUX와 DIR 이 있고 A,B,D,E에는 QUAL 레지스터도 있다.

 

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

 

GPIOA의 MUX 레지스터 구조이고

 

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  
        
};

 

GPIOA의 비트구조이다

 

작성한 소스코드를 다시 보면

 

 // GPIO MUX Set


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

 

:핀맵과 함게 보면 CN9200의 A0, A8, A9의 기능을 알 수 있다. 처음에는 all=0x0000으로 모두 비활성화 시킨 후 A에서 사용하는 기능만을 활성화 시켰다.

 

 GpioMuxRegs.GPBMUX.all = 0x0000 ;
 GpioMuxRegs.GPBMUX.bit.PWM7_GPIOB0 = 1 ;    // PWM
// GpioMuxRegs.GPBMUX.bit.PWM8_GPIOB1=1
// GpioMuxRegs.GPBMUX.bit.PWM9_GPIOB2 = 1 ;    // PWM

 GpioMuxRegs.GPBMUX.bit.CAP4Q1_GPIOB8 = 1 ;  // QEP
 GpioMuxRegs.GPBMUX.bit.CAP5Q2_GPIOB9 = 1 ;  // QEP

 

 GpioMuxRegs.GPDMUX.all = 0x0000 ;


 GpioMuxRegs.GPEMUX.all = 0x0000 ;
 GpioMuxRegs.GPEMUX.bit.XINT1_XBIO_GPIOE0 = 1 ;
 GpioMuxRegs.GPEQUAL.bit.QUALPRD = 0xff ;

 

 GpioMuxRegs.GPFMUX.all = 0x0000 ;
 GpioMuxRegs.GPFMUX.bit.SCIRXDA_GPIOF5 = 1 ; // Serial RX_A
 GpioMuxRegs.GPFMUX.bit.SCITXDA_GPIOF4 = 1 ; // Serial TX_A

 

 GpioMuxRegs.GPGMUX.all = 0x0000 ;
 GpioMuxRegs.GPGMUX.bit.SCIRXDB_GPIOG5 = 1 ; // Serial Rx_B
 GpioMuxRegs.GPGMUX.bit.SCITXDB_GPIOG4 = 1 ; // Serial TX_B

 

 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 ;

 

Digital Input Output 용도로 사용할 때는 DIR로 조절한다.

GPAQUAL.all = 0x05로 0b0000000000000101일 것이고 즉, GPA0, GPA2에 대해서 잡아준 것일 것이다.

위 코드에서 A0를 PWM, A2를 컨트롤 주기 확인용으로 쓴다는데, 자세한 사항은 추후에 수정하겠다.

 

// 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 ;

 

현재 시스템에서 F5는 SCI RX A로 사용중이고 A4는 어떠한 용도의 스위치로 사용하고 있다.

G4및 G5는 SCI B의 RX 및 TX로써 사용중이다.

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

[초기화5] Init_SPI()  (0) 2014.07.23
[초기화4] Init_SCIA(), Init_SCIB()  (0) 2014.07.23
[초기화3] Init_EVA(), Init_EVB()  (0) 2014.07.23
[초기화1] DSP_Init()  (0) 2014.07.23
들어가면서  (0) 2014.07.23
Posted by 십자성군
Project/Balancing Robot2014. 7. 23. 13:40

void DSP_Init()
{

 InitSysCtrl();

 Init_GPIO() ;

 

 DINT;

 

 InitPieCtrl();

 

 IER = 0x0000;
 IFR = 0x0000;

 

 InitPieVectTable();

 

 EALLOW;

 

 PieVectTable.TINT0 = &cpu_timer0_isr;

 PieVectTable.RXAINT = &RXA_ISR ;
 PieVectTable.RXBINT = &RXB_ISR ;
 PieVectTable.TXBINT = &TXB_ISR ;

 

 EDIS;

 

 Init_Timer0() ;

 Init_EVA() ;
 Init_EVB() ;
 Init_SCIA() ;
 Init_SCIB() ;
 Init_SPI() ;
 Init_ADC() ;

 

 PieCtrlRegs.PIECRTL.bit.ENPIE = 1 ;
 PieCtrlRegs.PIEIER9.bit.INTx1 = 1 ;
 PieCtrlRegs.PIEIER9.bit.INTx3 = 1 ;
 PieCtrlRegs.PIEIER9.bit.INTx4 = 1 ;
 PieCtrlRegs.PIEIER1.bit.INTx4 = 1 ;
 PieCtrlRegs.PIEIER1.bit.INTx6 = 1 ;
 PieCtrlRegs.PIEIER1.bit.INTx7 = 1 ;

 

 IER |= M_INT1;
 IER |= M_INT9 ;

 

 EINT; 
 ERTM;

}

 

<명령>

DINT : 전역 인터럽트 해제

EINT : 전역 인터럽트 가동

ERTM : 리얼타임 전역 인터럽트 가동

EALLOW : MRR 보호영역 해제

EDIS : MRR 보호

 

InitSysCtrl() : 시스템 설정

GpioCtrlRegs : GPIO컨트롤 레지스터

PieVectTable

PieCtrlRegs

----------------------------------------------------------------------------------------------------------

<설명1>

 

1.InitSysCtrl()

DSP281x_SysCtrl 헤더 및 C파일에 있는 함수로써 내용은 아래와 같다.

 

void InitSysCtrl(void)
{
   // Disable the watchdog
   DisableDog();

   // Initialize the PLLCR to 0xA
   InitPll(0xA);

   // Initialize the peripheral clocks
   InitPeripheralClocks();
}

 

와치독을 정지시키고 PLLCR을 초기화, peripheral clocks를 초기화 시킨다. 자세한 의미는 필요할 때 다시 알아보자.

 

----------------------------------------------------------------------------------------------------------

<설명2>

GpioCtrlRegs

 

PieVectTable

PieCtrlRegs

 

 PIE(Peripheral Interrupt Expansion) : 퍼리퍼럴 인터럽트 확장

 

위에서 보면 PIE vector table은 EALLOW에 의해서 보호되고 있다. 따라서 벡터테이블을 수정하려면 EALLOW를 사용하여 보호를 해제한 후 수정하고 다시 보호해준다. 수정내용을 살펴보면

 

 PieVectTable.TINT0 = &cpu_timer0_isr;

 PieVectTable.RXAINT = &RXA_ISR ;
 PieVectTable.RXBINT = &RXB_ISR ;
 PieVectTable.TXBINT = &TXB_ISR ;

 

나중에 나오겠지만 cpu_timer0_isr, RXA_SIR 등등은 사용자가 만들어 놓은 함수이다. 타이머 관련 함수 및 SCIA와 SCIB와 관련된 통신함수이다. 즉 이 함수에 대한 인터럽트 설정으로 보인다. 자세한 내용은 차후 확인한 후 수정한다.

 

이후 각종 초기화 함수들을 실행한 후 아래와 같이 입력하였다.

 PieCtrlRegs.PIECRTL.bit.ENPIE = 1 ;
 PieCtrlRegs.PIEIER9.bit.INTx1 = 1 ;
 PieCtrlRegs.PIEIER9.bit.INTx3 = 1 ;
 PieCtrlRegs.PIEIER9.bit.INTx4 = 1 ;
 PieCtrlRegs.PIEIER1.bit.INTx4 = 1 ;
 PieCtrlRegs.PIEIER1.bit.INTx6 = 1 ;
 PieCtrlRegs.PIEIER1.bit.INTx7 = 1 ;

INTx1,x3,x4는 각각 SCI A RX와 B RX, B TX를 Enable 시킨것이다

x6 및 x7은 각각 ADC 및 Timer를 Enable 시킨것이다.

자세한 내용은 차후 확인한 후 수정한다.

 

아래는 PIE관련 표와 그림이다.

 

 

 IER |= M_INT1;
 IER |= M_INT9 ;

 

위를 통해 CPU Intterupt1과 9를 Enable 시켰다.

----------------------------------------------------------------------------------------------------------

<나머지 주석처리했던 내용>

 

PieVectTable.TXAINT = &TXA_ISR ;
PieVectTable.XINT1 = &Xint1_isr ;
PieVectTable.ADCINT = &adc_isr;

 

Init_XINT() ;

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

[초기화5] Init_SPI()  (0) 2014.07.23
[초기화4] Init_SCIA(), Init_SCIB()  (0) 2014.07.23
[초기화3] Init_EVA(), Init_EVB()  (0) 2014.07.23
[초기화2] Init_GPIO()  (0) 2014.07.23
들어가면서  (0) 2014.07.23
Posted by 십자성군
Project/Balancing Robot2014. 7. 23. 13:34

완성된 시스템에 대한 소스해석을 하면서 동시에 2812를 공부한다

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

[초기화5] Init_SPI()  (0) 2014.07.23
[초기화4] Init_SCIA(), Init_SCIB()  (0) 2014.07.23
[초기화3] Init_EVA(), Init_EVB()  (0) 2014.07.23
[초기화2] Init_GPIO()  (0) 2014.07.23
[초기화1] DSP_Init()  (0) 2014.07.23
Posted by 십자성군
TMS320/Study2014. 7. 23. 12:02

메뉴얼 첨부함

 

Datasheet_F2812_BUS_M_V220.pdf

 

 

 

 

 

open되어있는 곳은 저항으로 연결되어 있지 않으므로 전압이 인가되지 않으므로 풀다운 되어 0이라고 보면 된다. 반대로 4.7k 저항이 연결되어 있는 부분은 3.3v로 풀업되어 1이라고 본다.  Flash/Rom에 라이팅 하고 싶다면 위의 표를 보고 풀업/다운 시켜주면 되겠다.

그런데 x는 뭐지?

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

[이론]풀-업 저항과 풀-다운 저항  (0) 2014.07.27
5V TTL 레벨의 신호를 +3.3V형의 DSP에 접속하는 방법  (0) 2014.07.25
[28346]부트와 간단한 예제  (0) 2014.07.22
[28346]작업환경 구성하기  (0) 2014.07.21
CMD파일  (0) 2014.07.18
Posted by 십자성군
TMS320/Study2014. 7. 22. 11:26

3개의 pdf를 올립니다. 기본적인 설명이 있으니 한번쯤 읽어보기를 추천

 

 

Delfino_EVM용_처음시작하기_프로젝트만들기(28346).pdf

 

TMS320C28346_HEX유틸리티_사용법.pdf

 

Datasheet_TMS320C28346_Value_M_V100.pdf

 

외장 플래시 프로그래머 설명서.pdf

 

 

그럼 간단하게 문서를 읽으면서 시작하자.

■우선 모듈 기본 설명서부터 보면 '입력전압 허용범위'는 4.0V ~ 5.0V 이다. 초과할 경우 제품손상이 우려되므로 주의하자

 

■JTAG의 전압은 기본적으로 5V로 설정되어 있으나 에뮬레이터에 따라 3.3V로 바꿔주어야 하기도 한다.

 

■부트모드 설정[SARAM, Stand Alone]

아래는 TMS320C28346의 부트모드 종류이다.

 

 

SARAM 메모리는 휘발성이기 때문에 MCU의 전원이 꺼지면 메모리가 리셋된다(지워진다.)

플래시 메모리는 비휘발성으로 메모리의 한계는 있지만 전원이 꺼져도 데이터가 유지된다.

비휘발성 메모리에 데이터를 써놓으면 디버깅 없이도 전원만 공급하면 저장한 코드에 의해 칩이 독립적으로 동작할 수 있는데 이를 'Stand-alone'상태라 한다. 그러나 TMS320C28346 보급형 모듈은 내부플래시 메모리가 없기 때문에 외부플래시메모리를 사용하여야 한다. 이는 DSP칩과 SPI통신으로 연결되어 있으며 SPI-A 부트모드로 구동할 수 있다.

 

 

 

--

커넥트 핀에 대한것은 추후에 하고 간단하게 LED예제를 해보자. 싱크웍스에서 외장 플래시 프로그램에 대한 예제를 받아서 실습한다.

 

플래시라이팅 과정은 다음과 같다.

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

5V TTL 레벨의 신호를 +3.3V형의 DSP에 접속하는 방법  (0) 2014.07.25
[2812]부트모드 선택  (0) 2014.07.23
[28346]작업환경 구성하기  (0) 2014.07.21
CMD파일  (0) 2014.07.18
rts2800_xxx.lib  (0) 2014.07.17
Posted by 십자성군
TMS320/Study2014. 7. 21. 21:06

 사정이 생겨서 2812, 28346을 동시에 다루게 되었다.

어차피 CCS의 작업환경 구성하는것이야 다 똑같으니 참고가 되었으면 한다.

 

 

 1.CCS Project 생성

 

 

 

28346을 사용하는 상황이며 에뮬레이터를 XDS100을 쓰고있다.

 

2.Linked Resources

필수사항은 아니지만 한번 확인하자. 다음과 같다.

 

간단하게 접근할 수 있도록 몇가지 경로에 이름이 붙여져 있다.

 

 

3.기본 소스(DSP2834x_common,header)첨부

syncworks 홈페이지에서 구할 수 있는 DSP 메모리, 함수 관련 자료를 받아 프로젝트에 첨부해야한다.

헤더파일을 인식할 수 있게 해주자.

 

방법은 2가지다

1.폴더째로 프로젝트 폴더에 넣는다.

2.아래와 같이 경로를 설정하여준다.

 

 

5.라이브러리 패스 설정

위와 거의 같은 맥락이다.

 

 

 

주의!

:두가지 방법을 동시에 하면 충돌이 발생하여 에러가 생긴다. #10053인지 #10056인지와 #10010이 동시 발생

 

END

 

추가: 위의 header와 common

BOOT_EXM_V500.zip

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

[2812]부트모드 선택  (0) 2014.07.23
[28346]부트와 간단한 예제  (0) 2014.07.22
CMD파일  (0) 2014.07.18
rts2800_xxx.lib  (0) 2014.07.17
GlobalVariableDefs.c  (0) 2014.07.17
Posted by 십자성군
TMS320/Study2014. 7. 18. 00:10

cmd파일, 커맨드 파일이라고 하는것 같다.

 그 구조를 뜯어보면 아래처럼 되어있다.

 

/*
// TI File $Revision: /main/3 $
// Checkin $Date: April 23, 2007   09:09:27 $
//###########################################################################
//
// FILE:    F2812_EzDSP_RAM_lnk.cmd
//
// TITLE:   Linker Command File For F2812 eZdsp examples that run out of RAM
//          This linker file assumes the user is booting up in Jump to H0 mode
//
//###########################################################################
// $TI Release: DSP281x C/C++ Header Files V1.20 $
// $Release Date: July 27, 2009 $
//###########################################################################
*/

/* ======================================================
// For Code Composer Studio V2.2 and later
// ---------------------------------------
// In addition to this memory linker command file,
// add the header linker command file directly to the project.
// The header linker command file is required to link the
// peripheral structures to the proper locations within
// the memory map.
//
// The header linker files are found in <base>\DSP281x_Headers\cmd
//  
// For BIOS applications add:      DSP281x_Headers_BIOS.cmd
// For nonBIOS applications add:   DSP281x_Headers_nonBIOS.cmd   
========================================================= */

/* ======================================================
// For Code Composer Studio prior to V2.2
// --------------------------------------
// 1) Use one of the following -l statements to include the
// header linker command file in the project. The header linker
// file is required to link the peripheral structures to the proper
// locations within the memory map                                    */

/* Uncomment this line to include file only for non-BIOS applications */
/* -l DSP281x_Headers_nonBIOS.cmd */

/* Uncomment this line to include file only for BIOS applications */
/* -l DSP281x_Headers_BIOS.cmd */

/* 2) In your project add the path to <base>\DSP281x_headers\cmd to the
   library search path under project->build options, linker tab,
   library search path (-i).
/*========================================================= */

 

MEMORY
{
PAGE 0 :
   /* For this example, H0 is split between PAGE 0 and PAGE 1 */ 
   /* BEGIN is used for the "boot to HO" bootloader mode      */
   /* RESET is loaded with the reset vector only if           */
   /* the boot is from XINTF Zone 7.  Otherwise reset vector  */
   /* is fetched from boot ROM. See .reset section below      */
  
   RAMM0      : origin = 0x000000, length = 0x000400
   BEGIN      : origin = 0x3F8000, length = 0x000002            
   PRAMH0     : origin = 0x3F8002, length = 0x001FFE
   RESET      : origin = 0x3FFFC0, length = 0x000002          

        
PAGE 1 :

   /* For this example, H0 is split between PAGE 0 and PAGE 1 */

   RAMM1    : origin = 0x000400, length = 0x000400
   RAML1    : origin = 0x009000, length = 0x001000     /* on-chip RAM block L1 */
/*   DRAMH0   : origin = 0x3f9000, length = 0x001000 */       
}
 
 
SECTIONS
{
   /* Setup for "boot to H0" mode:
      The codestart section (found in DSP28_CodeStartBranch.asm)
      re-directs execution to the start of user code. 
      Place this section at the start of H0  */

   codestart        : > BEGIN,       PAGE = 0
   ramfuncs         : > PRAMH0       PAGE = 0 
   .text            : > PRAMH0,      PAGE = 0
   .cinit           : > PRAMH0,      PAGE = 0
   .pinit           : > PRAMH0,      PAGE = 0
   .switch          : > RAMM0,       PAGE = 0
   .reset           : > RESET,       PAGE = 0, TYPE = DSECT /* not used, */
  
   .stack           : > RAMM1,       PAGE = 1
   .ebss            : > RAML1,      PAGE = 1
   .econst          : > RAML1,      PAGE = 1     
   .esysmem         : > RAML1,      PAGE = 1

    
}

역할을 메모리 영역에 구조체를 배치해 준다는것 같다,

 

예를들어 abc라는 구조체를 DSP의 0x12345라는 주소에 집어넣고자 한다면

 

본 소스에 선처리 잡업 코드로

#pragma Data_SECTION(abc,"ABC");

를 해주고

 

커맨드 파일 내의 SECTION안에

SECTION{

...

ABC : >ASDF, PAGE = 1

...

}

 

MEMORY{

 

PAGE 1:

...

ASDF : origin = 0x12345, length = 0x1000

...

}

 

위와같이 해주면 ASDF라는 메모리 영역이 0x12345 에서 시작하여 0x1000의 크기를 갖으며

ABC로 이름붙여진 abc구조체가 그 영역에 들어가게 된다.

 

이러한 MEMORY{} 구간의 정의들은 DSP메모리맵을 기준으로 할당된다. 따라서 자신이 사용하는 DSP에 맞는 cmd파일을 적용하도록 하자.

 

이 설정은 properties의 General의 맨 하단의 두번째의 메뉴인 Linker command file을 통해서 링크 시킬 수 있다.

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

[28346]부트와 간단한 예제  (0) 2014.07.22
[28346]작업환경 구성하기  (0) 2014.07.21
rts2800_xxx.lib  (0) 2014.07.17
GlobalVariableDefs.c  (0) 2014.07.17
TMS UserGuide  (0) 2014.07.17
Posted by 십자성군
TMS320/Study2014. 7. 17. 23:58

공부하는 내용

rts 라이브러리가 가지는 의미, 역할


Start!


프로젝트에 우클릭 메뉴로 들어가는 Properties의 General에서 제일 하단의 Run Time Suppor Library를 선택할 수 있다.

DSP281x_CodeStartBranch.asm 에 의해 호출되는 이 라이브러리는 Library가 의미하는바와 같이 '공통적으로 쓰일 수 있는 함수를 모아 놓은 파일'일 것이다. 그리고 rts는 Runtime, 실행시를 의미한다.

 

우리가 개발할 때, C코드로 작성하는데 이것이 아무런 준비도 없이 실행될까? 포인터 등 각종 기법을 사용한 이 코드가 실행되기 위해서는 이를 위한 적절한 환경 및 준비가 필요할 것이다.(초기화된 데이터, 포인터, 전역변수 등등) 그런데 이러한 작업은 플랫폼에 관계없이 모든 C프로그램의 공통적인 부분이기에 Library화 해놓는다. 이것이 rts인 것이다.

 

이러한 rts2800_~.lib는 C언어로 작성된, 프로그램을 실행시키기 전에 실행되는 함수들의 집합 이라고 할 수 있다.

 

rts2800.lib               는 24계열의 DSP에

rts2800_ml.lib           는 28계열

rts2800_fpu3232.lib    는 FPU(Floating Point Unit)가 내장된 28계열에서 사용하며

 

더 빠른 부동소수점 연산을 위해서는 rts2800_fpu32_fast_suplement.lib를 함께 컴파일 한다.

 

여기까지가 대략적인 의의이고 좀 더 자세히 알고싶다면 아래로!

---------------------------------------------------------------------------------------------------------

rts 라이브러리의 역할은 아래와 같다. 핸드북보다 조금 길게 설명한다.

 

1.Stack확보 및 Stack Pointer 설정

Stack은 메모리의 일종으로 우리가 사용하는 C함수간의 데이터 전송시에 이용된다.(함수 A에서 함수 B에 변수를 전달 한다던가)

이 때, 우선 Ram 영역에 Stack 메모리를 확보(할당)하는 작업을 해 두어야 하는데 이를 Run Time Support Library가 해준다. 

 

C언어를 좀 해보신 분들은 포인터의 개념을 잘 알고 있을 것이다. 간단하게 주소 개념으로 설명하자면, 우리가 코딩한 함수나 데이터는 어딘가에 저장되어 있을 것이고 이 데이터에 접근하려면 이들이 어디에 저장되어 있는지 알아야 한다. 즉 '어디에 저장되어 있는가'를 나타내는 주소를 저장하는 변수가 포인터라고 할 수 있다. Stack Pointer는 이 Stack메모리의 주소를 저장하고 있을 것이다. 그리고 이의 설정 역시 Run Time Support Library가 한다.

 

2.연산 비트 설정

math.h가 요구하는 연산을 정확하게 처리하기 위해서, CPU내부의 각종 상태 비트들을 설정한다.

자세히는 아직 모르겠지만, math.h에서 미리 구성해놓은 연산(상수, 삼각함수 포함하여)을 좀 더 효율적이고 정확하게 처리하기 위한 비트설정을 미리 해두고 실제 우리가 함수를 사용할 때는 바로 그 비트들에 접근하여 연산한다고 생각하면 되겠다.

 

3.데이터 초기화

 상수변수의 초기화를 코드 실행 전에 해준다.

 무슨 말인가 하면 우리가 전역변수 등에 int x = 3; 이라는 선언을 했다고 했을 때, 이는 main의 실행 전에 이루어져야 하는 작업이다. 또한 이 x라는 변수는 Run Time중에 변경 가능한 값이다. 즉, 휘발성 이라는 것이다. 따라서 Ram과 같은 휘발성(volatile)메모리에서 운용 되어야 한다.

 rts는 플래시 메모리에 저장된 x=3이라는 상수 변수를, 적절한 램 영역에 x=3 이라고 초기화 해준다.

 

주의

 이러한 변수의 초기화를 굉장히 많이 해줄 때 주의할 사항이 있다. 만약 DSP281_CodeStartBranch.asm에서 Watchdog의 사용여부를 설정하는 것이 아니라, main()함수에서 이를 설정한다면, 문제가 생길 수 있다. rts가 상수 변수의 초기화를 하는데, 8비트 카운터인 Watchdog이 2^8인 256을 헤아리는 동안 CPU가 적절한 동작을 하지 않는다면, Watchdog이 CPU에 이상이 있다고 판단하여 CPU를 리셋시킬 수 있다. 따라서 Watchdog의 사용설정을 main에서 한다면 이 상수변수 초기화를 짧게 해주어야 하거나, 차라리 어셈블리 내에서 설정하는것이 나을 수도 있다.

 

※개인적인 의견이지만 어셈블리에서 사용을 정지시키고 상수변수 초기화 후 main()에 들어와서 다시 사용하도록 해야하지 않을까?

 

추가

.C2000에서 lib파일을 만들기 위한 소스 코드가 rts.src이다.

.핸드북을 보면 CodeStartBranch에서 _c_int00 이라는 코드가 있다. rts.src 코드의 시작점이 _c_int00이다. 즉, DSP281x_CodeStartBranch.asm에 의해서 rts.src가 fms(rts2800_ml.lib)를 사용할 수 있게 해주는 것이다. 그리고 rts.src는 마지막에 call _main을 수행하여 main 함수를 호출한다.

.call _main의 '_'는 C코드와 어셈블리 코드가 상호 호출하는 레이블을 구분하기 위한 기호이다. 따라서 '_'기호를 보면 어셈블리와 C에서 상호 사용되는 것이라고 이해하면 된다.

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

[28346]부트와 간단한 예제  (0) 2014.07.22
[28346]작업환경 구성하기  (0) 2014.07.21
CMD파일  (0) 2014.07.18
GlobalVariableDefs.c  (0) 2014.07.17
TMS UserGuide  (0) 2014.07.17
Posted by 십자성군
TMS320/Study2014. 7. 17. 23:40

제공해주는 두 종의 자료 DSP281x_common, DSP2812_headers가 있다.

여기서 DSP2812_headers의 source에 DSP281x_GlobalvariableDefs.c 가 있다.

이는 DSP281x_Device.h를 인클루드 하며 이는 또한 SysCtrl.h를 포함한 각종 헤더파일들을 인클루드 한다.

 

GlobalvariableDefinition. 즉, 전역변수 정의 인데 즉 DSP의 각종 레지스터들에 대한 정보를 포함하고 있다고 할 수 있겠다.

 

DSP의 비트필드(레지스터를 맵처럼 정돈해 놓은 구조체들)와 주변회로(GPIO,SCI,CAN,SPI..등등)을 변수처럼 불러서 사용할 수 있도록 기본 레지스터 설정 함수들이 짜여져 있는 것이다.

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

[28346]부트와 간단한 예제  (0) 2014.07.22
[28346]작업환경 구성하기  (0) 2014.07.21
CMD파일  (0) 2014.07.18
rts2800_xxx.lib  (0) 2014.07.17
TMS UserGuide  (0) 2014.07.17
Posted by 십자성군