睡眠模式,连接和断开通知

⚠️
大家好. .谢谢你来到论坛。令人兴奋的消息!我们现在正在转移到新的论坛平台,它将提供更好的功能,包含在主对话网站中。所有岗位和账户都已迁移。我们现在只接受新论坛的流量-请在上面发布任何新帖子//www.xmece.com/support.我们将在未来几天修复bug /优化搜索和标记。
2个帖子/ 0个新
最后发表
Kevleo94
离线
最后看到:2年10个月前
加入:2017-09-05 07:18
睡眠模式,连接和断开通知

亲爱的对话框支持,
我的名字叫凯文。我有2个项目,我使用ble_peripheral_example作为我的基本。我使用DA14580 devkit基本。我仍然不知道应该把程序放在哪里。
1.我想在da14580连接任何蓝牙设备时打开led,在da14580没有连接任何设备时关闭led。此外,当它连接时,我想让它进入睡眠模式,但我想唤醒它每次我通过ble给命令,但当它断开连接时,da14580去arch_ext_sleep。
2.我想要打开led当我按2次按钮,然后led亮一段时间,然后再关闭。如果按钮只按1次,那么什么也不做。我为此使用的按钮与我使用中断唤醒MCU的按钮相同。以下是user_peripheral.c中的程序,是否正确?

/**
****************************************************************************************

* @file user_peripheral.c

* @brief外围项目源代码。

*版权所有(C) 2015。yabo国际娱乐对话半导体有限公司,未出版作品。这台电脑
*程序包含机密,专有信息,是商业机密
*天yabo国际娱乐宇半导体有限公司禁止所有使用、披露和/或复制
*除非得到书面授权。保留所有权利。

*和贡献者。

****************************************************************************************
*/

/**
****************************************************************************************
* @addtogroup应用
* @ {
****************************************************************************************
*/

/*
*包含文件
****************************************************************************************
*/

#include "rwip_config.h" // SW配置
# include“user_peripheral.h”
# include“user_custs1_impl.h”
# include“arch_api.h”
# include“user_custs1_def.h”
# include“gap.h”
# include“pwm.h”
# include“app_default_handlers.h”
# include“wkupct_quadec.h”
# include“gpio.h”
# include“user_periph_setup.h”

/*
*类型定义
****************************************************************************************
*/

//制造商特定数据ADV结构类型
struct mnf_specific_data_ad_structure

uint8_t ad_structure_size;
uint8_t ad_structure_type;
uint8_t 亚博全网company_id [APP_AD_MSD_COMPANY_ID_LEN];
uint8_t proprietary_data [APP_AD_MSD_DATA_LEN];
};

/*
*全局变量定义
****************************************************************************************
*/

uint8_t app_connection_idx;
timer_hnd app_adv_data_update_timer_used;
timer_hnd app_param_update_request_timer_used;

