esp-idf配置和使用 esp32s3 n16r8

CPU frequency = 240MHz
Flash = QIO
ESP PSRAM 勾选 Pull-up PSRAM CS pin in light sleep,并且mode of spi ram chip in use = Octal Mode PSRAM
configTICK_RATE_HZ = 1000


GPIO

配置GPIO

1
2
3
4
5
6
7
8
9
10
11
12
13
#include "driver/gpio.h"
void gpio_init(void) {
gpio_config_t io_conf = {
.intr_type = GPIO_INTR_DISABLE, // 禁用中断
.mode = GPIO_MODE_OUTPUT, // 设置为输出模式
.pin_bit_mask = 1ULL << GPIO_NUM_3, // 配置 GPIO3
.pull_down_en = 0, // 禁用下拉电阻
.pull_up_en = 0, // 禁用上拉电阻
};
// gpio_config 会返回一个错误码(esp_err_t),进行错误检查
   esp_err_t ret = gpio_config(&io_conf);
   if (ret != ESP_OK) { printf("LED 初始化失败!\n"); }
}

设置 GPIO 电平

可以使用 gpio_set_level 函数设置 GPIO 的输出电平。该函数接受 GPIO 编号和电平值(0 或 1)作为参数。

1
gpio_set_level(GPIO_NUM_3, 1); // 将 GPIO3 设置为高电平

读取 GPIO 电平

可以使用 gpio_get_level 函数读取 GPIO 的输入电平。该函数返回 GPIO 的当前电平(0 或 1)。

1
int level = gpio_get_level(GPIO_NUM_3); // 读取 GPIO3 的电平

menuconfig

FreeSTOS

创建线程 XTaskCreate

1

协议

I2C I²C

用两根线,一根SDA传输数据,一根SCL同步时钟

模式 速度
Standard 100 kHz
Fast 400 kHz
Fast+ 1 MHz

WIFI

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// 第一步,初始化 nvs_flash_init()
// 存储WiFi的SSID、密码、国家码、上次连接状态

// 第二步,初始化TCP/IP协议栈 esp_netif_init()
// 创建默认的网络接口

// 第三步,WiFi循环事件 esp_event_loop_create_default()
// WiFi是异步的,需要一个事件循环来处理WiFi事件

// 第四步,配置WiFi esp_netif_create_default_wifi_sta()
// WiFi有三种模式:Station、SoftAP、Station+SoftAP
// 创建一个“网络接口对象”

// 第五步,WiFi初始化 esp_wifi_init()
// 真正启动wifi芯片

// 第六步,注册事件处理器 esp_event_handler_instance_register(...)
// 监控WiFi,自动重连,异常恢复

// 第七步,指定WiFi的模式 esp_wifi_set_mode()
// STA AP STAP

// 第八步,连接WiFi esp_wifi_set_config(WIFI_IF_STA, &wifi_config);
// 配置WiFi的SSID和密码

// 第九步,连接WiFi esp_wifi_connect()
// 连接WiFi

最简代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <string.h>

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"

#include "esp_event.h"
#include "esp_log.h"
#include "esp_netif.h"
#include "esp_wifi.h"
#include "nvs_flash.h"

static const char *TAG = "wifi";

/* WiFi 事件回调 */
static void wifi_event_handler(void *arg, esp_event_base_t event_base,
int32_t event_id, void *event_data) {
if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) {
esp_wifi_connect();
} else if (event_base == WIFI_EVENT &&
event_id == WIFI_EVENT_STA_DISCONNECTED) {
esp_wifi_connect();
} else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) {
ip_event_got_ip_t *event = (ip_event_got_ip_t *)event_data;
ESP_LOGI(TAG, "Got IP: " IPSTR, IP2STR(&event->ip_info.ip));
}
}

void wifi_manager_init(void) {
// 第一步,初始化 nvs_flash_init()
// 存储WiFi的SSID、密码、国家码、上次连接状态
nvs_flash_init();

// 第二步,初始化TCP/IP协议栈 esp_netif_init()
// 创建默认的网络接口
esp_netif_init();

// 第三步,WiFi循环事件 esp_event_loop_create_default()
// WiFi是异步的,需要一个事件循环来处理WiFi事件
esp_event_loop_create_default();

// 第四步,配置WiFi esp_netif_create_default_wifi_sta()
// WiFi有三种模式:Station、SoftAP、Station+SoftAP
// 创建一个“网络接口对象”
esp_netif_create_default_wifi_sta();

// 第五步,WiFi初始化 esp_wifi_init()
// 真正启动wifi芯片
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
esp_wifi_init(&cfg);

// 第六步,注册事件处理器 esp_event_handler_instance_register(...)
// 监控WiFi,自动重连,异常恢复
esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &wifi_event_handler,
NULL);
esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &wifi_event_handler,
NULL);

// 第七步,指定WiFi的模式 esp_wifi_set_mode()
// STA AP STAP
esp_wifi_set_mode(WIFI_MODE_STA);

// 第八步,连接WiFi esp_wifi_set_config(WIFI_IF_STA, &wifi_config);
// 配置WiFi的SSID和密码
wifi_config_t wifi_config = {
.sta =
{
.ssid = WIFI_SSID,
.password = WIFI_PASS,
},
};
esp_wifi_set_config(WIFI_IF_STA, &wifi_config);

// 第九步,连接WiFi esp_wifi_connect()
// 连接WiFi
esp_wifi_start();
}

Kconfig

可以把一些参数放进menuconfig里面,从里面进行配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
menu "WiFi Configuration"

config WIFI_SSID
string "WiFi SSID"
default "my_wifi"
help
The SSID of the WiFi network to connect to.

config WIFI_PASSWORD
string "WiFi Password"
default "12345678"
help
The password of the WiFi network.

endmenu

📌 规则:

  • config 名字 → 自动生成 CONFIG_名字
  • string / int / bool 都可以
  • help 是给 menuconfig UI 用的

然后在代码里面引用一下

1
2
3
4
5
6
7
8
9
10
11
12
#include "sdkconfig.h"

……

wifi_config_t wifi_config = {
.sta = {
.ssid = CONFIG_WIFI_SSID,
.password = CONFIG_WIFI_PASSWORD,
.threshold.authmode = WIFI_AUTH_WPA2_PSK,
},
};