GPIO(1)

5676 단어 EmbeddedEmbedded

GPIO OUTPUT

Push-pull or open-drain type
push-pull은 그 자체로 동작하나, open-drain은 미완성회로이다.
... 더 설명(추후에 추가하겠다!)

DigitalOut API in mbed-os

volatile: 최적화를 하지 말라.
ex) 같은 주소에 어떤 값을 쓰고 읽으면 쓴 값이 읽히고 쓴 값을 그대로 출력한다.
하지만 IO에서는 물리적으로 다른 위치인 경우가 많아서 volatile을 자주 사용한다.

DigitalOut class

  • 생성자
  DigitalOut(PinName pin)
  DigitalOut(PinName pin, int value)
  
  EX) DigitalOut led1(D2);
      DigitalOut led2(PA_5, 0);

value는 초기값을 설정한다. default는 0이다.
pin값에는 PA_0..PA15,PB_0..PB_15등 다음 문서에 정의되어 있는 Pinname을 사용할 수 있다.
https://github.com/ARMmbed/mbed-os/blob/master/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F411xE/TARGET_NUCLEO_F411RE/PinNames.h

  • void write(int value)
led1.write(1);
led1.write(0);

led1 = 1; //write의 재정의 함수.

DigitalOut으로 설정된 GPIO 포트의 핀을 0 혹은 1의 값으로 출력한다.

  • void read(int value)
int a = led1.read();

//read()의 재정의 함수. int type으로 값을 읽는다.
led1 = !led2; 
int a = led1;

DigitalOut으로 설정된 GPIO 포트의 핀의 신호를 읽는다.

DigitalIn class

DigitalIn(PinName pin)
DigitalIn(PinName pin, PinMode mode)

EX) DigitalIn button(PC_13);
    DigitalIn button(PC_13, PullUp);

pin의 종류는 DigitalOut class와 동일하게 official implementation의 header file에서 확인이 가능하고,
Mode의 종류에는 PullUp, PullDown, PullNone, OpenDrainPullUp, OpenDrainPullDown, OpenDrainNoPull이 있다.
default mode는 PullNone이다.

  • int read()
    DigitalIn으로 설정된 GPIO 포트의 핀에서 입력 신호를 읽는다.
int a = button.read();

//read의 재정의
int a = button;
  • void mode(PinMode pull);
    DigitalIn의 mode를 설정한다.
button.mode(PullUp);

Digital Output and Input lab

User button을 누를때 마다 LED2의 blinking rate을 조절한다.
500ms on/off -> 1sec on/off -> 2sec on/off... 와 같이 User button을 누를 때 마다 blinking rate이 2배가 된다. blinking rate이 4sec이상이 되면 다시 500ms으로 돌아온다.
https://github.com/jacinder/embeeded_PA/blob/main/GPIO/Digital%20Output%20and%20Input.cpp

DigitalInOut class

https://os.mbed.com/docs/mbed-os/v6.9/mbed-os-api-doxy/classmbed_1_1_digital_in_out.html#a75465681335eddd9d9d3e72336cfc935

  • 생성자
DigitalInOut(PinName pin)
DigitalInOut(PinName pin, PinDirection dir, PinMode mode, int value)

EX) DigitalInOut inOut(D2);
    DigitalInOut inOut(PA_5, PIN_OUTPUT, PullNone, 0);

GPIO 포트의 어떤 핀을 디지털 입출력 장치로 설정
dir은 PIN_OUTPUT, PIN_INPUT 중 하나,
pin, mode는 이전의 API와 동일.
PinDirection의 default는 디지털 입력 장치.
입력 장치일 경우 value는 무의미, 출력 장치일 경우 defult 신호를 value로 설정함.

읽기, 쓰기 동작은 DigitalIn, DigitalOut class와 동일하다.

  • void input()
    디지털 입력 장치로 동작하도록 설정
  • void output()
    디지털 출력 장치로 동작하도록 설정
InOut.input();
InOut.output();

InterruptIn

  • 생성자
InterruptIn(PinName pin)

EX) InterruptIn button(PC_13);
  • void fall(Callback<void()> func)
    하강 엣지 이벤트 발생 때 실행될 ISR(Interrupt Service Routine)인 함수를 등록한다.
button.fall(&button_pressed);
  • void rise(Callback<void()> func)
    상승 엣지 이벤트 발생 때 실행될 ISR인 함수를 등록한다.
button.rise(&button_released);
  • void enable_irq(), disable_irq()
    인터럽트를 활성화/비활성화 시킨다.
button.enable_irq();
button.disable_irq();

Interrupt Input lab

toggle the red LED when a user button is pressed.
blinking green LED at a rate of 1sec

https://github.com/jacinder/embeeded_PA/blob/main/GPIO/Interrupt%20Input.cpp

BusOut

여러개의 디지털 출력 장치를 한번에 제어할 수 있다.
즉 하나의 논리적인 장치로 생각하겠다는 뜻이다.

BusOut motorCtl(D2, D3, D4, D5);

만약 motorCtl = 4라면 0010이 들어가는 것이다.

마찬가지로 BusIn, BusInOut class도 존재한다.
https://os.mbed.com/docs/mbed-os/v6.9/apis/busin.html

PortOut class

하나의 포트(GPIOA, GPIOB 등)에 속한 여러개의 출력 장치를 하나의 논리 장치로 구성하여 한꺼번에 제어한다.

PortOut motorCtrl(PortB, 0x0078);

https://os.mbed.com/docs/mbed-os/v6.9/apis/portin.html

DIGITAL OUT LAB

Red LED를 1초 간격으로, Yellow LED를 2초 간격으로, Green LED를 4초 간격으로 blinking 시키기.
https://github.com/jacinder/embeeded_PA/blob/main/GPIO/Digital%20Output.cpp

PORT OUT LAB

DIGITAL OUT LAB와 동일한 세팅
user button을 누를 때 마다 blinking rate 변경(1sec->2sec->4sec)

좋은 웹페이지 즐겨찾기