nRF51822 GPIO 코드 예제입니다.
목차
nRF51822
OUTPUT 함수 살펴보기
STM 쓰다 이거 보려니 메뉴얼도 영 허술하고 개같더라. 그래도 어쩌겠나. 검색하고 코드를 작성해봐야지.
BLE 400 보드는 18번 핀부터 22번 핀까지 LED가 연결되어 있다. 그러니까 5개의 LED가 있는 셈이다. 근데 기존 코드를 돌려보면 2개의 핀밖에 안켜지니 얼마나 얼빠지는 일이란 말인가.
그렇다고 잠깐잠깐 라이브러리 수정해서 하는 것은 내 자존심이 허락하질 않으니 하나하나 세팅해 보고자 한다.
기존 예제처럼 깜박 거리는 것만 해볼까.
먼저 라이브러리 함수부터 뒤져보자
nrf_gpio_cfg_output
위 함수를 보면 핀을 Output으로 설정해주는 함수이다. 기초 설정에 들어가는 함수라고 보면 될 듯 하다. 만약에 설정을 하지 않는다면, 아무리 출력을 하라하던 말던 동작하지 않으니 설정을 해두는 편이 좋다. 근데 보니까 이걸 하나하나 설정하자니 코드가 길어져 안이쁜거다. nRF에는 이런 내 생각을 읽은 사람이 있었나보다. 범위를 지정해서 한꺼번에 지정하는 것이 가능하다. 오오..
nrf_gpio_range_cfg_output
오.. 영롱하도다. 이전 포스팅에서 다룬 것처럼 핀은 30개까지만 가능한가 보다. 입력 인자로 두 개를 받고 있는데 입력을 시작할 핀과 받을 핀 두 가지를 지정해 주면 된다.
초기 설정해 줄 핀을 설정했으면 이제 출력을 해줘야지. 예제에서는 계속 On Off를 반복하므로 토클만큼 적합한 함수가 없다.
nrf_gpio_pin_toggle
위 함수를 봐도 입력인자는 참 간단하다.
범위를 지정해 줄 수 있는 함수는 아니지만 기존 예제도 보면 뭐 하나하나 켜지고 하나하나 꺼지고 하는 식이라 범위 지정해주는 함수를 썻다면 구현할 수 없었을 거다.
Blink 예제 코드로 구현하기
그래서 코드로 구현하면 위처럼 나온다. 처음 18번 핀부터 22번 핀까지 출력 핀으로 사용할 것임을 지정해 준 뒤에 toggle을 해주면된다. 난 5개의 LED를 제어할 것이므로 for문을 5번을 돌렸다.
Git-Hub에도 코드를 공유해 놓았으니 필요한 사람은 참고하길 바란다.
구동 영상은 아래에 첨부해 두었다.
INPUT 함수 살펴보기
nrf_gpio_range_cfg_input
read로 지정할 핀은 KEY1, KEY2 인데, 각각 16 17번핀에 연결되어 있다.
Output 설정하는 함수랑 똑같다. 다만 입력해야하는 변수가 하나 더 추가되어 있는데 이것은 풀업으로 설정하면 된다.
자세한 것은 아래에 서술하겠다.
nrf_gpio_pin_pull_t
위의 enum을 가서 보면 세 가지가 입력되어 있는데 풀업을 사용할 것이므로, NRF_GPIO_PIN_PULLUP 을 입력하면 된다.
nrf_gpio_pin_write
토글은 ON이던 OFF이던 상관 없이 바뀌기만 하는 것을 원할 때 사용하는 것이다.
지금 On이 되었다가 Off가 되게 하려면 위 함수를 사용해 지정해 주어야한다.
nrf_gpio_pin_read
각 Key 핀의 데이터가 High인지 Low인지 보고 싶을 때 사용하는 핀이다.
기본이 High였다가 Low로 되었을 때를 보고 싶은 것이므로 앞에 !를 붙여줄 필요가 있다.
Button Read 함수 살펴보기
풀링 방식으로 구현하다보니 불이 켜지는 순간에는 버튼이 먹지 않지만, 그래도 Read가 되는 것을 확인하기에는 부족함이 없다.
1초동안 꺼지는 예제인데 어느 버튼을 누르냐에 따라 버튼이 켜지는 것이 다르다.
이것도 깃허브에 코드를 공유해 두었다.
구동 영상은 아래에 있다.
안녕하세요 민지홍님 한가지 궁금한점이 있어
댓글 남깁니다.
nrf_gpio_pins_toggle와 nrf_gpio_pins_set함수의 매개변수에
숫자 그대로를 집어 넣으면 동작하지 않고
nrf_gpio_pins_toggle(1<<i)등 과 같이 비트 단위로 제어해야만 동작되는것을 확인했습니다.
소스코드는
#include
#include
#include “nrf_delay.h”
#include “nrf_gpio.h”
#include “boards.h”
int main(void)
{
// Configure LED-pins as outputs.
nrf_gpio_range_cfg_output(15,18);// p15~p18 out
// Toggle LEDs.
while (true)
{
for (int i = 0; i < 4; i++)
{
nrf_gpio_pins_toggle(1<<(i+15));//p15,p16,p17,p18 toggle
nrf_delay_ms(500);
}
}
}
저는 민지홍님과 다르게 작성해야 동작하는거 같은데
제가 설정을 잘못 만진건가요??
p.s저는 10028보드가 아니라 직접 수정해서 사용하는 커스텀 보드입니다.
안녕하세요 윤성혁님
라이브러리를 몇 버젼을 사용하는지 알 수 없어 정확한 답변을 드리지 못하는 점 양해 부탁드립니다.
노르딕에서 제공하는 도큐먼트에서는 핀 넘버를 기입하기로 되어 있습니다. Ti mcu에서 사용했던 비트필드 방식은 아닌 것으로 알고 있습니다.
Int i가 0부터 시작하지않고 15부터 시작했을 때도 문제가 생기는지 확인해주세요. 참고할만한 링크를 첨부해드리겠습니다.
https://infocenter.nordicsemi.com/index.jsp?topic=%2Fcom.nordic.infocenter.sdk5.v12.2.0%2Fgroup__nrf__gpio.html
빠른답변 감사합니다 ㄷㄷ
제가 SDK 버전을 안적었군요.
현재 사용중인 SDK 버전은 SDK 12.3버전입니다.
nrf_gpio_pins_set() 함수의 매개변수가 MASK 로 되어있어서
혹시나 하는 마음으로 비트 필드를 적용해봤는데 동작했습니다.
조언 주신대로
for (int i = 15; i < 19; i++)
{
nrf_gpio_pins_toggle(i);
nrf_delay_ms(500);
}
으로 수정했으나 동작하지 않았고
nrf_gpio_pins_toggle(1<<i); 로 수정하니 동작됬습니다.
단순 GPIO도 이렇게 복잡하면 나중에 통신같은거 할때는 얼마나 복잡할지 벌써 막막하네요 ㅋㅋ
답변 주셔서 감사합니다.
P.S KEIL에서 제공하는 BLINKY 예제를 활용해서 동작시켰습니다.
윤성혁님
nrf_gpio_pins_toggle함수는 검색해도 안나오는데 빌드가 된게 신기하군요..허허
nrf_gpio_pin_toggle로 시도 부탁드려도 될지요
좋은 하루 보내세요 😉
잘되네요.;;;;;;;;;.
민지홍님 말씀대로 정말 빌드 된게 신기하네요;;;
좀더 자세하게 봐야겠습니다.
빠른 답변 감사합니다
민지홍님도 좋은 하루 보내세요!