-
Notifications
You must be signed in to change notification settings - Fork 15
switch.h
GPIO의 디지털 입력 기능을 이용하여 푸쉬 스위치 상태를 읽고 인터럽트 처리를 할 수 있도록 유틸리티 코드를 정리한 헤더 파일입니다.
myCortex-LM8962 보드에는 사용자 스위치가 없습니다. 본 헤더 파일은 PC7 핀에 푸쉬 스위치를 연결한 경우를 가정하고 작성되어 있습니다.
아래 그림과 같이 myCortex-LM8962의 PC7 핀에 스위치를 연결합니다. 도면은 [PDF파일](pdf/부트로더 사용법/External SW.pdf)로 다운로드 받으실 수도 있습니다. 이때 회로상의 C1은 디바운싱을 위해 연결합니다. C1을 연결하지 않을 경우 스위치 노이즈에 의해 한번의 누름 동작을 여러번 인식 할 수 있습니다.

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