공부하는 내용
구조체를 기반으로 한 MMR조작 및 선언의 기본
Start!
GPAMUX BIT |
Peripheral Name |
GPIO Name |
GPADIR Bit |
Type |
Reset |
0 |
PWM1 |
GPIOA0 |
0 |
R/W |
0 |
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 |
0 |
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 |