nRF5 BLE 初始化

Nordic 常用的藍(lán)牙芯片有nRF52840,nRF52832。對(duì)應(yīng)芯片,廠家也提供了相關(guān)SDK

1. BLE Peripheral Init API

int main()
{
    timers_init();    // app timer初始化,并創(chuàng)建timer
    ble_stack_init();  // 使能協(xié)議棧
    gap_params_init();
    gatt_init();
    advertising_init();
    services_init();
    conn_params_init();
    peer_manager_init();

    application_timers_start();
    advertising_start(erase_bonds);
}

timers_init()

app_timer 初始化,并根據(jù)需求創(chuàng)建timer?!綬TC1】

ble_stack_Init()

使能藍(lán)牙協(xié)議棧

/**@brief Function for initializing the BLE stack.
 *
 * @details Initializes the SoftDevice and the BLE event interrupt.
 */
static void ble_stack_init(void)
{
    ret_code_t err_code;

    err_code = nrf_sdh_enable_request();
    APP_ERROR_CHECK(err_code);

    // Configure the BLE stack using the default settings.
    // Fetch the start address of the application RAM.
    uint32_t ram_start = 0;
    err_code = nrf_sdh_ble_default_cfg_set(APP_BLE_CONN_CFG_TAG, &ram_start);
    APP_ERROR_CHECK(err_code);

    // Enable BLE stack.
    err_code = nrf_sdh_ble_enable(&ram_start);
    APP_ERROR_CHECK(err_code);

    // Register a handler for BLE events.
    NRF_SDH_BLE_OBSERVER(m_ble_observer, APP_BLE_OBSERVER_PRIO, ble_evt_handler, NULL);
}

gap_params_init()

此為gap層初始化。gap層負(fù)責(zé)藍(lán)牙設(shè)備連接功能。
設(shè)置設(shè)備外觀(廣播數(shù)據(jù))、設(shè)置設(shè)備名稱(chēng)(廣播數(shù)據(jù))、設(shè)置連接參數(shù)。

/**@brief Function for the GAP initialization.
 *
 * @details This function sets up all the necessary GAP (Generic Access Profile) parameters of the
 *          device including the device name, appearance, and the preferred connection parameters.
 */
static void gap_params_init(void)
{
    ret_code_t              err_code;
    ble_gap_conn_params_t   gap_conn_params;
    ble_gap_conn_sec_mode_t sec_mode;

    BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode);

    err_code = sd_ble_gap_device_name_set(&sec_mode,
                                          (const uint8_t *)DEVICE_NAME,
                                          strlen(DEVICE_NAME));
    APP_ERROR_CHECK(err_code);

    err_code = sd_ble_gap_appearance_set(BLE_APPEARANCE_HEART_RATE_SENSOR_HEART_RATE_BELT);
    APP_ERROR_CHECK(err_code);

    memset(&gap_conn_params, 0, sizeof(gap_conn_params));

    gap_conn_params.min_conn_interval = MIN_CONN_INTERVAL;
    gap_conn_params.max_conn_interval = MAX_CONN_INTERVAL;
    gap_conn_params.slave_latency     = SLAVE_LATENCY;
    gap_conn_params.conn_sup_timeout  = CONN_SUP_TIMEOUT;

    err_code = sd_ble_gap_ppcp_set(&gap_conn_params);
    APP_ERROR_CHECK(err_code);
}

gatt_init()

初始化 GATT。

/**@brief Function for initializing the GATT module. */
static void gatt_init(void)
{
    ret_code_t err_code = nrf_ble_gatt_init(&m_gatt, NULL);
    APP_ERROR_CHECK(err_code);
}

advertising_init()

設(shè)置廣播間隔,廣播時(shí)間。

/**@brief Function for initializing the Advertising functionality.
 */
static void advertising_init(void)
{
    ret_code_t             err_code;
    ble_advertising_init_t init;

    memset(&init, 0, sizeof(init));

    init.advdata.name_type               = BLE_ADVDATA_FULL_NAME;
    init.advdata.include_appearance      = true;
    init.advdata.flags                   = BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE;
    init.advdata.uuids_complete.uuid_cnt = sizeof(m_adv_uuids) / sizeof(m_adv_uuids[0]);
    init.advdata.uuids_complete.p_uuids  = m_adv_uuids;

    init.config.ble_adv_fast_enabled  = true;
    init.config.ble_adv_fast_interval = APP_ADV_INTERVAL;
    init.config.ble_adv_fast_timeout  = APP_ADV_DURATION;

    init.evt_handler = on_adv_evt;

    err_code = ble_advertising_init(&m_advertising, &init);
    APP_ERROR_CHECK(err_code);

    ble_advertising_conn_cfg_tag_set(&m_advertising, APP_BLE_CONN_CFG_TAG);
}

services_init()

藍(lán)牙服務(wù)列表初始化。

conn_params_init()

peer_manager_init()

application_timers_start()

advertising_start()


2. 常見(jiàn)操作

2.1 修改設(shè)備名稱(chēng)

一般藍(lán)牙設(shè)備的名稱(chēng)是按照 “固定名稱(chēng) + 部分MAC地址” 的形式。
在SDK中,設(shè)備固定名稱(chēng)定義為宏DEVICE_NAME,后面加部分MAC地址,在gap_params_init()函數(shù)中實(shí)現(xiàn)。

2.2 廣播間隔

廣播間隔在SDK中,定義為APP_ADV_INTERVAL宏。廣播間隔值為:APP_ADV_INTERVAL * 0.625 ms。

The advertising interval (in units of 0.625 ms. 300 corresponds to 187.5 ms).

2.3 廣播時(shí)間

同廣播間隔一樣,廣播時(shí)間同樣定義了APP_ADV_DURATION宏。廣播時(shí)間值為:APP_ADV_DURATION * 10 ms。

The advertising duration 18000 (180 seconds) in units of 10 milliseconds.

2.4 連接間隔

連接間隔,可在代碼的宏定義中找到:MIN_CONN_INTERVAL、MAX_CONN_INTERVAL。

#define MIN_CONN_INTERVAL        MSEC_TO_UNITS(400, UNIT_1_25_MS)        /**< Minimum acceptable connection interval (0.4 seconds). */
#define MAX_CONN_INTERVAL        MSEC_TO_UNITS(650, UNIT_1_25_MS)        /**< Maximum acceptable connection interval (0.65 second). */

2.5 MTU設(shè)置

MTU的設(shè)置,可修改sdk_config.h文件中的 NRF_SDH_BLE_GATT_MAX_MTU_SIZE 宏的值來(lái)實(shí)現(xiàn)。Demo中MTU缺省值為247。應(yīng)用中的推薦設(shè)置:MTU為158,連接間隔為50ms。

2.6 增加服務(wù)

服務(wù)UUID設(shè)置?character UUID設(shè)置?characteristic 屬性設(shè)置?屬性實(shí)現(xiàn)?

附A:參考資料

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容