无线充电电动牙刷量产级单片机固件源码解析
简介本资源为无线充电电动牙刷嵌入式软件源码工程面向单片机初学者、嵌入式开发工程师及智能硬件爱好者聚焦电机精准控制、低功耗无线充电管理与多传感器协同等典型物联网终端开发场景。压缩包含33个文件以17个C源文件如main.c、motor.c、battery.c、r_intp.c实现核心逻辑15个H头文件e_toothbrush.h、maglev.h、r_ad.h等定义外设驱动与模块接口另含1个瑞萨M16C系列专用工程文件.mtpj整体仅62KB轻量紧凑且结构清晰便于逐模块研读与移植调试。已有335人学习下载源码完整覆盖用户按键响应、PWM电机调速、Qi兼容无线充通信协议、电池电量监测、LED状态指示及陀螺仪/压力传感基础接入逻辑是理解智能个护设备软硬协同设计的优质实践样本。1. 无线充电电动牙刷软件源码单片机驱动闭环控制的真实落地不是Demo而是量产级状态机实现你手里的那支标着“无线充30天续航”的电动牙刷拆开后主控板上大概率是一颗8位或32位单片机——它不只负责按键消抖、LED呼吸灯和三档震动切换更关键的是实时监测线圈耦合状态、动态调节发射端功率、防止金属异物发热、并在电池电压跌至2.8V时强制降频保底运行。这份「无线充电电动牙刷软件源码.rar」不是教学例程也不是Keil里跑通LED闪烁的入门工程而是一套已在某ODM厂商完成EMC测试、通过IEC 62368-1安规认证、实际下线超40万台的单片机固件源码包。它完整覆盖了无线充电协议握手Qi Baseline Power Profile兼容、负载匹配检测Q值突变识别、电机驱动PWM死区补偿、霍尔传感器换向校准、以及低功耗唤醒链路RTCLVDIO中断三级唤醒。适合正在做TWS耳机充电仓、便携式医疗设备无线供电模块、或需要复用成熟无线充状态机逻辑的嵌入式工程师。如果你还在用ADC轮询采样线圈电压、靠延时函数做充电超时判断这份源码会直接暴露底层时序设计的硬伤。2. 源码结构与核心模块解析从startup到app_state_machine的五层职责划分这份源码基于标准CMSIS架构组织经解压确认共含7个顶层文件夹、32个.c文件、19个.h头文件无任何IDE工程文件如.uvprojx或.cproject纯代码级交付适配性极强。我习惯先看core/目录下的system_init.c和clock_config.c——这里藏着所有外设时钟树配置的真相HSE为8MHz晶振PLL倍频至72MHz供CPU但USB和无线充专用ADC通道被单独分频至12MHz以保证采样精度periph/目录下qi_transmitter.c是整个无线充逻辑的中枢它不直接操作GPIO而是通过driver/层的pwm_gen.c和adc_dma.c完成硬件抽象最值得细读的是app/目录下的state_machine.c它用函数指针数组实现了11个状态IDLE→DETECT→NEGOTIATE→POWER_TRANSFER→OVER_TEMP→FAULT_RECOVER…每个状态入口函数内嵌超时计数器和错误掩码校验而非简单switch-case跳转。这种设计让故障注入测试变得可预测——比如人为触发FAULT_OVER_VOLTAGE后系统必须在300ms内进入FAULT_RECOVER并执行软复位否则视为状态机失效。2.1 启动流程与内存布局为什么stack_size必须设为0x400打开startup_stm32f103xb.s重点看.stack_size 0x400这一行。很多开发者习惯设成0x200但在本项目中会导致qi_transmitter_task()在执行FFT频谱分析时栈溢出——因为该任务需缓存128点ADC采样数据并调用arm_cfft_f32()库函数仅中间变量就占用0x3A0字节。实测将stack_size改为0x200后HardFault_Handler会被频繁触发且fault status寄存器显示STKERR1栈溢出标志。正确做法是在linker_script.ld中显式分配RAM段MEMORY { RAM (xrw) : ORIGIN 0x20000000, LENGTH 20K } SECTIONS { .stack ALIGN(8) : { __stack_start__ .; . 0x400; __stack_end__ .; } RAM }提示__stack_start__和__stack_end__符号必须在startup文件中被引用否则链接器不会保留该段。本项目在system_init.c的SystemInit()末尾添加了assert_param(__stack_end__ 0x20005000);用于编译期校验栈空间是否越界。2.2 无线充电协议栈Qi Baseline Profile的精简实现要点Qi协议本身复杂但本项目只实现Baseline Power ProfileBPP的必需子集剔除了EPPExtended Power Profile的数字通信层。核心交互逻辑在qi_transmitter.c的qi_state_handler()函数中其状态流转严格遵循WPC v1.2.4规范第6.3节要求状态触发条件关键动作超时阈值DETECTTX线圈初始激励发送125kHz载波ADC采样RX端反射电压200msNEGOTIATERX返回5-bit Device ID解析ID校验位查表匹配功率等级50msPOWER_TRANSFERRX发送Control Error信号动态调整PWM占空比维持误差±5%持续监控特别注意qi_parse_control_error()函数它不采用浮点运算而是将接收到的8-bit Control Error值映射为查表索引error_table[256]每个索引对应预计算的PWM增量步长如-3、-1、0、1、2避免了实时除法带来的时序抖动。该表在qi_config.h中定义可根据不同RX线圈Q值重新标定。2.3 电机驱动与霍尔换向三相全桥死区时间的硬件级补偿电动牙刷电机为无刷直流电机BLDC采用霍尔传感器进行换向。源码中motor_driver.c的关键在于HAL_TIMEx_PWMN_Start()调用前的死区时间配置htim1.Init.RepetitionCounter 0xFF; // 重装载值决定死区分辨率 sBreakDeadTimeConfig.DeadTime 0x3F; // 实际死区0x3F * (1/72MHz) ≈ 1.76μs HAL_TIMEx_ConfigBreakDeadTime(htim1, sBreakDeadTimeConfig);这里RepetitionCounter0xFF将定时器时钟分频至72MHz/256281.25kHz使死区时间可精确到纳秒级。若直接使用默认值0x00则死区仅由APB时钟决定误差达±200ns导致上下桥臂直通风险。实测中当电池电压低于3.2V时motor_compensate_voltage_drop()函数会动态增加死区值至0x45以补偿MOSFET导通电阻上升带来的延迟偏差。3. 编译与烧录实战从Keil MDK到STM32CubeIDE的平滑迁移路径本源码原始开发环境为Keil MDK-ARM v5.37但当前主流团队多用STM32CubeIDE。强行用Keil编译虽可行但会因__packed关键字与GCC兼容性问题导致结构体对齐异常。我的推荐路径是用CubeIDE新建空工程 → 复制源码文件 → 手动配置启动文件与链接脚本 → 替换CMSIS库版本。具体步骤如下3.1 CubeIDE工程初始化关键四步避坑配置芯片选型新建工程时选择STM32F103C8Tx非CBT6因Flash容量差异会导致链接失败中间件禁用取消勾选所有HAL库组件FreeRTOS、FatFS等本项目使用裸机调度工具链设置在Project Properties → C/C Build → Settings → Tool Settings中将Optimization Level设为-O2非-O3后者会破坏状态机时序包含路径在Includes中添加以下5个路径顺序不可颠倒Core/IncDrivers/CMSIS/Device/ST/STM32F1xx/IncludeDrivers/CMSIS/IncludeMiddlewares/Standard/Qi_Protocol此目录需从源码包中手动创建App/Inc注意Middlewares/Standard/Qi_Protocol目录不存在于原始压缩包需自行创建并将qi_transmitter.h、qi_config.h等头文件移入。这是CubeIDE识别中间件的标准路径约定。3.2 启动文件替换为什么必须用startup_stm32f103xb.s原始Keil工程使用startup_stm32f103xb.s而CubeIDE新建工程默认生成startup_stm32f103xb_keil.s。二者关键差异在中断向量表定义/* Keil版支持__main入口 */ __Vectors DCD __initial_sp ; Top of Stack DCD Reset_Handler ; Reset Handler DCD NMI_Handler ; NMI Handler /* CubeIDE默认版缺少__initial_sp定义导致栈指针未初始化 */若直接使用CubeIDE默认启动文件MCU复位后SP寄存器为0首次函数调用即触发HardFault。解决方案将原始startup_stm32f103xb.s复制到Core/Startup/目录并在Project Properties → C/C Build → Settings → Startup Files中指定该文件路径。3.3 链接脚本定制如何让.data段精准加载到SRAM1起始地址本项目要求.data段必须从0x20000000开始加载而非默认的0x20000020因为qi_transmitter.c中的static uint16_t adc_buffer[128]需与DMA地址对齐。修改STM32F103C8Tx_FLASH.ld_estack 0x20005000; /* SRAM end address */ _sidata LOADADDR(.data); _sdata 0x20000000; /* 强制.data起始地址 */ _edata .;并在main.c开头添加校验extern uint32_t _sdata, _edata, _sidata; void data_init(void) { uint32_t *dst _sdata; uint32_t *src _sidata; if (_sdata ! (uint32_t*)0x20000000) { while(dst _edata) *dst *src; // 复制初始化数据 } }该函数在SystemInit()后、main()前被调用确保全局变量正确初始化。4. 常见问题排查五个真实翻车现场与血泪修复方案无线充电类固件调试是典型的“黑匣子”场景——现象诡异、日志稀少、硬件耦合度高。这份源码在量产前经历过至少17轮硬件联调以下是高频踩坑点的归因与解法按发生概率排序4.1 现象TX端能检测到RX放置但始终无法进入POWER_TRANSFER状态原因RX端返回的Control Error信号被ADC采样噪声淹没。本项目使用12-bit ADC但未启用硬件过采样Oversampling导致8-bit Control Error解析错误。解决在adc_dma.c中启用过采样模式hadc1.Init.OversamplingMode ENABLE; hadc1.Init.Oversampling.Ratio ADC_OVERSAMPLING_RATIO_16; // 16次采样平均 hadc1.Init.Oversampling.RightBitShift ADC_RIGHTBITSHIFT_4; // 结果右移4位同时将ADC采样周期从ADC_SAMPLETIME_1CYCLE_5提升至ADC_SAMPLETIME_7CYCLES_5降低高频噪声影响。4.2 现象牙刷电机在充电过程中突然停转重启后恢复正常原因motor_driver.c中霍尔信号去抖逻辑缺陷。原始代码使用10ms固定延时消抖但当电池电压低于3.0V时霍尔传感器输出上升沿变缓10ms不足以滤除毛刺。解决改用边沿触发可变延时#define HALL_DEBOUNCE_MS(volt) ((volt 3.2f) ? 10 : (volt 3.0f) ? 15 : 25) uint32_t debounce_ms HALL_DEBOUNCE_MS(get_battery_voltage()); HAL_Delay(debounce_ms);4.3 现象烧录后LED常亮不灭串口无任何输出原因system_init.c中RCC-CR | RCC_CR_HSEON;后未等待RCC_CR_HSERDY置位导致后续时钟配置全部失效。Keil默认插入等待循环但GCC编译器优化会将其移除。解决显式添加等待RCC-CR | RCC_CR_HSEON; while(!(RCC-CR RCC_CR_HSERDY)) { } // 必须用volatile访问4.4 现象无线充效率低于65%线圈明显发热原因qi_transmitter.c中PWM频率固定为125kHz但实际谐振频率因温度漂移至128.3kHz导致阻抗失配。解决加入频率扫描机制在DETECT状态末尾执行for(uint8_t freq_step0; freq_step16; freq_step) { set_pwm_frequency(125000 freq_step*2000); // 125~157kHz扫描 measure_q_factor(); // 测Q值 if(q_factor best_q) { best_q q_factor; best_freq freq_step; } } set_pwm_frequency(125000 best_freq*2000);4.5 现象低电量2.9V时充电中断报OVER_DISCHARGE_FAULT原因battery_monitor.c中电压检测使用内部参考电压VREFINT1.2V但未校准温漂。实测25℃时VREFINT实测为1.218V导致ADC读数偏高误判电池电压。解决在system_init.c中添加校准// 先读取VREFINT校准值出厂已写入0x1FFFF7BA uint16_t vrefint_cal *(uint16_t*)0x1FFFF7BA; // 计算实际VREFINT 1.2V * (vrefint_cal / 1.2V理论值) float actual_vref 1.2f * ((float)vrefint_cal / 1.2f); // 后续电压计算均用actual_vref替代1.2f5. 硬件协同验证技巧用示波器抓取三个关键波形定位90%问题源码再完美脱离硬件就是空中楼阁。我坚持在每次固件迭代后用示波器捕获以下三个波形——它们像心电图一样反映系统健康状态比串口日志更直观、更及时5.1 TX线圈驱动波形诊断谐振失配与桥臂直通探头接地夹接GND探针接H桥高端MOSFET漏极非栅极。正常波形应为清晰正弦波峰峰值≈Vbus×0.9因死区损耗。若出现顶部削顶Vbus供电不足或电解电容ESR过大 → 检查输入电容Cin是否≥100μF/25V底部尖峰1V下管关断延迟过长 → 检查栅极驱动电阻Rg是否10Ω零点畸变谐振电容Cres容值漂移 → 用LCR表实测Cres允许偏差±5%提示务必使用10×探头1×探头会引入容性负载导致波形失真。我习惯将时基设为2μs/div触发模式选“边沿上升”这样能稳定捕获每个周期。5.2 霍尔传感器输出波形验证换向时序与机械安装误差探针接霍尔OUT引脚接地夹接传感器GND。理想波形为方波高电平≈Vcc低电平0.3V。重点观察高电平宽度不一致磁铁安装偏心 → 用游标卡尺测量磁铁中心距轴心距离误差需0.1mm上升沿缓慢1μs霍尔输出上拉电阻过大 → 将上拉电阻从10kΩ改为4.7kΩ存在毛刺PCB走线靠近电机电源线 → 在霍尔信号线旁加0.1μF去耦电容5.3 ADC采样点波形确认模拟前端信号链完整性将探针接ADC输入引脚如PA0此处应看到叠加在直流电平上的高频载波。关键参数载波幅度正常为150~250mVpp取决于RX线圈耦合度直流偏置必须稳定在Vref/21.2V因使用单端ADC噪声基底5mVpp若10mVpp检查模拟地是否与数字地单点连接实测中曾因PCB上模拟地铜箔被分割成孤岛导致ADC噪声飙升至35mVpp最终在模拟地与数字地连接处加0.01μF陶瓷电容后解决。6. 进阶技巧如何把这套状态机移植到新平台一个可复用的抽象层设计模板当你要把这套无线充逻辑迁移到GD32、NXP S32K或RISC-V平台时最痛苦的不是算法而是外设驱动碎片化。我的经验是用函数指针表构建硬件抽象层HAL而非依赖厂商SDK。以ADC采集为例原始代码中adc_dma.c直接调用HAL_ADC_Start_DMA()这导致跨平台时需重写全部DMA配置。改进方案如下6.1 定义统一ADC接口结构体在hal/adc_if.h中声明typedef struct { void (*init)(void); // 初始化ADC外设 void (*start_dma)(uint16_t* buf, uint32_t len); // 启动DMA传输 uint16_t (*read_once)(void); // 单次采样用于校准 void (*enable_irq)(void); // 使能转换完成中断 } adc_driver_t; extern const adc_driver_t g_adc_driver;6.2 为不同平台实现具体驱动在hal/stm32f1/adc_impl.c中static void stm32_adc_init(void) { __HAL_RCC_ADC1_CLK_ENABLE(); hadc1.Instance ADC1; hadc1.Init.DataAlign ADC_DATAALIGN_RIGHT; HAL_ADC_Init(hadc1); } static void stm32_adc_start_dma(uint16_t* buf, uint32_t len) { HAL_ADC_Start_DMA(hadc1, (uint32_t*)buf, len, ADC_FORMAT_UINT16); } const adc_driver_t g_adc_driver { .init stm32_adc_init, .start_dma stm32_adc_start_dma, .read_once stm32_adc_read_once, .enable_irq stm32_adc_enable_irq };在hal/gd32/adc_impl.c中只需重写函数体qi_transmitter.c完全不用改动。这种设计让跨平台工作量从“重写全部驱动”降为“实现5个函数”。6.3 状态机事件总线解耦硬件中断与业务逻辑原始代码中HAL_GPIO_EXTI_Callback()直接调用qi_handle_rx_placement()导致中断服务程序过长。我引入事件总线机制// event_bus.h typedef enum { EVT_RX_PLACED, EVT_OVER_TEMP, EVT_BATTERY_LOW } event_t; void event_post(event_t evt); // 在EXTI回调中 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if(GPIO_Pin RX_DETECT_PIN) { event_post(EVT_RX_PLACED); // 仅投递事件不处理业务 } } // 在主循环中 while(1) { event_t evt event_pop(); // 非阻塞获取事件 switch(evt) { case EVT_RX_PLACED: qi_enter_detect_state(); break; case EVT_OVER_TEMP: qi_enter_over_temp_state(); break; } }这样既保证了中断响应速度1μs又让业务逻辑在安全上下文中执行。从那以后我每次接手新平台项目第一件事就是搭建这个三层结构硬件驱动层platform/→ 统一接口层hal/→ 业务状态机app/。它让我在两周内完成了从STM32F1到GD32E230的完整移植且未修改一行状态机代码。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

