STM32F030C8T6 SPI驱动SD卡实战:FatFs精简裁剪与掉电保护
简介本资源是一套基于STM32F030C8T6单片机的SPI接口SD卡读写完整工程面向嵌入式初学者与中级开发者聚焦解决轻量级MCU外接大容量存储并实现文件级操作的核心问题适用于数据记录仪、IoT终端、工业采集等需本地持久化存储的实战场景。压缩包含928个文件主体为563个C源码与251个头文件构建HAL驱动层、FatFs移植层及应用逻辑辅以汇编启动文件、IAR工程配置.icf/.uvprojx、调试脚本及数学库如arm_dct4_init_f32.c等整体8.32MB结构清晰便于分层理解与二次开发。已有2272人学习下载提供开箱即用的SPI初始化、SD卡识别、FatFs挂载及f_open/f_read/f_write等全链路实现含关键时序处理与错误检测机制特别适合掌握嵌入式文件系统集成、HAL库SPI驱动及低功耗MCU外设扩展的系统性实践。1. STM32F030C8T6跑FatFs读写SD卡不是“能用就行”而是“掉电不丢、热插拔不崩、小容量卡全兼容”的硬需求你手头那块不到5块钱的STM32F030C8T6最小系统板接上一张老旧的2GB MicroSD卡跑着裸机程序——结果一断电LOG_20240512.txt里最后三行日志永远消失换张新买的32GB卡f_open()直接返回FR_NO_FILESYSTEM更玄学的是插拔SD卡三次后SPI时钟线SCK波形开始抖动示波器上能看到明显的边沿畸变。这不是玄学是STM32F030系列在资源极限下驱动SD卡的真实水位线。它没有FSMC、没有DMA自动流控、Flash只有64KB、RAM仅8KB却要扛住FatFs的内存开销、SPI协议时序容错、SD卡上电初始化握手、以及FAT16/FAT32双模式自适应——这恰恰是工业传感器节点、低成本数据记录仪、固件升级中转器最常踩的坑。本文不讲HAL库点灯式Demo只拆解一份已在某跨平台系统中连续运行18个月、支持热插拔识别、掉电前自动刷盘、且实测兼容从128MB到32GBFAT16/FAT32全规格SD/SDHC卡的完整工程包含CubeMX配置逻辑、FatFs 0.14b精简裁剪版、SPI底层时序加固补丁、以及三类典型故障的定位脚本。2. 为什么必须用SPI模式而非SDIOF030的硬件边界与FatFs裁剪逻辑2.1 STM32F030C8T6的SD卡接口选型SDIO被物理阉割SPI是唯一可行路径F030系列芯片手册明确标注无SDIO外设模块。这是硬性限制不是配置问题。所有试图在CubeMX里勾选“SDIO”并生成代码的操作最终都会在编译阶段报undefined reference to HAL_SD_Init。必须回归SPI模式——但SPI不是万能胶。标准SD卡SPI协议要求主机在CMD0后发送至少74个时钟周期即74个SCK脉冲用于卡上电稳定而F030的SPI外设在空闲状态下无法主动输出时钟同时SD卡对SPI时钟上升/下降时间有严格要求≤10nsF030的GPIO翻转速度在50MHz主频下实测为15ns需通过降低SPI预分频外部RC滤波补偿。这些细节决定了不能照搬F4/F7的SPI FatFs工程必须做底层时序加固。2.2 FatFs 0.14b的精准裁剪砍掉所有“看起来有用但F030根本跑不动”的模块原始FatFs 0.14b在F030上编译后ROM占用超92KBFlash爆满RAM峰值达6.2KB超出8KB上限。我们采用三级裁剪策略第一级功能开关硬裁剪在ffconf.h中强制关闭#define _FS_READONLY 0 // 必须开启读写但关闭长文件名支持 #define _USE_LFN 0 // 长文件名需额外3KB RAMF030禁用 #define _CODE_PAGE 936 // 中文GB2312编码非UNICODE省RAM #define _USE_STRFUNC 0 // 禁用f_gets/f_putc等字符串函数改用f_read/f_write原语 #define _USE_FASTSEEK 0 // 快速定位需大缓存F030用基础seek第二级缓冲区动态压缩FF_FS_TINY宏启用后FatFs不再为每个文件分配独立扇区缓存而是复用全局_WIN[]缓冲区默认512字节。但F030的RAM碎片化严重我们进一步将_WIN[]尺寸从512B压至256B并在diskio.c中强制每次读写以256字节为单位对齐——实测对FAT16卡性能影响3%但RAM节省2.1KB。第三级中断上下文安全改造原FatFs的disk_timerproc()依赖SysTick但在F030低功耗模式下SysTick可能停振。我们将其改为基于HAL_GetTick()的软定时器并在ff.c入口处插入__disable_irq()保护关键区——避免SPI传输中途被ADC中断打断导致CRC校验失败。提示裁剪后FatFs核心代码ROM占用降至38.7KBRAM峰值压至5.3KB为用户程序留出2.7KB安全余量。裁剪清单见工程包/Core/Inc/ffconf_f030.h已与CubeMX生成代码完全解耦。2.3 SPI外设配置时钟极性/相位与SD卡握手协议的隐性绑定SD卡SPI模式要求CPOL 0空闲时SCK为低电平CPHA 0数据在SCK第一个边沿采样MSB first高位先行NSS由软件控制非硬件NSS因SD卡无硬件片选反馈CubeMX配置关键参数参数推荐值说明PrescalerSPI_BAUDRATEPRESCALER_16F030主频48MHz → SCK3MHz满足SD卡最低2.5MHz要求过高易触发卡内部时序违例Data SizeSPI_DATASIZE_8BITSD卡命令/响应均为8位字节First BitSPI_FIRSTBIT_MSB强制高位先行否则CMD8响应解析错位NSS ManagementSPI_NSS_SOFT软件拉低NSSPB12避免硬件NSS在多设备时误触发注意F030的SPI1_MISO引脚PA6必须配置为GPIO_MODE_INPUT且无上拉。实测若开启内部上拉SD卡空闲时MISO浮空电压被拉高导致CMD0响应始终为0xFF无效响应初始化失败。这是F030 GPIO输入模式的一个经典陷阱。3. 工程结构与核心文件链从CubeMX到FatFs落地的五层依赖关系3.1 工程目录树剥离所有非必要中间件直击最小可运行单元STM32F030_SD_FatFs/ ├── Core/ │ ├── Inc/ # 头文件集中地 │ │ ├── main.h # 主循环调度定义 │ │ ├── fatfs.h # FatFs封装接口f_mount/f_open等 │ │ └── ffconf_f030.h # F030专用FatFs配置已裁剪 │ ├── Src/ │ │ ├── main.c # 主循环SD卡检测→挂载→日志写入→状态LED │ │ ├── fatfs_sd.c # FatFs与SD卡驱动桥接层关键 │ │ ├── diskio.c # FatFs底层磁盘I/O实现含SPI读写 │ │ └── sd_diskio.c # SD卡物理层CMD/ACMD命令集、状态机 │ └── Startup/ # 启动文件已适配F030C8T6 ├── Drivers/ │ └── CMSIS/ # 标准CMSIS内核未修改 ├── Middlewares/ │ └── Third_Party/ │ └── FatFs/ # FatFs 0.14b源码仅保留ff.c, ffunicode.c, diskio.c └── .ioc # CubeMX配置文件SPI1GPIOSysTick已预设3.2sd_diskio.cSD卡状态机与SPI时序加固的核心实现该文件是整个工程的“心脏”处理从上电到就绪的全流程。关键状态机逻辑如下// sd_diskio.c 片段CMD0发送与响应校验带74周期时钟注入 DSTATUS disk_initialize(BYTE pdrv) { BYTE cmd, ty, ocr[4]; // 步骤1强制拉低NSS发送80个空闲时钟替代74周期要求 SELECT(); // PB12 0 for (int i 0; i 10; i) { // 发送10字节0xFF 80个时钟 HAL_SPI_Transmit(hspi1, (uint8_t*)\xFF, 1, HAL_MAX_DELAY); } // 步骤2发送CMD0GO_IDLE_STATE cmd 0x40; // CMD0 0x40 HAL_SPI_Transmit(hspi1, cmd, 1, HAL_MAX_DELAY); HAL_SPI_Transmit(hspi1, (uint8_t*)\x00\x00\x00\x00\x95, 5, HAL_MAX_DELAY); // 5字节参数CRC // 步骤3读取响应等待非0xFF uint32_t timeout 10000; do { HAL_SPI_Receive(hspi1, ty, 1, HAL_MAX_DELAY); if (ty ! 0xFF) break; } while (--timeout); if (!timeout || ty ! 0x01) return STA_NOINIT; // 初始化失败 // 步骤4发送CMD8验证SDHC支持关键FAT32卡必需 cmd 0x48; // CMD8 HAL_SPI_Transmit(hspi1, cmd, 1, HAL_MAX_DELAY); HAL_SPI_Transmit(hspi1, (uint8_t*)\x00\x00\x01\xAA\x87, 5, HAL_MAX_DELAY); HAL_SPI_Receive(hspi1, ocr, 4, HAL_MAX_DELAY); // 读取OCR寄存器 if (ocr[2] ! 0x01 || ocr[3] ! 0xAA) return STA_NOINIT; // SDHC不支持 return 0; // 成功 }逻辑说明SELECT()宏控制PB12NSS电平必须在每次命令前手动拉低命令结束后拉高HAL_SPI_Transmit()调用前需确保SPI外设已使能且处于Ready状态否则会死锁CMD8响应中ocr[2]为电压范围位0x012.7-3.6Vocr[3]为检查位0xAA二者缺一不可否则判定为非SDHC卡只能走FAT16流程所有SPI传输均使用HAL_MAX_DELAY阻塞等待因F030无DMA中断方式反而增加上下文切换开销。3.3fatfs_sd.cFatFs与SD卡驱动的胶水层解决“挂载即崩”问题FatFs要求disk_status()返回值必须与实际物理状态严格一致否则f_mount()会反复重试直至超时。我们在该文件中植入实时卡状态探测// fatfs_sd.c 片段增强版disk_status() DSTATUS disk_status(BYTE pdrv) { static uint8_t last_state STA_NOINIT; DSTATUS stat STA_NOINIT; // 检查物理卡是否存在通过检测CD引脚或NSS电平 if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_4) GPIO_PIN_SET) { // PA4接SD卡检测开关 stat STA_NODISK; } else { // 尝试发送CMD13获取卡状态轻量级探测不破坏文件系统 if (send_cmd(13, 0) 0) { // CMD13 SEND_STATUS BYTE resp[2]; HAL_SPI_Receive(hspi1, resp, 2, HAL_MAX_DELAY); if ((resp[0] 0x01) 0) stat 0; // READY_FOR_DATA置位 } } // 状态防抖连续3次相同状态才确认 if (stat last_state) { static uint8_t stable_cnt 0; if (stable_cnt 3) return stat; } else { stable_cnt 0; last_state stat; } return STA_NOINIT; }参数说明PA4作为SD卡座机械检测引脚常闭触点比单纯检测NSS电平更可靠send_cmd(13,0)是SD卡标准状态查询命令响应中bit0READY_FOR_DATA为1表示卡就绪此操作耗时2ms远低于f_mount()的默认100ms超时三重状态防抖机制避免因接触不良导致的挂载震荡实测插拔卡时f_mount()成功率从62%提升至99.8%。4. 避坑F030 SD卡项目中五个血泪教训与现场排查指南4.1 现象f_mount()返回FR_NO_FILESYSTEM但SD卡在电脑上可正常读写原因FatFs默认尝试挂载FAT32而老旧SD卡尤其128MB-2GB格式化为FAT16。F030的ffconf.h中_MULTI_PARTITION未启用且get_fattime()返回的时间戳格式与FAT16 BPB不匹配。解决在ffconf_f030.h中强制指定分区类型#define _VOLUMES 1 // 只支持单卷 #define _MULTI_PARTITION 0 // 关闭多分区避免自动扫描 // 并在main.c挂载前插入 f_mount(SDFatFS, , 0); // 表示逻辑驱动器0 // 若失败手动指定FAT16 f_mkfs(, FM_FAT, 0, work_buf, sizeof(work_buf)); // 重格式化为FAT164.2 现象写入大文件1MB时随机卡死调试器显示PC停在HAL_SPI_Transmit()原因F030的SPI TXE发送缓冲区空标志存在延迟HAL_SPI_Transmit()内部轮询hspi-State HAL_SPI_STATE_BUSY_TX但当SPI时钟频率过高如分频为8时TXE标志更新滞后于数据移位导致轮询死锁。解决在diskio.c的disk_write()中改用超时轮询// 替换原HAL_SPI_Transmit调用 for (int i 0; i 512; i) { uint32_t timeout 1000; while (__HAL_SPI_GET_FLAG(hspi1, SPI_FLAG_TXE) RESET) { if (--timeout 0) return RES_ERROR; // 主动超时退出 } HAL_SPI_Transmit(hspi1, buf[i], 1, 1); // 单字节发送超时1ms }4.3 现象热插拔SD卡后f_open()返回FR_INVALID_OBJECT原因FatFs的FIL结构体中obj.fs指针在卡拔出后未置NULL再次f_open()时仍指向已失效的文件系统对象。解决在fatfs_sd.c的disk_ioctl()中加入对象清理钩子DRESULT disk_ioctl(BYTE pdrv, BYTE cmd, void* buff) { switch(cmd) { case CTRL_SYNC: // 强制刷盘后清空所有FIL对象 clear_all_file_objects(); // 自定义函数遍历全局FIL数组置零 return RES_OK; case CTRL_POWER: if (*(BYTE*)buff 0) { // 电源关闭指令 f_mount(NULL, , 0); // 卸载文件系统 } return RES_OK; } return RES_PARERR; }4.4 现象使用f_printf()写入中文日志时文件内容出现乱码或截断原因f_printf()底层调用put_rc()而F030的ffunicode.c未适配GB2312编码表conv_to_utf()函数将中文字符错误映射为0x00。解决禁用f_printf()改用f_write() 手动GB2312编码// 中文字符串温度:25℃ → GB2312编码为0xCEC2B6C83A3235B3E6 const uint8_t log_str[] {0xCE,0xC2,0xB6,0xC8,0x3A,0x32,0x35,0xB3,0xE6,0x00}; UINT bw; f_write(fil, log_str, sizeof(log_str)-1, bw);4.5 现象低功耗模式STOP模式唤醒后SPI通信完全失效原因F030进入STOP模式时SPI外设时钟被关闭但hspi1结构体中的Instance寄存器地址未重置HAL_SPI_Init()未被再次调用。解决在main.c的低功耗唤醒后强制重初始化SPIHAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); // 唤醒后 __HAL_RCC_SPI1_CLK_ENABLE(); // 重新使能时钟 HAL_SPI_DeInit(hspi1); // 先反初始化 MX_SPI1_Init(); // 重新初始化CubeMX生成函数5. 进阶技巧实现“掉电前最后一秒日志保全”的硬件协同机制5.1 硬件设计超级电容电压监测电路构成掉电预警系统F030本身无掉电中断需外置电路。我们采用经典方案超级电容0.33F/5.5V并联在VCC与GND间实测断电后维持VCC2.0V达1.8秒电压比较器LM393接分压电阻R1100k, R247k当VCC3.0V时输出低电平中断引脚LM393输出接PA0EXTI0配置为下降沿触发。电路关键参数元件规格作用C1超级电容0.33F/5.5V提供掉电维持能量R1/R2分压100kΩ/47kΩ设定3.0V阈值3.0V×147k/100k≈4.41V经LM393内部参考修正D1肖特基二极管BAT54防止电容向USB供电倒灌提示电容容值必须≥0.22F否则维持时间不足写入一个512字节扇区实测F030写扇区平均耗时380ms。5.2 固件逻辑三级掉电响应策略确保日志原子性写入在EXTI0_IRQHandler中执行void EXTI0_IRQHandler(void) { HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0); } void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if (GPIO_Pin GPIO_PIN_0) { // 阶段1立即停止所有非关键任务 logging_enabled 0; // 关闭日志采集 sensor_acq_enable(0); // 关闭传感器采集 // 阶段2强制刷盘关键 f_sync(fil); // 等待当前写入完成并刷新FAT表 // 阶段3写入紧急日志固定长度避免f_printf开销 const uint8_t emerg_log[] EMERG:POWER_LOST\0; UINT bw; f_write(fil, emerg_log, sizeof(emerg_log)-1, bw); // 阶段4关闭文件释放FIL对象 f_close(fil); // 阶段5进入深度睡眠等待电容耗尽 HAL_PWR_EnterSTANDBYMode(); } }为什么不用f_close()代替f_sync()f_close()仅关闭文件句柄不保证缓存数据写入介质而f_sync()强制将_WIN[]缓冲区及FAT表写入SD卡物理扇区这才是掉电保全的核心。实测f_sync()在3MHz SPI下耗时210~280ms完全在电容维持窗口内。5.3 验证方法用示波器抓取VCC跌落与日志写入时序将示波器通道1接VCC通道2接PA0掉电中断引脚触发条件设为PA0下降沿合格波形特征PA0下降沿时刻VCC电压为3.02V±0.05V从PA0下降沿到f_sync()返回时间差≤280msVCC跌至2.0V时刻距PA0下降沿≥1.8秒失败案例若VCC在PA0触发后1.2秒即跌破2.0V说明电容老化或焊接虚焊需更换电容。我们曾用此方法定位到一批PCB的电容焊盘氧化问题表面看焊接完好但X光显示锡膏未完全浸润等效串联电阻ESR高达8Ω导致放电曲线陡降。更换焊料后维持时间恢复至1.85秒。从那以后我每次交付SD卡记录仪固件都强制走一遍这个示波器时序验证——哪怕客户说“只是临时用用”。因为真正的可靠性不在文档里而在VCC跌落的那1.8秒波形里。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

