Embedded System/MSP430

[MSP430] 튜토리얼 3 - GPIO 제어(1)

임베지수 2021. 3. 10. 03:08

목차

1. [MSP430] 튜토리얼 1 - Code Composer Studio(CCS) 설치

2. [MSP430] 튜토리얼 2 - 프로젝트 생성

3. [MSP430] 튜토리얼 3 - GPIO 제어(1) (현재글)


GPIO란 General Purpose Input Output의 약자로 MCU의 가장 흔한...? 기본이 되는 기능이다.

MSP430에서는 어떻게 I/O를 제어하는지 알아보자.

 

먼저 MSP430FR5969 런치패드에 연결되어 있는 LED부터 살펴보자.

회로도를 보면 초록색 LED는 P1.0에 연결되어 있고, 빨간색 LED는 P4.6에 연결되어 있음을 알 수 있다.

 

[MSP430FR5969 LaunchPad 회로도 - LED 연결부]

 

I/O 기능과 관련된 레지스터는 여러가지가 있는데 일단 LED를 켜고 끄는데 필요한 레지스터 먼저 살펴보자.

참고로 FRAM으로 만들어진 MSP430의 경우 4번이 가장 중요하다.

PM5CTL0 레지스터를 설정하지 않을 경우 I/O 기능을 사용할 수 없다.

인터넷에 있는 MSP430 튜토리얼 그대로 따라했는데 I/O 출력이 안나와서 한참을 고생했다.

내가 본 튜토리얼에는 PM5CTL0 레지스터가 없는 일반 MSP430을 기준으로 만들어진 예제였다...ㅂㄷㅂㄷ....

 

어쨌든 해당 레지스터는 조금 있다 설명하기로 한다.


★ 이 포스트에서 사용할 Digital I/O 관련 레지스터

 

1. PxDIR   (x=1,2, ...)
2. PxOUT  (x=1,2, ...)

3. PxIN     (x=1,2, ...)

4. PxREN   (x=1,2, ...)
5. PM5CTL0


1~4번에 있는 소문자 x는 포트번호를 의미한다.

 

PxDIR 레지스터는 입/출력 방향을 설정하는 레지스터이다. LED를 켜고 끄려면 출력으로 설정해야하므로 PxDIR 레지스터에 내가 설정하고자 하는 핀 번호(0~7)를 보고 1로 설정한다

1으로 설정하면 출력으로 사용하겠다는 의미이고, 0으로 설정하면 입력으로 사용하겠다는 의미이다.

 

각 비트가 각각의 핀을 담당하는데 예를 들어...

 

초록색 LED의 경우 P1.0에 연결되어 있으므로 P1DIR |= 0x01 이런식으로 설정한다. (이진수 표현: 0000 0001)

빨간색 LED는 P4.6에 연결되어 있으므로 P4DIR |= 0x40 이런식으로 설정한다. (이진수 표현: 0100 0000)

 

[PxDIR 레지스터]

 

 

PxOUT 레지스터는 각 핀의 출력상태를 관장한다. 0이면 Low, 1이면 High 상태가 된다.

 

MCU에서 말하는 Low, High는 전압으로 나타내는데 보통 Low면 0V, High면 Vcc전압을 의미한다.

지금 사용하고 있는 MSP430의 경우 Vcc전압으로 3.3V가 인가되고 있다.

따라서 High면 3.3V, Low면 0V를 의미한다.

 

초록색 LED를 켜고 싶으면 P1OUT |= 0x01, 끄고 싶으면 P1OUT &= ~0x01 으로 설정한다.

마찬가지로 빨간색 LED를 켜고 싶으면 P4OUT |= 0x40, 끄고 싶으면 P4OUT &= ~0x40 으로 설정한다.

 

비트연산자를 사용한 이유는 특정 비트만 0 이나 1로 만들어주기 위함이다.

 

[PxOUT 레지스터]

 

 

PxIN 레지스터는 현재 핀의 상태를 읽어오는 레지스터이다.

비트를 읽었을 때 0이면 Low, 1이면 High 상태이다.

버튼 같은 걸 연결했을 때 버튼이 연결된 핀의 상태를 읽어 버튼이 눌렸는지 안눌렸는지 알 수 있다.

 

[PxIN 레지스터]

 

런치패드 회로도를 보면 2개의 푸시버튼 스위치가 있고 각각 P1.1, P4.5에 연결되어 있음을 알 수 있다.

 

[MSP430FR5969 LaunchPad 회로도 - 푸시버튼 스위치 연결부]

 

 

사용 예시로 P1IN & 0x02 한 결과가 0이면 S2 버튼이 눌러진 상태이고, 그렇지 않으면 안눌러진 상태이다.

회로도를 보면 버튼을 누르면 GND (0V) 와 연결되기 때문이다.

 

버튼 입력을 확인하기 위해서는 PxDIR이 입력으로 되어있어야하고, 내부 풀업/풀다운 저항을 사용할지 안할지 설정해주어야 한다. PxPEN 레지스터를 통해 설정 가능하다.

위 회로도를 보면 버튼이 연결된 핀에 풀업 저항을 연결해주어야 버튼을 누르지 않았을 때 High상태를 유지한다.

 

비트를 1로 설정하면 풀업/풀다운 저항을 사용하겠다는 의미이다.

[PxREN 레지스터]

 

풀업/풀다운을 사용하겠다고 설정하면 풀업인지 풀다운인지 설정해주어야 하는데 이는 앞서 설명한 PxOUT 레지스터를 통해 설정 가능하다. 아래 표를 참고하자.

[각 레지스터 상태에 따른 설정 값]

 

마지막으로 PM5CTL0..... ㅂㄷㅂㄷ....

전력을 관리해주는 레지스터 중 하나인데 MSP430 FRAM 모델의 경우 전원이 인가되면 기본적으로 I/O 설정을 할 수 없도록 막아버린다.

 

즉, 전원인가 후 PM5CTL0 레지스터의 LOCKLPM5 비트를 0으로 설정한 뒤 I/O 설정을 해야한다는 말이다.

 

이것으로 I/O 설정과 관련된 레지스터를 간략히 설명하였다.

 

다음 글에서는 직접 코드를 짜보고 MSP430에서 동작시켜보겠다.