시작하기
앞서 blinky 예제를 실행하고 그 결과를 확인해보았다. 그렇다면 이번에는 blinky 예제를 자세히 들여다보도록 하자.
blinky 예제에서는 BSP 모듈을 사용하여 GPIO 핀을 출력으로 구성하는 방법을 보여 줍니다. |
int main(void)
{
/* Configure board. */
bsp_board_init(BSP_INIT_LEDS);
/* Toggle LEDs. */
while (true)
{
for (int i = 0; i < LEDS_NUMBER; i++)
{
bsp_board_led_invert(i);
nrf_delay_ms(500);
}
}
}
main 함수를 살펴보면 blinky 예제는 세 부분으로 나눌 수 있다.
BSP 모듈을 사용하여 GPIO 출력 설정, GPIO를 토글, 500ms 시간 지연을 해주는 부분이다.
그냥 이렇게 봐서는 어떤 방법으로 함수들이 동작하는지 감이 오지 않는다.
함수 위치에서 우클릭을 해서 콘텍스트 메뉴를 열고 Go To Definition(단축키 ALT+G)을 선택하면 함수가 정의된 곳으로 안내한다.
void bsp_board_init(uint32_t init_flags)
{
#if defined(BOARDS_WITH_USB_DFU_TRIGGER) && defined(BOARD_PCA10059)
(void) nrf_dfu_trigger_usb_init();
#endif
#if LEDS_NUMBER > 0
if (init_flags & BSP_INIT_LEDS)
{
bsp_board_leds_init();
}
#endif //LEDS_NUMBER > 0
#if BUTTONS_NUMBER > 0
if (init_flags & BSP_INIT_BUTTONS)
{
bsp_board_buttons_init();
}
#endif //BUTTONS_NUMBER > 0
}
bsp_board_init 함수를 살펴보면 LED와 버튼을 설정하는 것으로 보인다.
LED 부분만 확인할 것이므로 여기서는 bsp_board_leds_init 함수가 정의된 곳으로 가보자.
static void bsp_board_leds_init(void)
{
#if defined(BOARD_PCA10059)
// If nRF52 USB Dongle is powered from USB (high voltage mode),
// GPIO output voltage is set to 1.8 V by default, which is not
// enough to turn on green and blue LEDs. Therefore, GPIO voltage
// needs to be increased to 3.0 V by configuring the UICR register.
if (NRF_POWER->MAINREGSTATUS &
(POWER_MAINREGSTATUS_MAINREGSTATUS_High << POWER_MAINREGSTATUS_MAINREGSTATUS_Pos))
{
gpio_output_voltage_setup();
}
#endif
uint32_t i;
for (i = 0; i < LEDS_NUMBER; ++i)
{
nrf_gpio_cfg_output(m_board_led_list[i]);
}
bsp_board_leds_off();
}
미리 정의해둔 LED 개수만큼 GPIO를 출력 포트로 설정하는 것으로 보인다. nrf_gpio_cfg_output 함수가 정의된 곳으로 가보자.
__STATIC_INLINE void nrf_gpio_cfg_output(uint32_t pin_number)
{
nrf_gpio_cfg(
pin_number,
NRF_GPIO_PIN_DIR_OUTPUT,
NRF_GPIO_PIN_INPUT_DISCONNECT,
NRF_GPIO_PIN_NOPULL,
NRF_GPIO_PIN_S0S1,
NRF_GPIO_PIN_NOSENSE);
}
핀 번호를 매개변수로 받아 해당 GPIO를 출력 포트로 설정해주고 있다.
이제 nrf_gpio_cfg_output 함수를 사용해서 어떤 핀이든 GPIO를 출력 포트로 설정할 수 있다는 것을 알게 되었다.
이번에는 bsp_board_led_off 함수가 정의된 곳을 가보자.
void bsp_board_led_off(uint32_t led_idx)
{
ASSERT(led_idx < LEDS_NUMBER);
nrf_gpio_pin_write(m_board_led_list[led_idx], LEDS_ACTIVE_STATE ? 0 : 1);
}
LED 번호를 매개변수로 받아 그 위치의 LED를 꺼주는 함수이다. 여기서 주목해야 하는 부분은 nrf_gpio_pin_write 함수이다.
__STATIC_INLINE void nrf_gpio_pin_write(uint32_t pin_number, uint32_t value)
{
if (value == 0)
{
nrf_gpio_pin_clear(pin_number);
}
else
{
nrf_gpio_pin_set(pin_number);
}
}
nrf_gpio_pin_write 함수를 보면 핀 번호와 값을 매개변수로 받아 해당 GPIO의 상태를 변경해주는 것으로 보인다.
즉, 값으로 0이 들어오면 GPIO 포트는 clear 상태가 되고 0 이외의 값이 들어오면 set 상태가 된다.
이 부분이 실제로 어떻게 LED를 작동시키는지 nRF52 DK의 LED 회로를 살펴보자.
노르딕 사이트에서 회로도를 다운로드하기 위해 확인해보니 2.0.0이 최신 버전이다.
하지만 가지고 있는 nRF52 DK는 2.1.0이라고 적혀있다. 뭐 크게 상관은 없을 테니 받아준다.
회로도는 \PCA10040-nRF52832 Bluetooth Smart,ANT,2.4GHz RF Development Board 2_0_0\Schematic_Layout pdf files 폴더에 있다.
회로도를 살펴보면 LED는 핀 번호 17, 18, 19, 20에 연결되어 있으며 GPIO 포트 출력이 clear 상태일 때 LED가 켜지는 것을 알 수 있다.
소스코드 상에서 회로도에 나온대로 핀 번호가 출력 포트로 설정되는지 확인하기 위해서 bsp_board_leds_init 함수를 다시 살펴보자.
nrf_gpio_cfg_output(m_board_led_list[i]);
nrf_gpio_cfg_output 함수에 m_board_led_list가 전달 인자로 되어 있는 것을 볼 수 있다.
그렇다면 m_board_led_list에는 회로도에서 확인한 핀 번호 17, 18, 19, 20이 들어있는지 확인해보자.
static const uint8_t m_board_led_list[LEDS_NUMBER] = LEDS_LIST;
m_board_led_list가 선언된 곳을 보니 LEDS_LIST가 값으로 정의되어 있고 이 값은 pca10040.h 헤더 파일에 정의되어 있다.
// LEDs definitions for PCA10040
#define LEDS_NUMBER 4
#define LED_START 17
#define LED_1 17
#define LED_2 18
#define LED_3 19
#define LED_4 20
#define LED_STOP 20
#define LEDS_ACTIVE_STATE 0
#define LEDS_INV_MASK LEDS_MASK
#define LEDS_LIST { LED_1, LED_2, LED_3, LED_4 }
LEDS_LIST가 정의된 값을 보니 회로도와 일치하는 것을 확인할 수 있다.
이렇게 해서 blinky 예제에서 GPIO 핀을 출력 포트로 설정하는 방법과 GPIO 출력 상태를 변경하는 방법에 대해서 자세히 알아보았다.
앞으로
노르딕에서 제공해주는 SDK에 있는 모든 예제들을 확인해보고 싶지만 아쉽게도 nRF52 DK만으로는 못하는 것들이 많다.
회로도를 살펴보면 알 수 있듯이 nRF52 DK에서 개발자가 제어 가능한 부분은 LED와 버튼 정도밖에 없다.
그래서 주변기기 예제는 LED와 버튼까지만 확인해보고 바로 BLE 예제들로 넘어가도록 하자.
'Embedded > nRF52 BLE 개발 안내서' 카테고리의 다른 글
nRF52 BLE 개발하기 - pin_change_int (5) | 2021.01.11 |
---|---|
nRF52 BLE 개발하기 - led_softblink (0) | 2021.01.02 |
nRF52 개발환경 구축하기 - SES를 설치하고 LED를 밝혀보자 (2) | 2020.12.31 |
nRF52 개발환경 구축하기 - SDK를 다운로드 받아보자 (0) | 2020.12.30 |
nRF52 BLE를 개발하는 프로그래머를 위한 안내서 (1) | 2020.12.29 |
댓글