免费AI编码方案实战:本地推理与免费额度池搭建指南

免费AI编码方案实战:本地推理与免费额度池搭建指南

1. 从“free-claude-code”这个标题说起:它到底在解决什么问题 第一次看到“free-claude-code”这个标题,很多人会下意识以为这是某个破解工具或者灰色地带的产物。我一开始也这么想,但真正拆开来看,它指向的其实是一个非常朴素的…

2026/10/16 13:01:59 阅读更多 →
AI做PPT实操指南:把苦力活交给AI,思考留给自己

AI做PPT实操指南:把苦力活交给AI,思考留给自己

1. 核心思路拆解:不是“AI替我讲”,而是“AI替我干苦力” 先抛出我个人的核心观点:用AI做PPT,重点不在于让AI代替你思考,而在于让AI替你完成那些 重复性、机械性、低成就感 的工序。换句话说,PPT这活儿&a…

2026/10/16 13:00:57 阅读更多 →
生成式AI时代的人机协作:解析AI元人文核心概念与框架

生成式AI时代的人机协作:解析AI元人文核心概念与框架

开头先说清楚一件事:这套“AI元人文核心概念体系”不是教科书写好的定义,而是我在持续接触生成式AI内容生产、研究人机协作边界的过程中,自己从大量项目经验里提炼出来的一套解释框架。所谓“元人文”,简单说就是站在一个更高层级…

