使用ESP32C3,IDF版本是5.4.2,移植官方blufi示例代码。想要实现的功能是通过按键进入配网模式,配网成功后就关闭blufi,想更换网络还可以再次按键打开blufi。
增加了联网成功后自动deinit blufi的代码,内容如下:
Code: Select all
static void blufi_deinit(void)
{
esp_err_t ret;
ret = esp_blufi_host_deinit();
if (ret) {
BLUFI_ERROR("%s initialise failed: %s\n", __func__, esp_err_to_name(ret));
return;
}
#if CONFIG_BT_CONTROLLER_ENABLED || !CONFIG_BT_NIMBLE_ENABLED
ret = esp_blufi_controller_deinit();
if (ret) {
BLUFI_ERROR("%s BLUFI controller deinit failed: %s\n", __func__, esp_err_to_name(ret));
return;
}
#endif
ble_is_connected = 0;
}打开blufi时使用的函数改写自原示例的main函数:
Code: Select all
void blufi_init(void)
{
esp_err_t ret;
wifi_init_sta();
#if CONFIG_BT_CONTROLLER_ENABLED || !CONFIG_BT_NIMBLE_ENABLED
ret = esp_blufi_controller_init();
if (ret) {
BLUFI_ERROR("%s BLUFI controller init failed: %s\n", __func__, esp_err_to_name(ret));
return;
}
#endif
ret = esp_blufi_host_and_cb_init(&example_callbacks);
if (ret) {
BLUFI_ERROR("%s initialise failed: %s\n", __func__, esp_err_to_name(ret));
return;
}
BLUFI_INFO("BLUFI VERSION %04x\n", esp_blufi_get_version());
}我翻找了IDF的原始代码,发现“BLUFI already initialized”的原因是blufi_env.enabled = true,原始代码如下:
Code: Select all
static uint8_t btc_blufi_profile_init(void)
{
esp_blufi_callbacks_t *store_p = blufi_env.cbs;
uint8_t rc;
if (blufi_env.enabled) {
BLUFI_TRACE_ERROR("BLUFI already initialized");
return ESP_BLUFI_ERROR;
}
memset(&blufi_env, 0x0, sizeof(blufi_env));
blufi_env.cbs = store_p; /* if set callback prior, restore the point */
blufi_env.frag_size = BLUFI_FRAG_DATA_DEFAULT_LEN;
rc = esp_blufi_init();
if(rc != 0 ){
return rc;
}
return ESP_BLUFI_SUCCESS;
}Code: Select all
static uint8_t btc_blufi_profile_deinit(void)
{
if (!blufi_env.enabled) {
BTC_TRACE_ERROR("BLUFI already de-initialized");
return ESP_BLUFI_ERROR;
}
esp_blufi_deinit();
return ESP_BLUFI_SUCCESS;
}
void esp_blufi_deinit(void)
{
blufi_env.enabled = false;
esp_blufi_cb_param_t param;
btc_msg_t msg;
memset (&msg, 0x0, sizeof (msg));
msg.sig = BTC_SIG_API_CB;
msg.pid = BTC_PID_BLUFI;
msg.act = ESP_BLUFI_EVENT_DEINIT_FINISH;
param.deinit_finish.state = ESP_BLUFI_DEINIT_OK;
btc_transfer_context(&msg, ¶m, sizeof(esp_blufi_cb_param_t), NULL, NULL);
}我又尝试将esp_blufi_deinit加入我的blufi_deinit函数中,确实可以成功多次初始化blufi了,但是每次配网操作都会溢出0.5k左右的内存。
请问有没有老师了解问题的原因和解决办法?
感谢各位阅读。