bsp는 Board Support Package로 검색해보면 부트로더와 함께 생성되고 하드웨어 보드의
모든 장치를 위한 장치 드라이버를 말한다고 되어있는데 좀 이해하기 힘드네요;;(출처 : 위키)
아무튼~한번 다운로딩받아서 실행해 보면 좀 더 이해가 빠르겠죠?
이번 예제는 버튼(버튼 1과 버튼2)를 누를때마다 상태가 변하고, LED가 변하고, 상태를 uart로 알려줍니다.
UART는 P0.11 - Rx, P0.9 - Tx, Vdd와 Gnd를 이용하여 PC와 연결하였습니다.
main.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #include <stdbool.h> #include <stdint.h> #include "boards.h" #include "bsp.h" #include "app_timer.h" #include "app_gpiote.h" #include "nordic_common.h" #include "nrf_error.h" #define APP_TIMER_PRESCALER 0 /**< Value of the RTC1 PRESCALER register. */ #define APP_TIMER_MAX_TIMERS (1 + BSP_APP_TIMERS_NUMBER) /**< Maximum number of simultaneously created timers. */ #define APP_TIMER_OP_QUEUE_SIZE 2 /**< Size of timer operation queues. */ #define BUTTON_PREV_ID 0 /**< Button used to switch the state. */ #define BUTTON_NEXT_ID 1 /**< Button used to switch the state. */ #define UART_TX_BUF_SIZE 256 /**< UART TX buffer size. */ #define UART_RX_BUF_SIZE 1 /**< UART RX buffer size. */ bsp_indication_t actual_state = BSP_INDICATE_FIRST; /**< Currently indicated state. */ const char * indications_list[] = BSP_INDICATIONS_LIST; | cs |
먼저 include와 define들입니다.
20 : bsp_indication_t, BSP_INDICATE_FIRST는 bsp.h에 define되어있습니다.
bsp indication의 상태값은 enum으로 선언되어 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | typedef enum { BSP_INDICATE_FIRST = 0, BSP_INDICATE_IDLE = BSP_INDICATE_FIRST, /**< See \ref BSP_INDICATE_IDLE.*/ BSP_INDICATE_SCANNING, /**< See \ref BSP_INDICATE_SCANNING.*/ BSP_INDICATE_ADVERTISING, /**< See \ref BSP_INDICATE_ADVERTISING.*/ BSP_INDICATE_ADVERTISING_WHITELIST, /**< See \ref BSP_INDICATE_ADVERTISING_WHITELIST.*/ BSP_INDICATE_ADVERTISING_SLOW, /**< See \ref BSP_INDICATE_ADVERTISING_SLOW.*/ BSP_INDICATE_ADVERTISING_DIRECTED, /**< See \ref BSP_INDICATE_ADVERTISING_DIRECTED.*/ BSP_INDICATE_BONDING, /**< See \ref BSP_INDICATE_BONDING.*/ BSP_INDICATE_CONNECTED, /**< See \ref BSP_INDICATE_CONNECTED.*/ BSP_INDICATE_SENT_OK, /**< See \ref BSP_INDICATE_SENT_OK.*/ BSP_INDICATE_SEND_ERROR, /**< See \ref BSP_INDICATE_SEND_ERROR.*/ BSP_INDICATE_RCV_OK, /**< See \ref BSP_INDICATE_RCV_OK.*/ BSP_INDICATE_RCV_ERROR, /**< See \ref BSP_INDICATE_RCV_ERROR.*/ BSP_INDICATE_FATAL_ERROR, /**< See \ref BSP_INDICATE_FATAL_ERROR.*/ BSP_INDICATE_ALERT_0, /**< See \ref BSP_INDICATE_ALERT_0.*/ BSP_INDICATE_ALERT_1, /**< See \ref BSP_INDICATE_ALERT_1.*/ BSP_INDICATE_ALERT_2, /**< See \ref BSP_INDICATE_ALERT_2.*/ BSP_INDICATE_ALERT_3, /**< See \ref BSP_INDICATE_ALERT_3.*/ BSP_INDICATE_ALERT_OFF, /**< See \ref BSP_INDICATE_ALERT_OFF.*/ BSP_INDICATE_USER_STATE_OFF, /**< See \ref BSP_INDICATE_USER_STATE_OFF.*/ BSP_INDICATE_USER_STATE_0, /**< See \ref BSP_INDICATE_USER_STATE_0.*/ BSP_INDICATE_USER_STATE_1, /**< See \ref BSP_INDICATE_USER_STATE_1.*/ BSP_INDICATE_USER_STATE_2, /**< See \ref BSP_INDICATE_USER_STATE_2.*/ BSP_INDICATE_USER_STATE_3, /**< See \ref BSP_INDICATE_USER_STATE_3.*/ BSP_INDICATE_USER_STATE_ON, /**< See \ref BSP_INDICATE_USER_STATE_ON.*/ BSP_INDICATE_LAST = BSP_INDICATE_USER_STATE_ON } bsp_indication_t; | cs |
22 :BSP_INDICATIONS_LIST 역시 bsp.h에 define되어 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | #define BSP_INDICATIONS_LIST { \ "BSP_INDICATE_IDLE\n\r", \ "BSP_INDICATE_SCANNING\n\r", \ "BSP_INDICATE_ADVERTISING\n\r", \ "BSP_INDICATE_ADVERTISING_WHITELIST\n\r", \ "BSP_INDICATE_ADVERTISING_SLOW\n\r", \ "BSP_INDICATE_ADVERTISING_DIRECTED\n\r", \ "BSP_INDICATE_BONDING\n\r", \ "BSP_INDICATE_CONNECTED\n\r", \ "BSP_INDICATE_SENT_OK\n\r", \ "BSP_INDICATE_SEND_ERROR\n\r", \ "BSP_INDICATE_RCV_OK\n\r", \ "BSP_INDICATE_RCV_ERROR\n\r", \ "BSP_INDICATE_FATAL_ERROR\n\r", \ "BSP_INDICATE_ALERT_0\n\r", \ "BSP_INDICATE_ALERT_1\n\r", \ "BSP_INDICATE_ALERT_2\n\r", \ "BSP_INDICATE_ALERT_3\n\r", \ "BSP_INDICATE_ALERT_OFF\n\r", \ "BSP_INDICATE_USER_STATE_OFF\n\r", \ "BSP_INDICATE_USER_STATE_0\n\r", \ "BSP_INDICATE_USER_STATE_1\n\r", \ "BSP_INDICATE_USER_STATE_2\n\r", \ "BSP_INDICATE_USER_STATE_3\n\r", \ "BSP_INDICATE_USER_STATE_ON\n\r" \ } | cs |
배열 indication_list에 위의 string을 넣어줍니다.(uart에 뿌려줄 용도)
메인함수를 볼께요.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | int main(void) { uint32_t err_code = NRF_SUCCESS; clock_initialization(); APP_TIMER_INIT(APP_TIMER_PRESCALER, APP_TIMER_MAX_TIMERS, APP_TIMER_OP_QUEUE_SIZE, false); APP_GPIOTE_INIT(1); const app_uart_comm_params_t comm_params = { RX_PIN_NUMBER, TX_PIN_NUMBER, RTS_PIN_NUMBER, CTS_PIN_NUMBER, APP_UART_FLOW_CONTROL_ENABLED, false, UART_BAUDRATE_BAUDRATE_Baud38400 }; APP_UART_FIFO_INIT(&comm_params, UART_RX_BUF_SIZE, UART_TX_BUF_SIZE, uart_error_handle, APP_IRQ_PRIORITY_LOW, err_code); APP_ERROR_CHECK(err_code); bsp_configuration(); err_code = bsp_indication_text_set(actual_state,indications_list[actual_state]); APP_ERROR_CHECK(err_code); while (true) { // no implementation needed } } | cs |
Line 5 : 사용 할 클럭을 초기화 해 줍니다.(이 부분은 밑에서~)
Line 6 : APP_TIMER_INIT은 app_timer.h에 define 되어있습니다.
APP_TIMER_INIT(분주,타이머 개수, 동작 타이머 큐 사이즈, 스케줄러 사용여부);
1 2 3 4 5 | #define APP_TIMER_PRESCALER 0 /**< Value of the RTC1 PRESCALER register. */ #define APP_TIMER_MAX_TIMERS (1 + BSP_APP_TIMERS_NUMBER) /**< Maximum number of simultaneously created timers. */ #define APP_TIMER_OP_QUEUE_SIZE 2 #define BSP_APP_TIMERS_NUMBER 2 | cs |
분주는 0, 타이머 갯수는 3, 타이머 큐는 2, 스케줄은 사용안하는 군요.
Line 7 : GPIOTE를 초기화하는데, GPIOTE는 GPIO TASK and EVENT인듯.
어떠한 event(rising edge, falling edgd, any change등)dp gpio pin을 task(set, clear, toggle)해주는
놈입니다.
괄호안의 숫자는 maxium user라고 되어있네요.
이 값이 GPIOTE의 buffer size를 결정하는 것 같습니다.
APP_GPIOTE_INIT은 app_gpiote.h에 define되어 있습니다.
Line 9~18 : uart를 초기화하는 부분
app_uart_comm_params_t는 app_uart.h에 define되어있고, pin 번호와 baudrate등의 정보를 담는
구조체입니다.
Line 20~25 : uart를 일반적인 uart와 fifo and uart로 초기화할 수 있는데 후자의 초기화입니다.
fifo를 사용하게 되면 RX,TX buffer size를 정해줘야 합니다.(이미 위쪽에서 define했습니다.)
Line 27 : bsp 설정하는 부분입니다.
1 2 3 4 5 6 7 8 | void bsp_configuration() { uint32_t err_code; err_code = bsp_init(BSP_INIT_LED | BSP_INIT_BUTTONS, APP_TIMER_TICKS(100, APP_TIMER_PRESCALER), bsp_evt_handler); err_code = bsp_buttons_enable( (1 << BUTTON_PREV_ID) | (1 << BUTTON_NEXT_ID) ); APP_ERROR_CHECK(err_code); } | cs |
4 : bsp_init은 bsp.h에 define되어있는데, bsp_evt_handler는 event 발생시 콜백되는함수입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | void bsp_evt_handler(bsp_event_t evt) { uint32_t err_code; switch (evt) { case BSP_EVENT_KEY_0: if (actual_state != BSP_INDICATE_FIRST) actual_state--; else actual_state = BSP_INDICATE_LAST; break; case BSP_EVENT_KEY_1: if (actual_state != BSP_INDICATE_LAST) actual_state++; else actual_state = BSP_INDICATE_FIRST; break; default: return; // no implementation needed } err_code = bsp_indication_text_set(actual_state, indications_list[actual_state]); APP_ERROR_CHECK(err_code); } | cs |
이 부분이 핵심입니다.
4~24 : event(버튼입력)가 발생하게되면, switch-case문에서 bsp_indicate state를 바꿉니다.
26 : 바뀐 bsp_indication에 따라 uart로 출력되고, led 상태도 변하게 됩니다.
bsp_indication_text_set은 bsp.h에 define되어있습니다.
1 2 3 4 5 6 7 8 9 10 | uint32_t bsp_indication_text_set(bsp_indication_t indicate, char const * p_text) { uint32_t err_code = bsp_indication_set(indicate); #ifdef BSP_UART_SUPPORT printf("%s", p_text); #endif // BSP_UART_SUPPORT return err_code; } | cs |
3 : led 상태변화부분
6 : uart 출력부분
'Study > nRF51xxx(BLE)' 카테고리의 다른 글
nRF51 DK 예제 5 -GPIOTE (0) | 2015.03.02 |
---|---|
nRF51 DK 예제4 flashwrite (0) | 2015.03.02 |
nRF51 DK 예제 2 LED blinky_rtx (0) | 2015.02.26 |
nRF51 DK 예제 1 LED blinky (2) | 2015.02.26 |
nRF51 DK 비콘모드 설정 (0) | 2015.02.24 |