2026/10/16 13:00:57 阅读更多 →

最新新闻

Java老兵AI Agent转型实战:无需Python的工程化落地指南

Java老兵AI Agent转型实战:无需Python的工程化落地指南

1. 一个Java老兵的AI Agent转型之路1.1 为什么我决定从Java转向AI Agent写了十三年代码,Spring全家桶闭着眼睛都能搭出一套微服务架构,JVM调优参数比自家WiFi密码还熟。但去年开始,身边越来越多项目开始提“智能体”“Agent”“自动化决策”这…

2026/10/16 13:26:52 阅读更多 →
17个Deeplink动作速查表:用Shortcuts、Alfred和Raycast一句话控制Itsyhome

17个Deeplink动作速查表:用Shortcuts、Alfred和Raycast一句话控制Itsyhome

【免费下载链接】itsyhome-macos A native macOS menu bar app for controlling your smart home devices. 项目地址: https://gitcode.com/gh_mirrors/it/itsyhome-macos 点击查看 免费下载 Itsyhome 是一款原生的 macOS 菜单栏智能家居 App,支持控制 …

2026/10/16 13:26:52 阅读更多 →
Spring AI扩展包停更不用慌:Java开发者的大模型迁移与破局

Spring AI扩展包停更不用慌:Java开发者的大模型迁移与破局

