1. 为什么我选择死磕 FT6236 这颗触摸芯片第一次拿到 FT6236 的芯片手册时我盯着那份不到四十页的 PDF 看了整整一个下午。说实话市面上关于 ESP32 驱动触摸屏的教程铺天盖地但绝大多数都是直接丢一个库让你调用或者把 Arduino 的示例代码复制粘贴一遍就完事了。真正从芯片手册出发把 I2C 时序、寄存器配置、中断处理这些底层逻辑讲透的内容少得可怜。FT6236 是一颗电容式触摸控制器支持最多两点触控通过标准 I2C 接口与主控通信。它的寄存器结构非常清晰从设备地址、寄存器映射到数据帧格式手册里写得明明白白。但问题在于很多人拿到手册之后不知道从哪里下手看到一堆寄存器地址就头大。我当初也是这样踩了不少坑才把整条链路跑通。这篇内容适合三类人第一类是有一定单片机基础想从零写一个 I2C 驱动但不知道如何下手的开发者第二类是已经用过现成库但想搞清楚底层到底发生了什么的进阶玩家第三类是做 ESP32 项目时需要集成触摸功能但对 I2C 通信协议还不够熟悉的工程师。不管你是哪一类我都会从芯片手册的解读开始一步步带你写出完整的驱动代码把每个关键决策背后的逻辑讲清楚。整个项目的核心思路很明确ESP32 作为 I2C 主机FT6236 作为 I2C 从机主机通过读写从机的寄存器来获取触摸坐标和手势信息。听起来简单但实际操作中涉及到 I2C 时序配置、上拉电阻选择、中断引脚处理、坐标解析等多个环节每个环节都有坑。2. 芯片手册到底该怎么读FT6236 关键寄存器拆解2.1 设备地址与 I2C 通信基础FT6236 的 7 位 I2C 设备地址是 0x38。这个地址是怎么来的手册里写得很清楚高 7 位固定为 0111000也就是 0x38。但这里有个容易搞混的地方很多教程里会写成 0x70这是把 7 位地址左移了一位变成了 8 位地址。在 ESP32 的 I2C 驱动中我们使用的是 7 位地址所以填 0x38 就对了。I2C 通信的本质是主机和从机之间通过两根线SDA 数据线和 SCL 时钟线进行数据交换。FT6236 支持标准模式100kHz和快速模式400kHz我实测下来 400kHz 完全稳定没必要降到 100kHz 牺牲刷新率。这里要特别提一下上拉电阻的问题I2C 总线必须接上拉电阻因为所有设备的 SDA 和 SCL 引脚都是开漏输出没有上拉电阻的话总线无法拉高。上拉电阻的取值是个经典问题。4.7kΩ 是最常用的值但具体选多大要看总线电容和通信速率。总线电容越大上拉电阻就要越小否则上升沿会变缓导致通信失败。我一般用 4.7kΩ如果通信不稳定就降到 2.2kΩ 试试。有个简单的判断方法用示波器看 SCL 的上升沿如果上升时间超过 1μs说明上拉电阻偏大了。注意ESP32 内部有可配置的上拉电阻但阻值较大约 45kΩ在 400kHz 速率下往往不够用。建议还是外接 4.7kΩ 的上拉电阻内部上拉可以作为辅助。2.2 寄存器映射与关键配置项FT6236 的寄存器地址空间从 0x00 到 0xFF但实际用到的就那么几个。我整理了一张关键寄存器速查表寄存器地址名称功能说明常用值0x00DEVICE_MODE设备模式0x00正常工作0x02GEST_ID手势 ID只读0x03TD_STATUS触摸点数量只读0x04-0x07P1_XH/P1_XL/P1_YH/P1_YL触摸点 1 坐标只读0x08-0x0BP2_XH/P2_XL/P2_YH/P2_YL触摸点 2 坐标只读0x80THRESHOLD触摸阈值默认 0x800xA0CTRL控制寄存器0x000xA1TIMEENTERMONITOR进入监控时间默认值0xA4PERIODACTIVE活动周期默认值0xA5PERIODMONITOR监控周期默认值TD_STATUS 寄存器地址 0x03的低 4 位表示当前触摸点数量0 表示无触摸1 表示单点触摸2 表示两点触摸。这个寄存器是轮询方式读取触摸状态的核心。P1_XH 寄存器地址 0x04的高 4 位是事件标志低 4 位是 X 坐标的高 4 位。事件标志的含义0 表示按下1 表示抬起2 表示接触3 表示无事件。P1_XL地址 0x05是 X 坐标的低 8 位。所以 X 坐标 ((P1_XH 0x0F) 8) | P1_XL。Y 坐标同理从 P1_YH地址 0x06和 P1_YL地址 0x07读取。这里有个细节很多人会忽略FT6236 的坐标范围是 0-409512 位但实际屏幕分辨率可能是 320x240 或 480x320。所以读出来的原始坐标需要根据屏幕分辨率进行映射转换。映射公式很简单screen_x raw_x * screen_width / 4096。2.3 中断引脚与轮询方式的取舍FT6236 有一个 INT 引脚当有触摸事件时会拉低通知主控读取数据。用中断方式可以避免频繁轮询 I2C 总线降低 CPU 占用。但在实际项目中我更多时候还是用轮询方式原因有两个一是 ESP32 的 I2C 读取速度很快400kHz 下读一次触摸数据不到 1ms轮询间隔设成 10ms 对 CPU 影响很小二是中断方式需要额外处理消抖和中断服务程序增加了代码复杂度。当然如果你的项目对功耗要求很高比如电池供电的便携设备那中断方式是必须的。FT6236 在监控模式下的功耗很低配合 ESP32 的深度睡眠模式可以做到非常省电。3. ESP32 的 I2C 外设配置从引脚到时钟3.1 引脚选择与硬件连接ESP32 的 I2C 引脚是可以灵活映射的几乎任意 GPIO 都可以配置为 SDA 或 SCL。但我一般会优先选择默认引脚因为默认引脚在硬件设计上通常有更好的电气特性。ESP32 的默认 I2C 引脚是 GPIO21SDA和 GPIO22SCL。接线方式如下ESP32 GPIO21 → FT6236 SDAESP32 GPIO22 → FT6236 SCLESP32 3.3V → FT6236 VCCESP32 GND → FT6236 GNDESP32 GPIO4 → FT6236 INT可选ESP32 GPIO5 → FT6236 RST可选用于硬件复位SDA 和 SCL 线上各接一个 4.7kΩ 上拉电阻到 3.3V。FT6236 的工作电压是 2.8V-3.3V所以直接接 ESP32 的 3.3V 没问题。RST 引脚低电平有效正常工作时拉高即可。如果不用 RST 引脚可以接一个 10kΩ 上拉电阻到 3.3V让芯片一直处于工作状态。提示FT6236 的 I2C 引脚是 3.3V 电平和 ESP32 的电平完全匹配不需要电平转换。但如果你用的是 5V 主控那就必须加电平转换电路否则会烧坏触摸芯片。3.2 ESP-IDF 中的 I2C 主机初始化在 ESP-IDF 中配置 I2C 主机核心是填充i2c_config_t结构体然后调用i2c_param_config()和i2c_driver_install()。下面是我常用的配置代码#include driver/i2c.h #define I2C_MASTER_SCL_IO 22 #define I2C_MASTER_SDA_IO 21 #define I2C_MASTER_FREQ_HZ 400000 #define I2C_MASTER_TX_BUF_DISABLE 0 #define I2C_MASTER_RX_BUF_DISABLE 0 #define I2C_MASTER_TIMEOUT_MS 1000 void i2c_master_init(void) { i2c_config_t conf { .mode I2C_MODE_MASTER, .sda_io_num I2C_MASTER_SDA_IO, .scl_io_num I2C_MASTER_SCL_IO, .sda_pullup_en GPIO_PULLUP_ENABLE, .scl_pullup_en GPIO_PULLUP_ENABLE, .master.clk_speed I2C_MASTER_FREQ_HZ, }; i2c_param_config(I2C_NUM_0, conf); i2c_driver_install(I2C_NUM_0, conf.mode, I2C_MASTER_RX_BUF_DISABLE, I2C_MASTER_TX_BUF_DISABLE, 0); }这段代码里clk_speed设为 400kHzsda_pullup_en和scl_pullup_en都使能了内部上拉。虽然我前面说建议外接上拉电阻但内部上拉使能了也没坏处相当于并联了一个 45kΩ 的电阻对总线拉高有辅助作用。i2c_driver_install()的第三个和第四个参数是接收和发送缓冲区大小这里设为 0 表示不使用中断方式采用阻塞式读写。对于触摸屏这种低速设备阻塞式完全够用。3.3 I2C 读写函数的封装ESP-IDF 提供了i2c_master_write_to_device()和i2c_master_read_from_device()两个便捷函数但它们的灵活性有限。我更倾向于用i2c_cmd_link_create()手动构建命令链这样可以精确控制每个字节的读写时序。写寄存器的封装esp_err_t ft6236_write_reg(uint8_t reg_addr, uint8_t data) { i2c_cmd_handle_t cmd i2c_cmd_link_create(); i2c_master_start(cmd); i2c_master_write_byte(cmd, (FT6236_ADDR 1) | I2C_MASTER_WRITE, true); i2c_master_write_byte(cmd, reg_addr, true); i2c_master_write_byte(cmd, data, true); i2c_master_stop(cmd); esp_err_t ret i2c_master_cmd_begin(I2C_NUM_0, cmd, pdMS_TO_TICKS(100)); i2c_cmd_link_delete(cmd); return ret; }读寄存器的封装esp_err_t ft6236_read_reg(uint8_t reg_addr, uint8_t *data, size_t len) { i2c_cmd_handle_t cmd i2c_cmd_link_create(); i2c_master_start(cmd); i2c_master_write_byte(cmd, (FT6236_ADDR 1) | I2C_MASTER_WRITE, true); i2c_master_write_byte(cmd, reg_addr, true); i2c_master_start(cmd); i2c_master_write_byte(cmd, (FT6236_ADDR 1) | I2C_MASTER_READ, true); if (len 1) { i2c_master_read(cmd, data, len - 1, I2C_MASTER_ACK); } i2c_master_read_byte(cmd, data len - 1, I2C_MASTER_NACK); i2c_master_stop(cmd); esp_err_t ret i2c_master_cmd_begin(I2C_NUM_0, cmd, pdMS_TO_TICKS(100)); i2c_cmd_link_delete(cmd); return ret; }读操作的关键在于先写寄存器地址写操作然后重新发送 START 条件再发送读地址读操作。这就是 I2C 的重复起始条件Repeated START是读寄存器的标准流程。最后一个字节读完后要发送 NACK告诉从机数据读取完毕。4. 从零实现 FT6236 驱动初始化、读取与坐标解析4.1 芯片初始化流程FT6236 上电后需要一定的启动时间手册里写的是典型值 200ms。我一般会延时 300ms 确保稳定。初始化流程包括硬件复位如果接了 RST 引脚、配置工作模式、设置触摸阈值。#define FT6236_ADDR 0x38 esp_err_t ft6236_init(void) { esp_err_t ret; uint8_t data; vTaskDelay(pdMS_TO_TICKS(300)); // 读取设备模式寄存器确认通信正常 ret ft6236_read_reg(0x00, data, 1); if (ret ! ESP_OK) { return ret; } // 配置为正常工作模式 ret ft6236_write_reg(0x00, 0x00); if (ret ! ESP_OK) { return ret; } // 设置触摸阈值默认 0x80可根据实际手感调整 ret ft6236_write_reg(0x80, 0x80); if (ret ! ESP_OK) { return ret; } // 配置活动周期影响触摸响应速度 ret ft6236_write_reg(0xA4, 0x0E); if (ret ! ESP_OK) { return ret; } return ESP_OK; }这里有个小技巧初始化时先读一次 0x00 寄存器如果返回 ESP_OK说明 I2C 通信链路是通的。如果返回错误那就要检查硬件连接和上拉电阻了。这个步骤能帮你快速定位是硬件问题还是软件问题。4.2 触摸数据的读取与解析读取触摸数据的核心是 TD_STATUS 寄存器0x03。先读这个寄存器获取触摸点数量然后根据数量读取对应的坐标寄存器。typedef struct { uint8_t touch_count; uint16_t x[2]; uint16_t y[2]; uint8_t event[2]; } ft6236_touch_data_t; esp_err_t ft6236_read_touch(ft6236_touch_data_t *touch) { uint8_t status; esp_err_t ret; ret ft6236_read_reg(0x03, status, 1); if (ret ! ESP_OK) { return ret; } touch-touch_count status 0x0F; if (touch-touch_count 0) { return ESP_OK; } uint8_t buf[4]; for (int i 0; i touch-touch_count i 2; i) { uint8_t base 0x04 i * 4; ret ft6236_read_reg(base, buf, 4); if (ret ! ESP_OK) { return ret; } touch-event[i] (buf[0] 6) 0x03; touch-x[i] ((buf[0] 0x0F) 8) | buf[1]; touch-y[i] ((buf[2] 0x0F) 8) | buf[3]; } return ESP_OK; }坐标解析的关键在于理解数据格式。P1_XH 寄存器的高 2 位是事件标志低 4 位是 X 坐标的高 4 位。所以 X 坐标 ((P1_XH 0x0F) 8) | P1_XL。这个位操作一定要搞清楚我见过不少人直接把 P1_XH 当成 X 坐标的高 8 位结果坐标完全不对。4.3 坐标映射与屏幕适配FT6236 输出的原始坐标范围是 0-4095但实际屏幕分辨率可能是 240x320 或 320x480。所以需要做一个线性映射#define SCREEN_WIDTH 320 #define SCREEN_HEIGHT 480 void map_coordinates(uint16_t raw_x, uint16_t raw_y, uint16_t *screen_x, uint16_t *screen_y) { *screen_x (uint16_t)((uint32_t)raw_x * SCREEN_WIDTH / 4096); *screen_y (uint16_t)((uint32_t)raw_y * SCREEN_HEIGHT / 4096); }这里用uint32_t做中间运算防止raw_x * SCREEN_WIDTH溢出。虽然raw_x最大 4095SCREEN_WIDTH最大也就几百乘积不会超过 16 位但养成好习惯总是没错的。映射之后还要考虑屏幕的旋转方向。如果屏幕旋转了 90 度X 和 Y 坐标需要互换并且其中一个轴要反向。这个根据实际安装方向调整即可。5. 踩坑实录那些手册上不会告诉你的问题5.1 I2C 通信失败排查思路I2C 通信失败是最常见的问题表现是i2c_master_cmd_begin()返回 ESP_FAIL 或超时。排查思路如下现象可能原因解决方法完全无响应接线错误或供电不足检查 SDA/SCL 是否接反测量 VCC 电压偶尔失败上拉电阻偏大或总线电容过大减小上拉电阻至 2.2kΩ缩短走线读到的数据全 0设备地址错误确认使用 7 位地址 0x38读到的数据全 0xFF从机未应答检查 RST 引脚是否拉高通信速率高时失败上升沿太缓降低速率至 100kHz 测试我遇到过一次很诡异的情况单独测试 FT6236 一切正常但接上屏幕后 I2C 就时好时坏。后来用示波器一看发现屏幕的排线太长引入了较大的寄生电容导致 SCL 上升沿变缓。把上拉电阻从 4.7kΩ 换成 2.2kΩ 后问题解决。这个经验告诉我I2C 总线的物理层问题往往比软件问题更隐蔽。5.2 触摸坐标跳变与抖动处理触摸坐标偶尔跳变是正常现象因为电容式触摸本身就容易受到环境干扰。处理方法有两种一是软件滤波二是调整触摸阈值。软件滤波最简单的是滑动平均法连续读取 5 次坐标去掉最大值和最小值剩下的取平均。这个方法对慢速滑动很有效但快速滑动时会有延迟。另一种是卡尔曼滤波效果更好但实现复杂。调整触摸阈值寄存器 0x80也能改善抖动。默认值 0x80 对应中等灵敏度如果环境干扰大可以适当提高阈值比如设为 0xA0。但阈值太高会导致触摸不灵敏需要根据实际使用场景权衡。实操心得我在一个工业控制面板项目中发现电机运行时产生的电磁干扰会导致触摸坐标剧烈跳变。后来在 FT6236 的 VCC 引脚旁边加了一个 100nF 的陶瓷电容和一个 10μF 的钽电容问题明显改善。电源去耦对触摸芯片的稳定性至关重要。5.3 多点触摸的事件处理逻辑FT6236 支持两点触摸但很多人只用了单点。两点触摸的事件处理要复杂一些需要跟踪每个触摸点的按下、移动、抬起状态。我的做法是维护一个触摸点状态数组每次读取到触摸数据后和上一次的状态做对比。如果某个点从无到有就是按下事件从有到无就是抬起事件坐标变化超过阈值就是移动事件。这样可以实现手势识别比如双指缩放、旋转等。不过要注意FT6236 的两点触摸数据是独立读取的P1 和 P2 的坐标寄存器是分开的。读取时要先读 TD_STATUS 确认触摸点数量再分别读取 P1 和 P2 的数据。如果只读 P1 而忽略了 P2那双指手势就无法识别了。6. 驱动代码的完整集成与测试验证6.1 主程序框架与任务调度在 ESP-IDF 中我一般会创建一个独立的任务来轮询触摸数据通过队列把数据发送给 UI 任务处理。这样触摸采集和界面刷新解耦互不阻塞。static QueueHandle_t touch_queue; void touch_task(void *arg) { ft6236_touch_data_t touch; while (1) { if (ft6236_read_touch(touch) ESP_OK) { if (touch.touch_count 0) { xQueueSend(touch_queue, touch, 0); } } vTaskDelay(pdMS_TO_TICKS(10)); } } void app_main(void) { i2c_master_init(); ft6236_init(); touch_queue xQueueCreate(10, sizeof(ft6236_touch_data_t)); xTaskCreate(touch_task, touch_task, 4096, NULL, 5, NULL); // 主循环处理其他事务 while (1) { vTaskDelay(pdMS_TO_TICKS(1000)); } }轮询间隔设为 10ms对应 100Hz 的触摸采样率完全够用。如果屏幕刷新率是 60Hz那 10ms 的采样间隔意味着每次刷新前都能拿到最新的触摸数据。6.2 测试验证方法与工具验证驱动是否正常我一般分三步走第一步用i2c_tools组件扫描 I2C 总线确认能检测到 0x38 地址的设备。ESP-IDF 的i2c_tools组件提供了i2cdetect命令非常方便。第二步读取 0x00 寄存器确认返回值不是 0xFF 或 0x00。正常应该返回 0x00正常工作模式。如果返回 0xFF说明从机没有应答。第三步用手指触摸屏幕观察 TD_STATUS 寄存器的值是否从 0 变为 1 或 2。同时读取坐标寄存器确认坐标值在合理范围内变化。如果手头有逻辑分析仪那调试起来就更方便了。直接抓 SDA 和 SCL 的波形看 START 条件、地址字节、ACK 位、数据字节是否都符合 I2C 协议。我用的是一款国产的逻辑分析仪配合开源软件抓 I2C 波形绰绰有余。6.3 性能优化与功耗考量如果项目对功耗敏感可以从以下几个方面优化降低 I2C 通信速率至 100kHz减少总线翻转次数增大轮询间隔至 20-50ms降低 CPU 唤醒频率使用 FT6236 的中断引脚无触摸时让 ESP32 进入轻睡眠模式在无触摸时关闭屏幕背光进一步降低功耗我实测过ESP32 在 240MHz 主频下轮询 I2C 触摸数据CPU 占用率不到 1%。所以对于大多数项目来说性能不是瓶颈功耗才是需要关注的重点。7. 从 FT6236 延伸I2C 驱动开发的通用方法论写完 FT6236 的驱动后我发现这套方法论可以复用到几乎所有 I2C 设备上。核心步骤就四步读手册确认设备地址和寄存器映射、配置 I2C 主机参数、封装读写函数、实现设备特定的数据解析逻辑。不同之处在于数据解析部分。比如 OLED 屏幕的 SSD1306它的显存是按页组织的写入数据时要先设置页地址和列地址而 EEPROM 的读写则需要注意页写入的边界问题跨页写入要分多次操作。但底层的 I2C 读写函数是完全通用的换个设备地址和寄存器地址就能用。我后来用同样的框架驱动了 MPU6050 六轴传感器和 BMP280 气压计代码结构几乎没变只是数据解析部分不同。这也是我坚持从芯片手册出发写驱动的原因你掌握的是通用能力而不是某个特定库的调用方法。最后分享一个小技巧调试 I2C 设备时先写一个最简单的寄存器读取程序确认能读到正确的设备 ID。很多芯片都有一个固定的设备 ID 寄存器比如 FT6236 的 0xA8 寄存器不同版本可能不同读出来和手册对比就能确认通信是否正常。这一步能帮你排除 80% 的硬件问题。
企业数字化 ERP 产品动态
相关推荐
Voyager 浏览器扩展 Mermaid 图表自动渲染完全指南:检测、全屏交互与源码级原理 AI 应用前端 【免费下载链接】voyager Enhancement suite for Gemini, AI Studio, Claude & ChatGPT — plus a prompt manager for any websites, DeepSeek Harness included. / 面向 Gemini、AI Studio、Claude 与 ChatGPT 的增强套件;其中的提示词管理器可用… · 2026/9/21 2:12:45
PI-Desktop:本地优先的AI编程智能体实战解析 1. 这不是又一个“AI桌面玩具”,而是一次本地化编程智能体的硬核落地尝试PI-Desktop 这个名字刚出现时,我第一反应是:又一个 Electron 套壳、调 API、前端炫技的“AI桌面概念产品”。但真正 clone 下来、编译、跑起来、写几个真实函数、让它读… · 2026/9/21 2:12:45
STM32 HardFault深度解析:寄存器快照与堆栈回溯实战指南 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/21 2:51:53
file_selector_ios:Flutter 官方 iOS 文件选择器插件的架构、UTI 过滤与实战指南 移动开发跨平台 【免费下载链接】plugins Plugins for Flutter maintained by the Flutter team 项目地址: https://gitcode.com/gh_mirrors/pl/plugins 点击查看 免费下载 导读
本文围绕 Flutter 团队维护的联邦插件体系中的 iOS 端实现 file_selector_ios 展开&… · 2026/9/21 2:51:53
多模块Maven项目JaCoCo覆盖率聚合的5类典型坑与排查指南 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/21 2:51:53
研发管理系统选型指南:跨部门协同流程梳理与POC验收清单 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/21 2:50:53
Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化 直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡… · 2026/9/21 0:02:39
Word表格编号全攻略:从列表编号到题注交叉引用 写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技… · 2026/9/21 0:02:39
从第一个站到第二个站:独立开发者的静态网站选型与落地实践 1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&… · 2026/9/20 0:00:41
agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程 agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程 【免费下载链接】agentic-awesome-skills AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and … · 2026/9/21 0:00:18
gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析 gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析 【免费下载链接】gin-vue-admin 🚀ViteVue3Gin拥有AI辅助的基础开发平台,企业级业务AI开发解决方案,内置mcp辅助服务,内置skills管理,… · 2026/9/21 0:00:18