BLE协议栈的初始化实现了三个部分的功能:初始化时钟,协议栈使能,回调派发函数使能。
1.初始化时钟
BLE协议栈时钟有一下三个选项,功耗由低至高排序:
#define NRF_CLOCK_LF_SRC_XTAL (1) /**< LFCLK crystal oscillator. */
#define NRF_CLOCK_LF_SRC_RC (0) /**< LFCLK RC oscillator. */
#define NRF_CLOCK_LF_SRC_SYNTH (2) /**< LFCLK Synthesized from HFCLK. */
推荐使用XTAL外部晶振时钟。
2.协议栈使能
由于蓝牙协议栈本身是不开源的,只留出接口让用户直接传入参数,因此协议栈的使能是十分简单的,本质是为蓝牙协议栈事件分配RAM空间。
ble_enable_params_t ble_enable_params;
err_code = softdevice_enable_get_default_config(CENTRAL_LINK_COUNT,
PERIPHERAL_LINK_COUNT,
&ble_enable_params);
APP_ERROR_CHECK(err_code);
CHECK_RAM_START_ADDR(CENTRAL_LINK_COUNT,PERIPHERAL_LINK_COUNT);//根据主从机链接数分配空间
//使能协议栈
err_code = softdevice_enable(&ble_enable_params);
APP_ERROR_CHECK(err_code);
3.回调派发函数使能
协议栈初始化的重点在于回调派发函数的使能,由于nRF51/52系列蓝牙处理芯片并不带操作系统,因此其事件处理采用派发方式。当蓝牙协议栈有事件需要处理时就会用到蓝牙事件派发,当系统有事件需要处理时就会用到系统事件派发。
协议栈会通过ble_evt_dispatch(or sys_evt_dispatch)将和BLE有关的事件上抛给服务函数,给出事件id。每个处理函数处理的事件,在事件结构体ble_evt_t通过id标注,不同服务函数只关心和自己有关的事件id。