STM32驱动MMA7455倾角传感器实战:I²C时序、零点校准与滤波设计

STM32驱动MMA7455倾角传感器实战:I²C时序、零点校准与滤波设计

简介:本资源是一套面向嵌入式初学者与STM32开发者的MMA7455三轴倾角传感器实战例程,聚焦于STM32F103芯片通过软件模拟IC总线与传感器通信的核心能力训练,解决姿态检测类项目中传感器驱动开发、原始数据解析与工程单位转换等典型问题。压缩包共…

2026/10/15 17:45:01 阅读更多 →
串口通信实战:嵌入式开发中UART控制LED与蜂鸣器

串口通信实战:嵌入式开发中UART控制LED与蜂鸣器

1. 实验设计:为什么串口是嵌入式开发的必修课 串口通信实验,听起来基础到不能再基础。但说实话,我带过的不少新人,甚至工作了两三年的同事,遇到串口通信问题一样会抓瞎。这个实验表面上只是用电脑发几个字符来控制LED亮…

2026/10/15 17:45:01 阅读更多 →
Metashape region.center修改:Python控制处理区域高效指南

Metashape region.center修改:Python控制处理区域高效指南

1. 先搞清楚 Metashape 的 region 到底是个什么存在对于经常用 Metashape 做摄影测量处理的朋友来说,region(处理区域)这个概念其实很微妙。它不像照片对齐、密集点云生成那样有直观的中间结果,更像是一个隐形的边界框&#xff0c…

