外围BLE实施例

⚠️
嗨,...感谢您来论坛。令人兴奋的消息!我们现在正在迁至我们的新论坛平台,将提供更好的功能,并包含在主对话框网站中。所有帖子和帐户都已迁移。我们现在只接受新论坛上的流量 - 请发布任何新线程https://www.dialog-seminile.com/support.。我们将在未来几天修复错误/优化搜索和标记。
11个帖子/ 0新
最后一篇
michael12344
离线
最后一次露面:2年3个月前
加入:2019年1月29日23:17
外围BLE实施例

你好,

我目前正在使用BLE外围设备的修改版本,尝试使用ADC对信号进行采样。我基本上用代码替换了adc_adcval1_timer_cb_handler中的代码,以从ADC而不是计数器读取值。我拥有的麻烦是对ADC处理程序函数的调用的时间。我需要在每秒2000Hz或2000个样本上进行样本。当我尝试在10毫秒处或低于10 ms的定时器时,我会断开连接,并且在几个调用ADC处理程序后调用Platform_reset_func函数。我尝试过App易于计时器,示例使用,我也尝试使用Timer0带回调方法。似乎似乎有同样的问题。我想知道关于我不知道的代码或软件的时机是否存在一些限制因素?还有什么样的事情导致呼叫平台_Reset func?

谢谢!

关键词:
设备:
cyibin.
离线
最后一次露面:10个月3周前
职员
加入:2017-12-14 02:48
迈克尔,

迈克尔,

你能告诉我你的源代码吗?

到目前为止,我可以确认您,App_easy_timer API的时间单位是10ms,它不适用于2kHz采样。

布尔

cyibin.

michael12344
离线
最后一次露面:2年3个月前
加入:2019年1月29日23:17
我理解app_easy

我理解app_easy_timer不会让我到2khz采样。但是,即使我使用具有最低可能时间单元10ms的应用程序易于计时器不起作用。以下是使用app_easy_timer的编辑部分。当App_peripheral_ctrl_timer_delay设置为2个时间单位时,它适用于Fine,但使用1后不久断开连接。

#define app_peripheral_ctrl_timer_delay(1)void user_svc1_ctrl_wr_ind_handler(ke_msg_handler msgid,struct custs1_val_write_ind const * param,ke_task_id_t const dest_id,ke_task_id_t const src_id){uint8_t val = 0;memcpy(&val,&param->值[0],param->长度);if(val!= custs1_cp_adc_val1_disable){adc_init(gp_adc_se,gp_adc_sign,gp_adc_attn3x);ADC_USDELAY(20);ADC_ENABLE_CHANNEL(ADC_CHANNEL_P00);timer_used = app_easy_timer(app_peripheral_ctrl_timer_delay,app_adcval1_timer_cb_handler);} else {adc_disable();if(timer_used!= easy_timer_invalid_timer){app_easy_timer_cancel(timer_used);timer_used = easy_timer_invalid_timer;}}}}}}} void app_adcval1_timer_cb_handler(){struct custs1_val_ntf_ind_req * req = ke_msg_alloc_dyn(custs1_val_ntf_req,prf_get_task_from_id(task_id_custs1),task_app,custs1_val_ntf_ind_req,def_svc1_adc_val_1_char_len); // ADC value to be sampled static uint16_t sample __attribute__((section("retention_mem_area0"), zero_init)); sample = adc_get_sample(); //req->conhdl = app_env->conhdl; req->handle = SVC1_IDX_ADC_VAL_1_VAL; req->length = DEF_SVC1_ADC_VAL_1_CHAR_LEN; req->notification = true; memcpy(req->value, &sample, DEF_SVC1_ADC_VAL_1_CHAR_LEN); ke_msg_send(req); if (ke_state_get(TASK_APP) == APP_CONNECTED) { // Set it once again until Stop command is received in Control Characteristic timer_used = app_easy_timer(APP_PERIPHERAL_CTRL_TIMER_DELAY, app_adcval1_timer_cb_handler); } }

