
ESP-IDF 获取 WiFi TSF 时间戳微秒级计时的落地方法【免费下载链接】esp-idfEspressif IoT Development Framework. Official development framework for Espressif SoCs.项目地址: https://gitcode.com/GitHub_Trending/es/esp-idf在 ESP-IDF 中esp_wifi_get_tsf_time能从 WiFi 驱动读出当前 TSFTiming Synchronization FunctionIEEE 802.11 规定的全网同步微秒时基可理解为以信标帧为节拍的全网秒表计数值。本文给出最小可运行示例、三种典型用法的短代码以及一份排错速查表适用于 WiFi 延迟测量、定时调度与通信调试场景。上图为 ESP32 WiFi 在不同功耗模式下的电流对比。TSF 读取精度与功耗模式直接相关文末性能与功耗建议会用到这张图的结论。TSF 时间戳适合哪些场景延迟测量收发两端用同一个时基打点算出的往返时间不受本地时钟漂移影响。定时调度以信标节拍为基准做周期任务比sleep 后读系统时钟更接近真实空中时间。通信调试给扫描、握手、重连等事件打时间戳还原无线事件时序。三个前置条件调用前确认三件事缺一件返回值就没有意义前置条件说明不满足时接口类型正确按模式传WIFI_IF_STAStation、WIFI_IF_APSoftAP、WIFI_IF_AP_STA同开枚举定义见 esp_wifi_types.h返回 0STA 已连接且至少收到一个信标帧头文件注释明确未连接、或连接后未收到信标时直接返回 0见 esp_wifi.h返回 0已#include esp_wifi.h头文件声明int64_t esp_wifi_get_tsf_time(wifi_interface_t interface);远端 WiFi 场景下它转发到esp_wifi_remote_get_tsf_time见 esp_wifi_with_remote.c编译失败单位是微秒返回类型是int64_t。注意 TSF 是相对时基没有绝对日期含义只适合算差值不要当 Unix 时间用。最小可运行示例下面这段完成三件事初始化 WiFi、发起连接、在拿到 IP 后第一次读取 TSF 时间戳#include esp_wifi.h #include esp_event.h #include nvs_flash.h #include esp_log.h static const char *TAG tsf_demo; static void on_wifi_event(void *arg, esp_event_base_t base, int32_t id, void *data) { if (base WIFI_EVENT id WIFI_EVENT_STA_CONNECTED) { int64_t tsf esp_wifi_get_tsf_time(WIFI_IF_STA); // 连接成功时基已同步 ESP_LOGI(TAG, TSF time: %lld us, (long long)tsf); } } void app_main(void) { ESP_ERROR_CHECK(esp_netif_init()); ESP_ERROR_CHECK(esp_event_loop_create_default()); esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, on_wifi_event, NULL); wifi_init_config_t cfg WIFI_INIT_CONFIG_DEFAULT(); ESP_ERROR_CHECK(esp_wifi_init(cfg)); ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); wifi_config_t wcfg { .sta { .ssid MySSID, .password MyPassword }, }; ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, wcfg)); ESP_ERROR_CHECK(esp_wifi_start()); ESP_ERROR_CHECK(esp_wifi_connect()); }关键点只有一个把首次读取放在WIFI_EVENT_STA_CONNECTED里而不是esp_wifi_connect()之后立刻读。连接动作刚发出时 STA 可能还没收到任何信标帧此时读出来大概率是 0。此后任意时刻读取都是合法的有效计数。按场景用法场景一测量网络往返延迟同一时基取两个打点差值即一次网络交互的耗时int64_t t0 esp_wifi_get_tsf_time(WIFI_IF_STA); send_request(); // 你的业务HTTP 请求、UDP 发包等 recv_response(); // 等待响应 int64_t t1 esp_wifi_get_tsf_time(WIFI_IF_STA); ESP_LOGI(TAG, RTT: %lld us, (long long)(t1 - t0));注意它只覆盖设备侧的处理加空中时间对端处理耗时不包含在内。场景二基于 TSF 的周期采集用差值比较代替任务睡眠 100ms节拍来自信标不受任务调度抖动影响static int64_t last 0; void periodic_sample(void) { int64_t now esp_wifi_get_tsf_time(WIFI_IF_STA); if (now - last 100000) { // 100000 us 100 ms sample_sensor(); last now; } }场景三扫描过程计时ESP-IDF 的 supplicant 自己就在使用这个 API扫描开始时把 TSF 存入scan_start_tsf见 esp_scan.c 第 33 行// 扫描/重连事件里打点 int64_t tsf esp_wifi_get_tsf_time(WIFI_IF_STA); if (tsf ! 0) { ESP_LOGI(TAG, scan took %lld us since last, (long long)(tsf - last_scan_tsf)); last_scan_tsf tsf; }自己打点时同样建议加! 0判断跳过无效样本。排错速查表现象常见原因处理方式返回值恒为 0STA 未连接成功或连接后还没收到第一个信标帧头文件注释明确此行为把读取挪到STA_CONNECTED之后用esp_wifi_is_connected()确认连接状态数值不连续、出现回跳设备进入深度睡眠TSF 计数复位或 AP 切换、重连打点前先确认连接未中断跨睡眠的数据分析要分段处理精度不达标开启了非 modem sleep 的省电模式头文件attention注明 power save 会使返回值不准modem sleep 除外esp_wifi_set_ps(WIFI_PS_MIN_MODEM)切到最小省电传错接口类型纯 AP 模式却传了WIFI_IF_STA按实际模式传WIFI_IF_AP或WIFI_IF_AP_STA性能与功耗建议别在轮询里反复读TSF 本身是驱动内部值读取开销小但日志、格式化等外围开销不小高频场景缓存一次、多处复用。精度与省电二选一要准就用WIFI_PS_MIN_MODEMmodem sleep要省电流就接受 modem 及以上省电带来的时基偏差对应关系见上文电流对比图。跨睡眠数据别直接相减深度睡眠会让 TSF 复位分析前先按睡眠事件分段。另外提一句弱相关能力esp_wifi_set_inactive_time/esp_wifi_get_inactive_time控制多久没收到信标就断开默认 6 秒它决定的是连接存留而不是时间戳按需查阅 esp_wifi.h 即可。适用边界esp_wifi_get_tsf_time提供的是以信标为节拍的相对微秒时基适合算差值、对时序不适合当绝对时间用且精度受省电模式和睡眠行为约束。如果你的需求是对齐 NTP 这类网络标准时间应该走esp_timer与系统时间服务而不是 TSF。【免费下载链接】esp-idfEspressif IoT Development Framework. Official development framework for Espressif SoCs.项目地址: https://gitcode.com/GitHub_Trending/es/esp-idf创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考