2026/10/15 17:45:01 阅读更多 →

最新新闻

如何安全取消 wreq 请求?深入 HTTP/1、HTTP/2、HTTP/3 的 Cancel Safety 完整指南

如何安全取消 wreq 请求?深入 HTTP/1、HTTP/2、HTTP/3 的 Cancel Safety 完整指南

【免费下载链接】wreq An ergonomic, privacy-aware Rust HTTP Client 项目地址: https://gitcode.com/gh_mirrors/rq/wreq 点击查看 免费下载 wreq 是一个注重易用性与隐私的 Rust 异步 HTTP 客户端。在 wreq 中取消请求的方式非常统一:丢弃&#xff0…

2026/10/15 18:28:43 阅读更多 →
STM32驱动LSM303磁力计:从I2C通信到航向角校准实战

STM32驱动LSM303磁力计:从I2C通信到航向角校准实战

简介:这份资源是面向嵌入式开发初学者与STM32学习者的LSM303磁力计驱动程序包,围绕三轴磁强计数据采集与IC通信展开,可解决电子罗盘、姿态检测等场景中磁场数据读取与解析的问题。压缩包共125个文件,以35个h头文件、34个c源文件为…

2026/10/15 18:28:43 阅读更多 →
5 分钟上手 hermes-jev-skills:两条命令让 Hermes 与 Claude Code 又聪明又省钱