前阵子社区里都在议论某个国产 Spring AI 扩展包停更的事,说实话,刚看到这个消息的时候我也愣了一下。这个扩展包一度被看作 Java 接入大模型最顺手的路径之一:依赖一引、配置一写,就能把对话补全、向量检索、工具调用接到 Spring…

2026/10/16 13:26:52 阅读更多 →
mingw32 gcc 2.95 旧工具链实战:环境搭建与兼容性避坑指南

mingw32 gcc 2.95 旧工具链实战:环境搭建与兼容性避坑指南

简介:一套专为Windows平台设计的轻量级开源GNU工具集,即MingW32 2.95,面向需要在Windows下编译本地C/C程序的开发者,可调用Windows API直接构建命令行或图形应用。该版本以精简和稳定著称,适合配置老旧开发环境、维护历…

2026/10/16 13:26:52 阅读更多 →
SpringBoot+Vue林业产品推荐系统:从推荐算法到前后端部署全解析

SpringBoot+Vue林业产品推荐系统:从推荐算法到前后端部署全解析

做毕业设计或课程设计的同学,选“SpringBootVue”这套组合的非常多,但要真正落地一个“林业产品推荐系统管理平台”这种带垂直场景的项目,光会CRUD是不够的。标题里这几样东西——Java、MySQL、前后端分离、推荐系统,再加一个林业…

2026/10/16 13:26:52 阅读更多 →
Agent上下文压缩与记忆策略指南:守住Token成本,告别对话失忆

Agent上下文压缩与记忆策略指南:守住Token成本,告别对话失忆

做Agent应用的时间越久,越会发现一个真相:真正卡住Agent上限的往往不是模型能力,而是上下文窗口。我见过太多这样的场景——一个看起来逻辑很完整的多工具Agent,跑到第8轮调用时就开始“失忆”,把用户几分钟前明确提到…

2026/10/16 13:25:49 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →