본문 바로가기
Study/nRF51xxx(BLE)

nRF51 DK 예제3 bsp

by Answer Choi 2015. 2. 27.
반응형


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들입니다.


20bsp_indication_t, BSP_INDICATE_FIRSTbsp.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_INITapp_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_INITapp_gpiote.h에 define되어 있습니다.


Line 9~18 : uart를  초기화하는 부분


app_uart_comm_params_tapp_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

인기글