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 |