본문 바로가기

OS/vxworks

SBC310 GPIO 설정

SBC310에서 GPIO 제어를 하기위한 설정을 설명한다.

 

1. GPIO제어를 위해서 ge fanuc에서 제공한 ESP에서 GPIO 관련된 커널 컴포넌트를 추가해야 한다.

hardware >> BSP configuration variants >> ESP >> GPIO

 

2. 커널을 재컴파일한 이후 부팅한 후 아래의 커맨드로 GPIO 핀 상태를 확인한다.

보드에 장착된 GPIO 핀들 정보를 일목요연하게 확인할 수가 있다.

  1.  [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번 핀의 값을 확인하는 방법으로 테스트를 진행하였다.

  1.  gpioSet [핀번호], [값]
     gpioGet [핀번호]

 

4. GPIO Output / Input 모드로 바꾸는 예제
4.1 Output

4번 핀을 OUTPUT 모드로 바꾸는 예제

  1. 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 모드로 바꾸는 예제

  1. gefGpioDirSet( BANK_0, 2, GEF_GPIO_INPUT );

 

5. GPIO 인터럽트 활용

GPIO 인터럽트 활용 예제

3번 핀에 인터럽트를 설정하여 인터럽트가 발생하면 disableGpioInterrupt 함수를 호출하게 한다.

  1. 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 );

 

인터럽트 발생시 호출되는 콜백함수이다.

  1. 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 값들 모음

  1. #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 자체제작한 예제

  1. #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. 참고파일

 

이 글은 스프링노트에서 작성되었습니다.