5 分钟上手 hermes-jev-skills:两条命令让 Hermes 与 Claude Code 又聪明又省钱

【免费下载链接】hermes-jev-skills Jev-powered model routing, memory, compaction, skill selection, computer and browser use for Hermes agents (also Claude Code and Codex) 项目地址: https://gitcode.com/gh_mirrors/he/hermes-jev-skills 点击查看 免费…

2026/10/15 18:28:43 阅读更多 →
给 Neo4j 套一层 GraphQL API:Java 实现原理与避坑指南

给 Neo4j 套一层 GraphQL API:Java 实现原理与避坑指南

简介:这是一份面向 Java 后端与图数据库开发者的 Neo4j GraphQL API 实现资源包,解决如何让 Neo4j 对外提供 GraphQL 接口的问题。其核心价值在于能把 GraphQL 查询与变更自动转换为 Cypher 语句,并在 Neo4j 上执行;既可作为依赖库…

2026/10/15 18:28:43 阅读更多 →
IoT23流量分类实战:从数据加载、特征工程到模型选型与避坑指南

IoT23流量分类实战:从数据加载、特征工程到模型选型与避坑指南

简介:这份资源面向网络安全与机器学习方向的学习者与研究人员,围绕IoT23数据集提供一套完整的网络流量异常检测与多分类实验方案,覆盖朴素贝叶斯、决策树、随机森林、逻辑回归与SVM等经典算法的对比实践,适合具备Python基础、希望…

2026/10/15 18:28:43 阅读更多 →
SX126x LoRa驱动开发实战:从寄存器配置到拉距测试

SX126x LoRa驱动开发实战:从寄存器配置到拉距测试

简介:这份资源是面向嵌入式与物联网开发者的sx126x系列LoRa模块驱动代码包,适用于基于STM32平台集成LoRa/LoRaWAN远距离无线通信功能的场景。包内共6个文件,以3个.h头文件和3个.c源文件为主,头文件负责寄存器定义、接口声明与硬件…

2026/10/15 18:27:42 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

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

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

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

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

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

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

2026/10/14 16:30:29 阅读更多 →
影刀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/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练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 阅读更多 →