下面是使用定时器0,而不是app_easy_timer应该可以品尝2kHz的更快编辑的零件。不过,我得到相同的断开和呼叫platform_reset_func当定时器0被设置等于或低于10ms间隔使用app_easy_timer时。在这里,时间间隔设置为20毫秒,它工作正常。但是,如果你的RELOAD更改为1000(5毫秒),例如,它会断开和呼叫platform_reset_func。user_cust1_impl.c的其余部分是在这两个例子中的相同。

#define no_pwm 0x0 #define重新加载4000 void user_svc1_ctrl_wr_ind_handler(ke_msg_handler(ke_msg_hand_t const msgs,struct custs1_val_write_ind const * param,ke_task_id_t const dest_id,ke_task_id_t const src_id){uint8_t val = 0;memcpy(&val,&param->值[0],param->长度);if(val!= custs1_cp_adc_val1_disable){adc_init(gp_adc_se,gp_adc_sign,gp_adc_attn3x);ADC_USDELAY(20);ADC_ENABLE_CHANNEL(ADC_CHANNEL_P00);timer0_stop();timer0_register_callback(app_adcval1_timer_cb_handler);set_tmr_enable(clk_per_reg_tmr_enabled);set_tmr_div(clk_per_reg_tmr_div_8);timer0_set_pwm_high_counter(no_pwm); timer0_set_pwm_low_counter(NO_PWM); timer0_init(TIM0_CLK_FAST, PWM_MODE_ONE, TIM0_CLK_DIV_BY_10); timer0_set_pwm_on_counter(RELOAD); // Enable SWTIM_IRQn irq timer0_enable_irq(); // Start Timer0 timer0_start(); } else { set_tmr_enable(CLK_PER_REG_TMR_DISABLED); adc_disable(); } } void app_adcval1_timer_cb_handler() { struct custs1_val_ntf_ind_req *req = KE_MSG_ALLOC_DYN(CUSTS1_VAL_NTF_REQ, prf_get_task_from_id(TASK_ID_CUSTS1), TASK_APP, custs1_val_ntf_ind_req, DEF_SVC1_ADC_VAL_1_CHAR_LEN); // ADC value to be sampled static uint16_t sample __attribute__((section("retention_mem_area0"), zero_init)); sample = adc_get_sample(); //req->conhdl = app_env->conhdl; req->handle = SVC1_IDX_ADC_VAL_1_VAL; req->length = DEF_SVC1_ADC_VAL_1_CHAR_LEN; req->notification = true; memcpy(req->value, &sample, DEF_SVC1_ADC_VAL_1_CHAR_LEN); ke_msg_send(req); }

谢谢!

michael12344
离线
最后一次露面:2年3个月前
加入:2019年1月29日23:17
只是为了避免

只是为了避免误解,的user_custs_impl文件的项目外的其余部分是从SDK外围蓝牙低能量的例子。

cyibin.
离线
最后一次露面:10个月3周前
职员
加入:2017-12-14 02:48
嗨michael12344,

嗨michael12344,

将断开连接的原因是发送给SDK配置文件的通知命令太过频繁。

你应该最前一页存储由ADC采样产生的DATAS,然后发送出去在较低的频率。

布尔

cyibin.

michael12344
离线
最后一次露面:2年3个月前
加入:2019年1月29日23:17
你好,

你好,

有没有什么办法来解决这个问题?这将是如果数据流能持续进行而不是收集所有的样品,然后发送数据较为理想。是否有发送,这将是更好的,或者可以频繁,因为我想完成的频繁或接近/接收数据的方法?

谢谢

PM_DIALOG.
离线
最后一次露面:4天18小时前
职员
加入:2018-02-08 11:03
嗨michael12344,

嗨michael12344,

Τheplatform_reset_func(),它是由platform_reset(调用),是由ROM代码实现的功能。最可能的原因,为什么你得到这个说法是由于内存不足,因为你可能尝试分配的消息,你从来没有消耗。例如,如果您分配通知消息,你有时间间隔的消息的小的连接被堆积,直到连接事件到达,但有一个大的连接间隔你耗尽内存连接事件之前到达。这是间隔您正在使用的连接?

