Skip to content
irmusy edited this page Oct 2, 2013 · 1 revision

GPIO의 디지털 입력 기능을 이용하여 푸쉬 스위치 상태를 읽고 인터럽트 처리를 할 수 있도록 유틸리티 코드를 정리한 헤더 파일입니다.

구성

myCortex-LM8962 보드에는 사용자 스위치가 없습니다. 본 헤더 파일은 PC7 핀에 푸쉬 스위치를 연결한 경우를 가정하고 작성되어 있습니다.

아래 그림과 같이 myCortex-LM8962의 PC7 핀에 스위치를 연결합니다. 도면은 [PDF파일](pdf/부트로더 사용법/External SW.pdf)로 다운로드 받으실 수도 있습니다. 이때 회로상의 C1은 디바운싱을 위해 연결합니다. C1을 연결하지 않을 경우 스위치 노이즈에 의해 한번의 누름 동작을 여러번 인식 할 수 있습니다.

![External SW.png](img/부트로더 사용법/External SW.png)

디바운스 현상을 제거하기 위한 방법은 여러가지가 있습니다. 본 회로 처럼 캐패시터를 이용해 물리적인 저역통과필터를 사용하기도 하고, 소프트웨어적으로 처리할 수도 있습니다. 자세한 내용은 스위치 디바운스 검색 결과를 참조하시기 바랍니다.

[myMCU-EXP rev.B 보드](myMCU-EXP rev.B)를 사용하는 경우 보드상의 SW8이 PC7 핀에 연결되어 있으므로 SW8을 그대로 사용하시면 됩니다. myMCU-EXP rev.B 보드에는 캐패시터를 이용한 디바운스 회로가 포함되어 있습니다.

관련 예제

  • [gpio](예제 gpio)
  • [gpio_interrupt](예제 gpio_interrupt)

소스 살펴보기

43 line:

#define CUST_SYSCTL_PERIPH_SW           SYSCTL_PERIPH_GPIOC
#define CUST_SW_PORT_BASE               GPIO_PORTC_BASE
#define CUST_SW_PIN                     GPIO_PIN_7
#define CUST_SW_INT_EDGE                GPIO_FALLING_EDGE

푸쉬 스위치가 연결 된 GPIO 핀에 대한 정의입니다. 스위치가 PC7에 연결되어 있는 것을 가정한 코드입니다.

48 line:

// input을 사용하는 경우 초기화.
#define SW_INIT()                                                           \
    do {                                                                    \
        SysCtlPeripheralEnable(CUST_SYSCTL_PERIPH_SW);                      \
        GPIOPinTypeGPIOInput(CUST_SW_PORT_BASE, CUST_SW_PIN);               \
        GPIOPadConfigSet(CUST_SW_PORT_BASE, CUST_SW_PIN, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU); \
    } while(0)

인터럽트를 사용하지 않는 스위치 초기화 코드입니다. GPIO 핀을 입력으로 설정하고 weak pull-up 저항을 활성화 합니다.

스위치를 사용하는 펌웨어를 작성할 때에는 펌웨어 초기화 부분에서 이 함수를 한번 호출해 주면 됩니다.

56 line:

// interrupt input을 사용하는 경우 초기화.
// 이 경우에는 SW_IntHandler() 함수를 구현해야 한다.
#define SW_INIT_INT()                                                       \
    do {                                                                    \
        SysCtlPeripheralEnable(CUST_SYSCTL_PERIPH_SW);                      \
        GPIOPinTypeGPIOInput(CUST_SW_PORT_BASE, CUST_SW_PIN);               \
        GPIOPadConfigSet(CUST_SW_PORT_BASE, CUST_SW_PIN, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU); \
        GPIOIntTypeSet(CUST_SW_PORT_BASE, CUST_SW_PIN, CUST_SW_INT_EDGE);   \
        GPIOPortIntRegister(CUST_SW_PORT_BASE, SW_IntHandler);              \
    } while(0)

인터럽트를 사용하는 스위치 초기화 코드입니다. 기본적인 GPIO 관련 초기화 부분은 **SW_INIT()**함수와 동일하며, 인터럽트 설정 코드가 추가되어 있습니다.

스위치를 사용하는 펌웨어를 작성할 때에는 펌웨어 초기화 부분에서 이 함수를 한번 호출해 주면 됩니다. 그리고 사용자 인터럽트 핸들러 함수 인 SW_IntHandler() 함수를 만들어 줘야 합니다.

67 line:

#define SW_IS_HIGH()        (GPIOPinRead(CUST_SW_PORT_BASE, CUST_SW_PIN) == CUST_SW_PIN)
#define SW_IS_PUSHED()      (!SW_IS_HIGH())
#define SW_INT_ENABLE()     GPIOPinIntEnable(CUST_SW_PORT_BASE, CUST_SW_PIN)
#define SW_INT_DISABLE()    GPIOPinIntDisable(CUST_SW_PORT_BASE, CUST_SW_PIN)
#define SW_INT_CLEAR()      GPIOPinIntClear(CUST_SW_PORT_BASE, CUST_SW_PIN)

스위치 관련 함수들입니다.

  • SW_IS_HIGH() : 현재 스위치에 연결된 핀이 High라면 true를 리턴합니다. 위의 회로도 대로 연결되었다면 스위치가 눌리지 않았을 때 High입니다.
  • SW_IS_PUSHED() : 현새 스위치가 눌려 있다면 true를 리턴합니다.
  • SW_INT_ENABLE() : 스위치 인터럽트를 enable하는 함수입니다. **SW_INIT_INT()**를 통해 초기화 한 다음 이 함수를 이용해 인터럽트를 enable 시켜 줘야 스위치를 눌렀을 때 인터럽트가 발생합니다.
  • SW_INT_DISABLE() : 스위치 인터럽트를 disable하는 함수입니다.
  • SW_INT_CLEAR() : 스위치 인터럽트가 발생하면 인터럽트 flag가 설정됩니다. 인터럽트 핸들러 내에서 이 함수를 이용해 flag를 clear해 줘야 인터럽트가 무한 반복되는 현상이 일어나지 않습니다.

72 line:

void SW_IntHandler(void);

인터럽트를 사용할 때 사용자가 작성해야 할 인터럽트 핸들러 함수의 원형입니다. 기본적으로 **SW_INT_CLEAR()**를 이용해 인터럽트 flag를 clear해 줘야 합니다. [gpio_interrupt 예제](예제 gpio_interrupt)에서 작성 예를 볼 수 있습니다.

Clone this wiki locally