GPIO(1)
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
- 생성자
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)
Author And Source
이 문제에 관하여(GPIO(1)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@highgrace/임베디드-프로세서-응용저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)