//制造商特定数据
mnf_specific_data_ad_structure mnf_data __attribute__(((section(“retention_mem_area0”),zero_init));/ / @RETENTION记忆

/*
*函数定义
****************************************************************************************
*/

/**
****************************************************************************************
* @brief初始化制造商特定数据
* @return无效
****************************************************************************************
*/
静态孔隙mnf_data_init ()

mnf_data。ad_struct (mnf_specific_data_ad_structure) - sizeof(uint8_t);//减去ad_structure_size字段的大小
mnf_data。ad_structure_type = GAP_AD_TYPE_MANU_SPECIFIC_DATA;
mnf_data.亚博全网company_id[0] = APP_AD_MSD_COMPANY_ID & 0xFF;/ / LSB
mnf_data.亚博全网company_id[1] = (APP_AD_MSD_COMPANY_ID >> 8)& 0xFF;/ /最高有效位
mnf_data。proprietary_data [0] = 0;
mnf_data。proprietary_data [1] = 0;

/**
****************************************************************************************
* @brief更新制造商特定数据
* @return无效
****************************************************************************************
*/
静态孔隙mnf_data_update ()

uint16_t数据;

data = mnf_data。proprietary_data [0] | (mnf_data。proprietary_data [1] < < 8);
数据+ = 1;
mnf_data。[0] = data & 0xFF;
mnf_data。proprietary_data[1] = (data >> 8) & 0xFF;

if (data == 0xFFFF) {
mnf_data。proprietary_data [0] = 0;
mnf_data。proprietary_data [1] = 0;

/**
****************************************************************************************
* @brief广告数据定时器更新回调函数。
* @return无效
****************************************************************************************
*/
静态孔隙adv_data_update_timer_cb ()

app_easy_gap_advertise_stop ();

/**
****************************************************************************************
* @brief参数更新请求定时器回调函数。
* @return无效
****************************************************************************************
*/
静态孔隙param_update_request_timer_cb ()

app_easy_gap_param_update_start (app_connection_idx);
app_param_update_request_timer_used = EASY_TIMER_INVALID_TIMER;

空白user_app_init(空白)

app_param_update_request_timer_used = EASY_TIMER_INVALID_TIMER;

//初始化制造商特定数据
mnf_data_init ();

default_app_on_init ();

/**
* @brief在GAPM_START_ADVERTISE_CMD参数结构的“发布或扫描响应数据”中添加AD结构。
@param[in] cmd GAPM_START_ADVERTISE_CMD参数结构
@param[in] ad_struct_data AD结构缓冲区
* @param[in] ad_struct_len AD结构长度
* @return无效
*/
Static void ad_add_ad_struct (struct gapm_start_advertise_cmd *cmd, void *ad_struct_data, uint8_t ad_struct_len)

if ((APP_ADV_DATA_MAX_SIZE - cmd->info.host.adv_data_len) >= ad_struct_len)

/ /复制数据
memcpy (cmd - > info.host.adv_data [cmd - > info.host。adv_data_len], ad_struct_data ad_struct_len);

//更新广告数据长度
cmd - > info.host。adv_data_len + = ad_struct_len;

else if ((APP_SCAN_RESP_DATA_MAX_SIZE - cmd->info.host.scan_rsp_data_len) >= ad_struct_len)

/ /复制数据
memcpy (cmd - > info.host.scan_rsp_data [cmd - > info.host。scan_rsp_data_len], ad_struct_data ad_struct_len);

//更新扫描响应数据长度
cmd - > info.host。scan_rsp_data_len + = ad_struct_len;

其他的

//制造商特定数据不适合广告数据或扫描响应数据
ASSERT_ERROR (0);

空白user_app_adv_start(空白)

//安排下一次广告数据更新
app_adv_data_update_timer_used = app_easy_timer(app_adv_data_update_update to, adv_data_update_timer_cb);

struct gapm_start_advertise_cmd * cmd;
cmd = app_easy_gap_undirected_advertise_get_active ();

//动态添加制造商特定数据
mnf_data_update ();
App_add_ad_struct (cmd, &mnf_data, sizeof(struct mnf_specific_data_ad_structure));

app_easy_gap_undirected_advertise_start ();

Void user_app_connection(uint8_t connection_idx, struct gapc_connection_req_ind const *param)

如果(app_env [connection_idx]。conidx ! = GAP_INVALID_CONIDX)

app_connection_idx = connection_idx;

//停止发布数据更新定时器
app_easy_timer_cancel (app_adv_data_update_timer_used);

//检查已建立连接的参数是否为首选参数。
//如果不是,则调度一个连接参数更新请求。
If ((param->con_interval < user_connection_param_conf.intv_min) || .intv_min
(param->con_interval > user_connection_param_conf.intv_max) ||
(param->con_latency != user_connection_param_conf.latency
(param - > sup_to ! = user_connection_param_conf.time_out))

//连接参数不是我们所期望的
app_param_update_request_timer_used = app_easy_timer(app_param_update_request_timer_cb, param_update_request_timer_cb);


其他的

//没有建立连接,重新启动广告
user_app_adv_start ();

default_app_on_connection (connection_idx参数);

/**
****************************************************************************************
* @brief按键回呼功能。注册在WKUPCT驱动程序。
* @return无效
****************************************************************************************
*/
静态孔隙app_button_press_cb(空白)

如果(GetBits16 (SYS_STAT_REG PER_IS_DOWN))

periph_init ();

如果(arch_ble_ext_wakeup_get ())

arch_set_sleep_mode (app_default_sleep_mode);
arch_ble_force_wakeup ();
arch_ble_ext_wakeup_off ();
app_easy_wakeup ();

if (ke_state_get(TASK_APP) == APP_CONNECTED)

gpio_setactive (GPIO_BUTTON_PIN GPIO_BUTTON_PORT);
延迟(1000);
gpio_setinactive (GPIO_BUTTON_PIN GPIO_BUTTON_PORT);

申请- > conhdl = app_env - > conhdl;
申请- >处理= CUST1_IDX_PIPE_VAL;
申请- >长度= DEF_CUST1_PIPE_CHAR_LEN;

memcpy(请求- >值、&kirim DEF_CUST1_PIPE_CHAR_LEN);
ke_msg_send(要求的);

if (ke_state_get(TASK_APP) != APP_CONNECTED)

gpio_setactive (GPIO_BUTTON_PIN GPIO_BUTTON_PORT);
延迟(1000);
gpio_setinactive (GPIO_BUTTON_PIN GPIO_BUTTON_PORT);


/**
****************************************************************************************
@brief应用唤醒回调函数。注册在API消息实用程序。
* @return无效
****************************************************************************************
*/
静态孔隙app_wakeup_cb(空白)

//如果state不是idle,则忽略该消息
if (ke_state_get(TASK_APP) == APP_CONNECTABLE)

user_app_adv_start ();

/**
****************************************************************************************
* @brief设置按钮为唤醒触发器
* @return无效
****************************************************************************************
*/
静态孔隙app_button_enable(空白)

app_easy_wakeup_set (app_wakeup_cb);
wkupct_register_callback (app_button_press_cb);
wkupct_enable_irq(WKUPCT_PIN_SELECT(GPIO_BUTTON_PORT, GPIO_BUTTON_PIN), //选择pin (GPIO_BUTTON_PORT, GPIO_BUTTON_PIN)
wkupct_pin_polarization (GPIO_BUTTON_PORT, GPIO_BUTTON_PIN, wkupct_pin_polarization _low), //极性低
1, // 1事件
40);//调试时间= 0

空白user_app_adv_undirect_complete (uint8_t状态)

//如果广告被取消,则更新广告数据并重新开始广告
//关闭BLE和timer事件的唤醒。只有外部(GPIO)唤醒事件才能唤醒处理器。
if (status == GAP_ERR_CANCELED) / /取消取消

user_app_adv_start ();
arch_ble_ext_wakeup_on ();

//配置唤醒按钮
app_button_enable ();

Void user_app_disconnect(struct gapc_disconnect_ind const *param)

//取消参数更新请求定时器
if (app_param_update_request_timer_used != EASY_TIMER_INVALID_TIMER)

app_easy_timer_cancel (app_param_update_request_timer_used);
app_param_update_request_timer_used = EASY_TIMER_INVALID_TIMER;

uint8_t state = ke_state_get(TASK_APP);

if (state == APP_SECURITY) ||
(state == APP_CONNECTED) ||
(状态= = APP_PARAM_UPD))

/ /重新启动广告
user_app_adv_start ();

其他的

//我们没有处于连接状态
ASSERT_ERR (0);

Void user_catch_rest_hndl(ke_msg_id_t const msgid,
空白const *参数,
ke_task_id_t const dest_id,
ke_task_id_t const src_id)

开关(是否)

案例CUSTS1_VAL_WRITE_IND:

Struct custs1_val_write_ind const *msg_param = (Struct custs1_val_write_ind const *)(param);

开关(msg_param - >处理)

案例CUST1_IDX_PIPE_VAL:
User_custs1_pipe_wr_ind_handler (msgid, msg_param, dest_id, src_id);
打破;

默认值:
打破;

}打破;

案例GAPC_PARAM_UPDATED_IND:

//转换void指针到适当的消息结构
Struct gapc_param_updated_ind const *msg_param = (Struct gapc_param_updated_ind const *)(param);

//检查是否更新Conn Params填充到首选的
If ((msg_param->con_interval >= user_connection_param_conf.intv_min) &&
(msg_param->con_interval <= user_connection_param_conf.intv_max) &&
(msg_param->con_latency == user_connection_param_conf.latency) &&
(msg_param - > sup_to = = user_connection_param_conf.time_out))


}打破;

案例CUSTS1_VAL_NTF_CFM:

Struct custs1_val_ntf_cfm const *msg_param = (Struct custs1_val_ntf_cfm const *)(param);

开关(msg_param - >处理)

案例CUST1_IDX_PIPE_VAL:
打破;

默认值:
打破;

}打破;

默认值:
打破;

/ / / @}应用

设备:
MT_dialog
离线
最后看到:4个月2周之前
工作人员
加入:2015-06-08 34
嗨kevleo94,

嗨kevleo94,

1)如果你想把一个领导一旦设备被连接,那么你应该建立相应的GPIO活跃于user_app_connection()回调,为了设置在关闭状态你断开连接的时候应该把它关掉user_app_disconnect()回调。注意,当设备处于睡眠模式,当设备睡觉针保持其状态但当醒来别针从user_periph_setup重新配置()函数,所以你应该保持一个额外的变量在连接或断开连接和配置正常销在每个唤醒最后根据其状态。

2)如果你想打开领导如果按两次醒来的计数器中断例程(app_wakeup_cb或app_button_press_cb)应该做的技巧,如果你想留在一个特定数量的定时器可以使用app_easy_timer()来设置一个内核定时器和关掉了一旦出现回调。

由于MT_dialog