I (2640) system_api: Base MAC address is not set
Posted: Thu Feb 24, 2022 1:35 pm
我用的是ESP32 Lyrat 4.3的开发板,用idf标准的代码初始化wifi(station), 十次有7次会遇到下面的开机错误,找不到MAC地址,WiFi也无法正常使用。
我必须在main的开头调用下面代码,再重启,才可以使网络正常,但是过一段时间,又会报上面的错误
初始化wifi的代码如下, 不完整。
Code: Select all
I (2640) system_api: Base MAC address is not set
I (2650) system_api: read default base MAC address from EFUSE
Code: Select all
ESP_ERROR_CHECK(nvs_flash_erase()); //有的时候莫名其妙WiFi 、 mac地址都报废,用这个擦除nvs就好了
err = nvs_flash_init();
初始化wifi的代码如下, 不完整。
Code: Select all
void wifi_init_sta(void)
{
/* 创建一个事件标志组 */
wifi_event_group_handler = xEventGroupCreate();
/* 初始化底层TCP/IP堆栈。在应用程序启动时,应该调用此函数一次。*/
// ESP_ERROR_CHECK(esp_netif_init());
/* 创建默认事件循环,*/
if(esp_event_loop_create_default() != ESP_OK)
{
ESP_LOGE("wifi", "esp_event_loop_create_default failed");
return;
}
/* 创建一个默认的WIFI-STA网络接口,如果初始化错误,此API将中止。*/
// esp_netif_create_default_wifi_sta();
esp_netif_t *sta_netif;
sta_netif = esp_netif_create_default_wifi_sta();
// if(sta_netif)
// {
// printf("esp_netif_set_hostname(sta_netif, \"localname\"); \ntodo: invalid function...");
// esp_err_t err = esp_netif_set_hostname(sta_netif, "localname");
// ESP_ERROR_CHECK(err);
// }
// CONFIG_NETIF_HOSTNAME
// esp_netif_get_hostname(,)
// esp_netif_t *esp_netif = NULL;
// esp_netif = esp_netif_next(esp_netif);
// esp_err_t err = esp_netif_set_hostname(esp_netif, "hoody");
// ESP_ERROR_CHECK(err);
/* 使用WIFI_INIT_CONFIG_DEFAULT() 来获取一个默认的wifi配置参数结构体变量*/
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
/* 根据cfg参数初始化wifi连接所需要的资源 */
if(esp_wifi_init(&cfg) != ESP_OK)
{
ESP_LOGE("wifi", "esp_wifi_init failed");
return;
}
//vTaskDelay(100);
/* 将事件处理程序注册到系统默认事件循环,分别是WiFi事件、IP地址事件及smartconfig事件 */
ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &event_handler, NULL));
ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &event_handler, NULL));
ESP_ERROR_CHECK(esp_event_handler_register(SC_EVENT, ESP_EVENT_ANY_ID, &event_handler, NULL));
/* 定义WiFi连接的ssid和password参数 */
wifi_config_t wifi_config = {0};
char ssid[32] = "ssid"; /**< SSID of target AP. */
char password[64] = "88888888"; /**< Password of target AP. */
size_t len1 = sizeof(ssid), len2 = sizeof(password);
// nvs_flash_init_partition("wifi");
nvs_handle_t hNVS;
esp_err_t err = nvs_open(WIFI_TAG, NVS_READONLY, &hNVS);
if(err == ESP_OK)
{
nvs_get_str(hNVS, "ssid", (char*)ssid, &len1);
nvs_get_str(hNVS, "pswd", (char*)password, &len2);
nvs_close(hNVS);
}
strncpy((char *)&wifi_config.sta.ssid, ssid, sizeof(wifi_config.sta.ssid));
strncpy((char *)&wifi_config.sta.password, password, sizeof(wifi_config.sta.password));
/* 设置WiFi的工作模式为 STA */
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA) );
/* 设置WiFi连接的参数,主要是ssid和password */
ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config));
/* 启动WiFi连接 */
ESP_ERROR_CHECK(esp_wifi_start());
printf("wifi_init_sta finished. \n");
/* 使用事件标志组等待连接建立(WIFI_CONNECTED_BIT)或连接失败(WIFI_FAIL_BIT)事件 */
EventBits_t bits; /* 定义一个事件位变量来接收事件标志组等待函数的返回值 */
bits = xEventGroupWaitBits( wifi_event_group_handler, /* 需要等待的事件标志组的句柄 */
WIFI_CONNECTED_BIT | WIFI_FAIL_BIT, /* 需要等待的事件位 */
pdFALSE, /* 为pdFALSE时,在退出此函数之前所设置的这些事件位不变,为pdFALSE则清零*/
pdFALSE, /* 为pdFALSE时,设置的这些事件位任意一个置1就会返回,为pdFALSE则需全为1才返回 */
portMAX_DELAY); /* 设置为最长阻塞等待时间,单位为时钟节拍 */
/* 根据事件标志组等待函数的返回值获取WiFi连接状态 */
if (bits & WIFI_CONNECTED_BIT) /* WiFi连接成功事件 */
{
printf("connected to ap SSID:%s OK \n",MY_WIFI_SSID);
vEventGroupDelete(wifi_event_group_handler); /* 删除WiFi连接事件标志组,WiFi连接成功后不再需要 */
}
else if (bits & WIFI_FAIL_BIT) /* WiFi连接失败事件 */
{
printf("Failed to connect to SSID:%s \n",MY_WIFI_SSID);
smartconfig_init_start(); /* 开启智能配网 */
}
else
{
printf("UNEXPECTED EVENT \n"); /* 没有等待到事件 */
smartconfig_init_start(); /* 开启智能配网 */
}
//ESP_ERROR_CHECK(esp_event_handler_unregister(IP_EVENT, IP_EVENT_STA_GOT_IP, &event_handler));
//ESP_ERROR_CHECK(esp_event_handler_unregister(WIFI_EVENT, ESP_EVENT_ANY_ID, &event_handler));
}