帖子这么快就沉了,继续轰炸。
星期天有个漂亮MM加了我微信
一看我去师妹,最后还认识我
我却什么看也不认识不说了学美图秀秀去。
前天在路上偶遇了以为大师
“大师有什么方法可以让我更帅一点呢”
“你家有电脑不?”
“大师我懂了,勤奋学习成为一个优秀的程序猿,以内补外”。
“你丫有病吧,我让你回家P图去”。
好了,我还是给大家解读下51822这个有魅力的蓝牙芯片吧。
百度手环正是使用了这一芯片加一个加速度传感器和两个电机。
我们来下他的官方提供的HRM(心率)代码。
int main(void)
{
uint32_t err_code;
timers_init();//定时器初始化
gpiote_init();//led_init
buttons_init();//按键初始化
ble_stack_init();//蓝牙协议初始化
bond_manager_init();//绑定
// Initialize Bluetooth Stack parameters
gap_params_init();
advertising_init();//广播初始化
services_init();//服务
conn_params_init();//连接
sec_params_init();//安全参数
// Start advertising
advertising_start();//开始广播
// Enter main loop
for (;;)
{
// Switch to a low power state until an event is avai //lable for the application
err_code = sd_app_evt_wait();
APP_ERROR_CHECK(err_code);
}
}
初始化中有几个重要的函数
static void timers_init(void)
{
uint32_t err_code;
// Initialize timer module
APP_TIMER_INIT(APP_TIMER_PRESCALER, APP_TIMER_MAX_TIMERS, APP_TIMER_OP_QUEUE_SIZE, false);
// Create timers时间到之后电量处理
err_code = app_timer_create(&m_battery_timer_id,
APP_TIMER_MODE_REPEATED,
battery_level_meas_timeout_handler);
APP_ERROR_CHECK(err_code);
//时间到之后心率数据处理
err_code = app_timer_create(&m_heart_rate_timer_id,
APP_TIMER_MODE_REPEATED,
heart_rate_meas_timeout_handler);
APP_ERROR_CHECK(err_code);
}
我们进心率中断函数看看
static void heart_rate_meas_timeout_handler(void * p_context)
{
uint32_t err_code;
UNUSED_PARAMETER(p_context);
err_code = ble_hrs_heart_rate_measurement_send(&m_hrs, m_cur_heart_rate);
}
其实就是把心率数据发送到手机,那心率数据取得在那呢?不急往下
static void buttons_init(void)
{
static app_button_cfg_t buttons[] =
{
{HR_INC_BUTTON_PIN_NO, false, BUTTON_PULL, button_event_handler},
{HR_DEC_BUTTON_PIN_NO, false, BUTTON_PULL, button_event_handler} // Note: This pin is also BONDMNGR_DELETE_BUTTON_PIN_NO
};
APP_BUTTON_INIT(buttons, sizeof(buttons) / sizeof(buttons[0]), BUTTON_DETECTION_DELAY, false);
}
用中断的方式定义了两个按键,进中断函数
static void button_event_handler(uint8_t pin_no, uint8_t button_action)
{
if (button_action == APP_BUTTON_PUSH)
{
switch (pin_no)
{
case HR_INC_BUTTON_PIN_NO:
// Increase Heart Rate measurement
m_cur_heart_rate += HEART_RATE_CHANGE;
if (m_cur_heart_rate > MAX_HEART_RATE){
m_cur_heart_rate = MIN_HEART_RATE; }
break;
case HR_DEC_BUTTON_PIN_NO:
m_cur_heart_rate -= HEART_RATE_CHANGE;
if (m_cur_heart_rate < MIN_HEART_RATE){
m_cur_heart_rate = MAX_HEART_RATE; }
break;
default:
APP_ERROR_HANDLER(pin_no);
break;
}
}
}
哎哎,, m_cur_heart_rate这不是要发送的数据吗,原来是用按键模拟心率啊。有点明朗了继续
static void ble_stack_init(void)
{
uint32_t err_code;
// Initialize the SoftDevice handler module.
SOFTDEVICE_HANDLER_INIT(NRF_CLOCK_LFCLKSRC_XTAL_20_PPM, false);
// Register with the SoftDevice handler module for BLE events
err_code = softdevice_ble_evt_handler_set(ble_evt_dispatch);
APP_ERROR_CHECK(err_code);
err_code = softdevice_sys_evt_handler_set(sys_evt_dispatch);
APP_ERROR_CHECK(err_code);
}
还不知干啥的没关系进ble_evt_dispatch去看看
static void ble_evt_dispatch(ble_evt_t * p_ble_evt)
{
ble_bondmngr_on_ble_evt(p_ble_evt);
ble_hrs_on_ble_evt(&m_hrs, p_ble_evt);
ble_bas_on_ble_evt(&bas, p_ble_evt);
ble_conn_params_on_ble_evt(p_ble_evt);
on_ble_evt(p_ble_evt);
}
这些应该都是中断时蓝牙的一下处理
重点看看on_ble_evt(p_ble_evt);
nrf_gpio_cfg_sense_input配置唤醒引脚。
可以看出来这是做蓝牙连接、断开等中断的处理。
蓝牙连接时启动定时器,时能按键,初始化心率值。
蓝牙超时进行休眠等等。
接着往下
services_init();//服务
这个就不进去看了,主要工作是给蓝牙添加服务,比如心率、电量等
我们要自己添加服务的时候模仿里面的添加一个就行了。
gap_params_init里面的
sd_ble_gap_appearance_set(BLE_APPEARANCE_HEART_RATE_SENSOR_HEART_RATE_BELT);需要说一下这个是设置外观值,手机APP可以根据这个外观值知道是哪个蓝牙。
好了,看起来有点复杂。
总结一下我们要用重要的步奏
buttons_init();//按键初始化在中断里面体现动作
timers_init();//定时器初始化在中断里面体现动作
ble_stack_init();//蓝牙协议初始化在里面添加ble_hrs_on_ble_evt(&m_hrs, p_ble_evt);在on_ble_evt(p_ble_evt);做定时器启动,休眠,亮灯等,
services_init();//添加服务。