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