SBC310에서 GPIO 제어를 하기위한 설정을 설명한다.
1. GPIO제어를 위해서 ge fanuc에서 제공한 ESP에서 GPIO 관련된 커널 컴포넌트를 추가해야 한다.
hardware >> BSP configuration variants >> ESP >> GPIO
2. 커널을 재컴파일한 이후 부팅한 후 아래의 커맨드로 GPIO 핀 상태를 확인한다.
보드에 장착된 GPIO 핀들 정보를 일목요연하게 확인할 수가 있다.
- [0]->gefGpioShow
|--------------------------------------------------------------------------------------|
| | | Out | Data | Interrupt | intr |Intr Enabl | ISR Count | Num callB |
| Pin | Dir | Mode | in | out | Trigger | Stat | c0 | c1 | int | ovr | int | ovr |
|--------------------------------------------------------------------------------------|
| 0 | in | Totm | 1 | 1 | Lvl-Low | - | - | - | 0 | 0 | 0 | 0 |
| 1 | in | Totm | 1 | 1 | Lvl-Low | - | - | - | 0 | 0 | 0 | 0 |
| 2 | in | Totm | 1 | 1 | Lvl-Low | - | - | - | 0 | 0 | 0 | 0 |
| 3 | in | Totm | 1 | 1 | Lvl-Low | - | - | - | 0 | 0 | 0 | 0 |
| 4 | in | Totm | 1 | 1 | Lvl-Low | - | - | - | 0 | 0 | 0 | 0 |
| 5 | in | Totm | 1 | 1 | Lvl-Low | - | - | - | 0 | 0 | 0 | 0 |
|--------------------------------------------------------------------------------------|
value = 3 = 0x3
[0]->
3. 0번을 Out으로 바꾸고 0번과 1번을 점퍼로 연결한 다음, 0번 핀에 값을 넣어 1번 핀의 값을 확인하는 방법으로 테스트를 진행하였다.
- gpioSet [핀번호], [값]
gpioGet [핀번호]
4. GPIO Output / Input 모드로 바꾸는 예제
4.1 Output
4번 핀을 OUTPUT 모드로 바꾸는 예제
- gefGpioOutModeSet( BANK_0, 4, GEF_GPIO_OPEN_DRAIN );
gefGpioStateSet ( BANK_0, 4, GEF_GPIO_STATE_ACTIVE );
gefGpioDirSet( BANK_0, 4, GEF_GPIO_OUTPUT );
4.2 Input
3번 핀을 INPUT 모드로 바꾸는 예제
- gefGpioDirSet( BANK_0, 2, GEF_GPIO_INPUT );
5. GPIO 인터럽트 활용
GPIO 인터럽트 활용 예제
3번 핀에 인터럽트를 설정하여 인터럽트가 발생하면 disableGpioInterrupt 함수를 호출하게 한다.
- gefGpioDirSet( BANK_0, 3, GEF_GPIO_INPUT );
gefGpioIntTrigSet( BANK_0, 3, GEF_GPIO_TRIG_ON_ACTIVE_STATE );
gefGpioIntConnect( BANK_0, 3, disableGpioInterrupt, 3 );
gefGpioIntEnableSet( BANK_0, 3, TRUE );
인터럽트 발생시 호출되는 콜백함수이다.
- STATUS disableGpioInterrupt( int pinNo )
{
logMsg("disabling interrupt on BANK_0, pin %d\n",0,0,0,0,0,0);
return gefGpioIntEnableSet( BANK_0, (UINT8)pinNo, FALSE );
}
6. 기타
6.1 인자로 쓰이는 ENUM 값들 모음
- #if 0
enum /* values for GEF_GPIO_DIR data type*/
{
GEF_GPIO_INPUT = 0,
GEF_GPIO_OUTPUT,
GEF_GPIO_DIR_INVALID
};
enum /* values for GEF_GPIO_OM data type*/
{
GEF_GPIO_OPEN_DRAIN = 0,
GEF_GPIO_TOTEM_POLE,
GEF_GPIO_OM_INVALID
};
enum /* values for GEF_GPIO_TRIG data type */
{
GEF_GPIO_TRIG_ON_ACTIVE_STATE = 0, /* level trigger on active state */
GEF_GPIO_TRIG_ON_INACTIVE_STATE, /* level trigger on inactive state */
GEF_GPIO_TRIG_ON_ACTIVE_EDGE, /* edge trigger on active-going edge */
GEF_GPIO_TRIG_ON_INACTIVE_EDGE, /* edge trigger on inactive going edge */
GEF_GPIO_TRIG_ON_BOTH_EDGES, /* edge trigger on both edges */
GEF_GPIO_TRIG_INVALID
};
enum /* values for GEF_GPIO_POL */
{
GEF_GPIO_POLARITY_ACTIVE_LOW = 0, /* active state is low (inverted) */
GEF_GPIO_POLARITY_ACTIVE_HIGH, /* active state is high (non-inverted) */
GEF_GPIO_POLARITY_INVALID
};
enum /* values for GEF_GPIO_STATE */
{
GEF_GPIO_STATE_INACTIVE = 0, /* state is active (based on polarity) */
GEF_GPIO_STATE_ACTIVE, /* state is inactive (based on polarity)*/
GEF_GPIO_STATE_INVALID
};
#endif
6.2 자체제작한 예제
- #include <vxWorks.h>
#include <stdio.h>
#include "gefGpioDrv.h"
void GPIO_ISR()
{
logMsg("interrupt\n",0,0,0,0,0,0);
}
void GPIO_Test()
{
gefGpioOutModeSet( BANK_0, 2, GEF_GPIO_OPEN_DRAIN );
gefGpioStateSet ( BANK_0, 2, GEF_GPIO_TRIG_ON_ACTIVE_STATE );
gefGpioDirSet( BANK_0, 2, GEF_GPIO_OUTPUT );
gefGpioDirSet( BANK_0, 3, GEF_GPIO_INPUT );
gefGpioIntTrigSet( BANK_0, 3, GEF_GPIO_TRIG_ON_BOTH_EDGES );
gefGpioIntConnect( BANK_0, 3, GPIO_ISR, 0 );
gefGpioIntEnableSet( BANK_0, 3, TRUE );
gefGpioShow();
}
7. 참고파일
- ampespwb.pdf : ESP 메뉴얼
이 글은 스프링노트에서 작성되었습니다.