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 십자성군