메뉴 닫기

OpenCR GPIO 사용

CPU 에서 기본적으로 사용이 되는 GPIO를 사용해보도록 한다.

기본프로젝트를 다운로드 받는다. 어디? 여기에!

사용될 GPIO 핀
먼저 사용될 핀을 찾아보자.

LED 회로

Switch 회로

정리 하자면 사용되는 GPIO 핀은 다음과 같다.

기능 사용목적 Netname 포트명
GPIO Output SYS_USER_LED1 PG12
GPIO Output SYS_USER_LED2 PE5
GPIO Output SYS_USER_LED3 PE4
GPIO Output SYS_USER_LED4 PG10
GPIO Input BUT_USER1 PC12
GPIO Input BUT_USER2 PG3

프로젝트에서 Cube MX 를 실행한다.

실행된 Cube MX 에서 다음의 핀을 Input/Output 으로 설정한다.

Input/Output 설정방법

LED 의 초기 상태값(꺼짐) 을 만들기 위하여 Configuration 설정을 다음과 같이 High로 설정한다.

설정을 마쳤으면 GENERATE Code 버튼을 누른다.

코드 생성중…

자신의 입맛에 맞게 버튼을 누르자.

hw 폴더에 driver 폴더를 생성 후, button.c / button.h / led.c / led.h 파일을 생성한다.

hw / driver 에 Add/remove include path… 를 누른다.

OK 버튼을 누른다.
Select configurations to modify

코드 작성

Def.h

#include "def.h"
// LED 포트 정의
#define _DEF_LED1     0
#define _DEF_LED2     1
#define _DEF_LED3     2
#define _DEF_LED4     3

// Button 포트 정의 추가
#define _DEF_BUTTON1  0
#define _DEF_BUTTON2  1

led.h

#include "hw_def.h"

#define LED_MAX_CH        4

void ledInit(void);
void ledOn(uint8_t ch);
void ledOff(uint8_t ch);
void ledToggle(uint8_t ch);

button.h

#include "hw_def.h"

#define BUTTON_MAX_CH       2
void buttonInit(void);
bool buttonGetPressed(uint8_t ch);

led.c

#include "led.h"

typedef struct
{
  GPIO_TypeDef *GPIOx;
  uint16_t      GPIO_Pin;
  GPIO_PinState on_state;
  GPIO_PinState off_state;
} led_tbl_t;

led_tbl_t led_tbl[LED_MAX_CH] =
    {
        {GPIOG, GPIO_PIN_12, GPIO_PIN_RESET, GPIO_PIN_SET},
        {GPIOE, GPIO_PIN_5,  GPIO_PIN_RESET, GPIO_PIN_SET},
        {GPIOE, GPIO_PIN_4,  GPIO_PIN_RESET, GPIO_PIN_SET},
        {GPIOG, GPIO_PIN_12, GPIO_PIN_RESET, GPIO_PIN_SET},
    };

void ledInit(void)
{
  uint32_t i;

  for (i=0; i<LED_MAX_CH; i++){
   ledOff(i);
  }
}

void ledOn(uint8_t ch){
  HAL_GPIO_WritePin(led_tbl[ch].GPIOx, led_tbl[ch].GPIO_Pin, led_tbl[ch].on_state);
}

void ledOff(uint8_t ch){
  HAL_GPIO_WritePin(led_tbl[ch].GPIOx, led_tbl[ch].GPIO_Pin, led_tbl[ch].off_state);
}
void ledToggle(uint8_t ch){
  HAL_GPIO_TogglePin(led_tbl[ch].GPIOx, led_tbl[ch].GPIO_Pin);
}

button.c

#include "button.h"

typedef struct
{
  GPIO_TypeDef *GPIOx;
  uint16_t      GPIO_Pin;
  GPIO_PinState on_state;
} button_tbl_t;

button_tbl_t button_tbl[BUTTON_MAX_CH] = 
    {
        {GPIOG, GPIO_PIN_3, GPIO_PIN_SET},
        {GPIOC, GPIO_PIN_3, GPIO_PIN_SET},
    };

void buttonInit(void){
  
}

bool buttonGetPressed(uint8_t ch)
{
  GPIO_PinState button_state;
  
  button_state = HAL_GPIO_ReadPin(button_tbl[ch].GPIOx, button_tbl[ch].GPIO_Pin);
  
  if(button_state == button_tbl[ch].on_state)
  {
    return true;
  } else {
    return false;
  }
}

hw.h

#include "led.h"
#include "button.h"

hw.c

ledInit();
buttonInit();

ap.h


ap.h

if(buttonGetPressed(_DEF_BUTTON1)==true){
      ledOn(_DEF_LED1);
      } else {
        ledOff(_DEF_LED1);
      }

      if(buttonGetPressed(_DEF_BUTTON2)==true){
        ledOn(_DEF_LED2);
      } else {
        ledOff(_DEF_LED2);
      }

 

다운로드는 여기 버튼을 누르면 다운로드 된다…

댓글 남기기