谢谢,PM_DIALOG.

michael12344
离线
最后一次露面:2年3个月前
加入:2019年1月29日23:17
你好,

你好,

是外周或中央装置上间隔设置的连接?我已经发现在出现到10ms的最小和最大连接时间间隔设置为20ms的user_peripheral.c和user_config.c以下。

空隙user_app_connection(uint8_t connection_idx,结构gapc_connection_req_ind常量* PARAM){如果(app_env [connection_idx] .conidx = GAP_INVALID_CONIDX!){app_connection_idx = connection_idx;//停止广告数据更新定时器app_easy_timer_cancel(app_adv_data_update_timer_used);//检查是否建立连接的参数是首选的。//如果没有,那么安排的连接参数更新请求。如果((param-> con_interval  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)){//连接PARAMS不是这些我们期望app_param_update_request_timer_used = app_easy_timer(APP_PARAM_UPDATE_REQUEST_TO,param_update_request_timer_cb);}}其他{//没有建立连接后,重新启动广告user_app_adv_start();} default_app_on_connection(connection_idx,PARAM);}
静态常量结构connection_param_configuration user_connection_param_conf = {在BLE双时隙测量///连接间隔最小值(1.25ms)///使用宏MS_TO_DOUBLESLOTS从毫秒(ms)(10)转换为双时隙.intv_min = MS_TO_DOUBLESLOTS,///在BLE双时隙(1.25ms)测量连接间隔最大///使用宏MS_TO_DOUBLESLOTS转换从毫秒(ms)到双时隙.intv_max = MS_TO_DOUBLESLOTS(20),///延迟在连接事件.latency = 0测量在定时器单元(10 ms)为单位///监督超时///使用宏MS_TO_TIMERUNITS从毫秒(ms)到定时器单元转换.time_out = MS_TO_TIMERUNITS(1250),///最小连接事件期间在BLE双时隙测量(1.25ms)///使用宏MS_TO_DOUBLESLOTS从毫秒(ms)转换为双时隙.ce_len_min = MS_TO_DOUBLESLOTS(0),在/// BLE双时隙(1.25ms)测量最大连接事件期间///使用宏MS_TO_DOUBLESLOTS从毫秒转换(毫秒),以双时隙.ce_len_max = MS_TO_DOUBLESLOTS(0),};

PM_DIALOG.
离线
最后一次露面:4天18小时前
职员
加入:2018-02-08 11:03
嗨michael12344,

嗨michael12344,

能否请您连接间隔(.intv_min和.intv_max)更改为一个更大的吗?

谢谢,PM_DIALOG.

michael12344
离线
最后一次露面:2年3个月前
加入:2019年1月29日23:17
你好,

你好,

我尝试将IntV_min和Intv_max更改为更大的值30-45ms和100-160ms。但是,问题似乎仍然存在,因为仍然调用platform_reset_func()。还有什么我可以尝试提高数据吞吐量吗?

PM_DIALOG.
离线
最后一次露面:4天18小时前
职员
加入:2018-02-08 11:03
嗨michael12344,

嗨michael12344,

可能,在您的应用程序中,每个连接后,可能会有一些内存泄漏丸。当WRAP_PLATFORM_RESET()发生时,请确保错误代码是reset_mem_alloc_fail,您将必须调试这一点以便找到它。此外,检查ADC读取期间是否存在任何挂起的消息,并确保您在处理消息时会收到您获得的消息,或者您正在分配它们应该被释放的数据。例如,如果您正在分配消息,则在分配消息,以便在有一个连接的情况下将数据发送到通知后,设备最终会用完内存,并且如果设备运行内存,则会导致设备重置。尝试定义和增加DA1458x_config_advanced的db_heap_sz,例如,您可以放置​​2048的值。

谢谢,PM_DIALOG.