STM32控制28BYJ-48步进电机:相序、GPIO与定时器中断实战

简介:STM32驱动28BYJ-48步进电机的可直接运行工程,面向嵌入式初学者以及需要快速验证电机控制的开发人员,解决角度调节、正反转切换与基础驱动逻辑落地问题。压缩包共120个文件,大小2.39MB,以C源码和H头文件为主体,辅以Keil工程配置、HEX/AXF烧录文件、MAP映射及编译中间文件,既可直接查看源码逻辑,也便于重新编译或烧录到板卡验证。已有4315人学习下载,代码经实测可用,并非单纯原理罗列。资料围绕定时器脉冲输出与步进电机相序控制展开,工程结构完整,在Keil中打开后即可修改目标角度和旋转方向,适合移植到小型自动化项目,或作为步进电机驱动的入门参照。

1. 先把结论摆出来:28BYJ-48 不是靠电流,是靠时序工作的

这篇文章要拆的是 STM32 控制 28BYJ-48 步进电机的完整落地过程,从接线到相序、从 GPIO 翻转圈数到加减速都会讲到。我第一次在项目里用它时,第一反应是“接上 5V 它就会转”,结果电机只是嗡嗡响、微微抖动,根本不走。后来才意识到,28BYJ-48 是四相五线步进电机,必须按相序一拍一拍地换向驱动,位置才能精确受控。这篇内容能解决你一上电就“转不动、发烫、丢步”的三个典型问题,也适合已经会点灯、想入门位置控制的开发者,或者是做低成本云台、滑台、自动窗帘这类需要精确转角的小机构。

2. 硬件底细:28BYJ-48 的四相五线与 ULN2003 驱动板

2.1 关键参数先记牢:步距角、减速比、拍数

28BYJ-48 最容易被误解的参数是“步距角 5.625°/64”。它不是说每拍转 5.625° 除以 64,而是内部电机转子在八拍驱动下每拍转 5.625°,经过 64:1 的减速齿轮后,输出轴每拍实际转角是:

360° / 4096 = 0.087890625°

也就是说,输出轴转一圈需要 4096 个半步脉冲。这是整个控制逻辑里最重要的基准数,后面算角度、算速度全得靠它。

参数数值说明
额定电压DC 5V不建议超过 5V,线圈发热会明显增大
线圈电阻约 50Ω/相5V 下单相稳态电流约 100mA
内部步距角5.625°八拍驱动下每拍内部转子转角
减速比64:1内部转子转 64 圈,输出轴才转 1 圈
输出轴每拍转角0.087890625°由 5.625° ÷ 64 得到
输出轴一圈拍数4096 拍八拍模式下 4096 个脉冲走完一圈

这里有个非常常见的翻车点:很多新手以为 64 拍就是输出轴一圈,结果实测转了一大圈。真正的关系是内部转子 64 圈对应输出轴 1 圈,而内部转子一圈对应 64 拍,所以输出轴一圈是 64 × 64 = 4096 拍。这个数值直接决定你后面写的角度换算函数对不对,第一次踩坑基本都踩在这一行。

2.2 五条线怎么接:公共线、相线与驱动板

28BYJ-48 的引线一般是红、橙、黄、粉、蓝五色。红色线是公共端,也就是绕组公共正极,接驱动板上的 VCC;其余四线分别接 ULN2003 驱动板的 IN1 到 IN4 对应的输出通道。

常规对应关系如下:

线色绕组接 ULN2003 驱动板
红公共端板载 +5V 端子
橙A 相IN1
黄B 相IN2
粉C 相IN3
蓝D 相IN4

同时驱动板的 GND 必须和 STM32 的 GND 连在一起。这个问题相当隐蔽,我第一次接的时候漏了共地,GPIO 高电平没有参考地,电机偶尔动一下、偶尔不动,最后拿万用表量 IN1 对 GND 的电压才发现只有 1.8V 左右,根本不是逻辑高电平。共地之后信号才干净。

ULN2003 驱动板上的 IN1~IN4 接 STM32 的 PA0~PA3 就行,但 PA0 到 PA3 在部分板子上有其他复用功能,做原型验证时建议先确认没有外设占用。驱动板的供电用一个独立的 5V 电源,或者开发板 5V 引脚,但前提是那一路电源能提供 500mA 左右电流。如果直接插在电脑 USB 口上带载,插上电机后电压会被拉到 4V 以下,电机就会抖动。

2.3 ULN2003 是达林顿管驱动,不是 H 桥

ULN2003 内部是七路达林顿管,每一路本质是集电极开路输出。电机绕组一端接公共正极,另一端接 OUT 引脚,当对应 IN 引脚为高电平时,达林顿管导通,电流从 VCC 流经绕组、再经 OUT 流到 GND 形成回路。

所以控制逻辑很直观:给哪一相通电,就让对应 GPIO 输出高电平。ULN2003 驱动板内部已经集成了续流二极管,绕组断电瞬间的反向电动势会被吸收掉,不需要额外加保护电路。这也是我用这个组合的原因之一,硬件上基本零外围,接对线就能跑。

3. 核心实现:相序表、GPIO 翻转与定时器中断

3.1 四相八拍相序表:为什么用半拍模式

28BYJ-48 常用驱动方式有两种:四相四拍和四相八拍。四拍模式按 A→B→C→D 单相换电,每次切换一个绕组;八拍模式按 A→AB→B→BC→C→CD→D→DA 方式切换,中间多出两相同时通电的过渡状态。

八拍模式每拍切换半个步距角,从 A 到 AB 再到 B,每次转子位置的变化量比四拍小,输出更平滑,同时因为有两相同时通电,低速扭矩也略大。我平时做位置控制默认用八拍,代码里用一张 8 行 4 列的相序表就能描述完整状态。

拍数A(橙)B(黄)C(粉)D(蓝)
01000
11100
20100
30110
40010
50011
60001
71001

第 0 拍只给 A 相通电,第 1 拍 A、B 同时通电,依次类推。把这个表存在数组里,驱动时不断按顺序查表输出,就是完整的步进控制。

3.2 最简单的 GPIO 循环换相:先让电机转起来

搭好硬件后,先用最直白的方式验证电机能不能转。主循环里依次把相序表写入四个 GPIO,每输出一拍延时一段时间。代码逻辑如下:

// 相序表:每行对应 A、B、C、D 四个 GPIO 的电平状态 const uint8_t phase_table[8][4] = { {1, 0, 0, 0}, // 拍 0:仅 A 相通电 {1, 1, 0, 0}, // 拍 1:A + B {0, 1, 0, 0}, // 拍 2:仅 B {0, 1, 1, 0}, // 拍 3:B + C {0, 0, 1, 0}, // 拍 4:仅 C {0, 0, 1, 1}, // 拍 5:C + D {0, 0, 0, 1}, // 拍 6:仅 D {1, 0, 0, 1} // 拍 7:D + A }; // 把索引对应相序写到 PA0~PA3 void motor_write(uint8_t index) { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, phase_table[index][0] ? GPIO_PIN_SET : GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, phase_table[index][1] ? GPIO_PIN_SET : GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, phase_table[index][2] ? GPIO_PIN_SET : GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, phase_table[index][3] ? GPIO_PIN_SET : GPIO_PIN_RESET); } // 正向走指定步数,delay_ms 为相邻两拍间隔 void motor_step_forward(uint32_t steps, uint32_t delay_ms) { for (uint32_t i = 0; i < steps; i++) { motor_write(i % 8); HAL_Delay(delay_ms); } }

这个代码里最关键的是i % 8,因为相序表只有 8 个状态,超过 8 拍就循环取模,电机才能持续旋转。delay_ms就是拍间隔,典型值从 2 到 5 都行。间隔越短转速越快,但对 28BYJ-48 来说,低于 1ms 基本就会丢步,这点后面专门说。把 PA0~PA3 配置为推挽输出后调用motor_step_forward(4096, 2),输出轴应该刚好转一圈。

用HAL_Delay的问题也很明显:它阻塞整个主循环。电机转 4096 拍期间,按键、传感器、屏幕全部卡死。所以我只在最开始的验证阶段用这个写法,确认接线和相序没问题后,立刻换定时器中断。

3.3 用定时器中断产生稳定脉冲:不阻塞主循环

用定时器中断的好处是,电机在后台走,主循环还能处理别的任务。以 STM32F103C8T6 为例,系统时钟 72MHz,用 TIM3 产生 500Hz 的溢出中断,也就是每 2ms 触发一次。配置参数为预分频 71、自动重装值 1999,计算式:

72MHz / (71 + 1) / (1999 + 1) = 500Hz

每次溢出中断就推进一拍,拍间隔正好 2ms。主循环只需要启动定时器,电机就会持续转动。

// 在定时器中断回调里推进相序 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { static uint8_t step_idx = 0; static int8_t dir = 1; // 1 为正转,-1 为反转 if (htim->Instance == TIM3) { motor_write(step_idx); step_idx = (step_idx + 8 + dir) % 8; } }

这段代码有两个细节值得说明。step_idx + 8 + dir里的+8是为了避免 dir 为 -1 时取模出负数。C 语言里 -1 % 8 的结果在部分编译器实现下是 -1,数组下标会越界,加上 8 再取模就安全了。dir放在 static 变量里,主循环想改变方向时,单独写一个函数修改它就行,不用动中断逻辑。

启动方式就在主函数里加一句:

HAL_TIM_Base_Start_IT(&htim3);

用这个方式控制电机,主循环里可以正常扫描按键、刷新 OLED,电机的转速不受影响。但要注意,中断回调里不要放HAL_Delay、printf这类耗时操作,因为 500Hz 中断每 2ms 就进来一次,回调里拖太久会挡住其他中断。

3.4 角度与圈数换算:4096 拍就是一整圈

位置控制的核心是把“目标角度”换算成“拍的次数”。28BYJ-48 在八拍模式下,输出轴一圈是 4096 拍,所以任意角度对应的拍数公式是:

拍数 = 目标角度 × 4096 / 360

转 90° 就是 1024 拍,转 45° 是 512 拍。写成一个函数:

uint32_t steps_for_angle(float angle_deg) { return (uint32_t)(angle_deg * 4096.0f / 360.0f); }

这个函数在旋转角度不大时很好用,但浮点数转整数会有截断误差,多圈往复运动后,累计误差会慢慢暴露。我一般会在真实设备上跑一个完整行程,测量终点偏差,然后把误差补到下一次目标里,而不是依赖单次计算完美。如果只是做定位控制,精度在 ±1 拍以内是足够的;要做到更高精度,就得加编码器做闭环,但那已经超出这个资源本身的范围了。

4. 避坑指南:不转、发烫、丢步的几类经典问题

4.1 电机不转,只有“嗡嗡”声:先查电源和共地

现象:上电后电机微微抖动,有电流声,但输出轴不转。

原因之一是公共端没接对,红线没接到驱动板 VCC,绕组回路不完整;更常见的是驱动板 GND 和 STM32 GND 没接在一起,GPIO 高电平没有参考地。另一个高频原因是电源供电不足,USB 口供电一接电机就被拉低到 4V 以下。

解决:用外部 5V 电源单独给驱动板供电,电流余量留 500mA 以上;确认驱动板 GND 与 STM32 GND 之间用万用表量出 0Ω 连通;再量一下驱动板 VCC 对 GND 电压,空载时 5V,接电机后不低于 4.8V,电源就基本没问题。

4.2 转着转着“咔咔”响,位置跑偏:拍间隔太短或负载过重

现象:电机启动正常,转几圈后突然发出咔咔声,输出轴停住,程序还在继续发脉冲,最终位置完全不对。

原因:28BYJ-48 内部减速齿轮惯性不小,每拍间隔低于 1ms 时转子跟不上磁场切换,就会丢步。如果负载超过电机能带动的力矩,也会在加速瞬间丢步。

解决:先把拍间隔放回到 2ms 以上,确认低速下能跑完整圈;需要更高转速时,从低速启动再逐步加快,也就是后一章说的加减速。负载方面,用手轻捏输出轴如果感觉阻力明显,就先减负载再谈速度。

4.3 电机待机时烫手:绕组长时间通电

现象:电机没转,但摸外壳温度快速上升,几分钟后明显烫手。

原因:停在相序表的某一拍上时,至少有一个绕组持续导通。绕组电阻约 50Ω,5V 下持续电流接近 100mA,热量集中在电机内部,又没有风扇散热,自然会发烫。

解决:运动结束后把四个 GPIO 全部写成低电平,让所有达林顿管截止,电机彻底断电。用驱动板上的使能控制也可以,但对这个简单资源来说,直接输出低电平最省事。注意“断电”和“锁定”是两种需求,需要保持位置时再锁相,不需要时就释放。

4.4 转一圈却跑了 64 圈:减速比理解错

现象:写代码让电机转 64 拍,以为是一圈,结果输出轴转了 5.625°;把目标设成 360°,输出轴却转了 64 圈。

原因:这就是 2.1 节说的减速比问题。内部转子转一圈需要 64 拍,但经过 64:1 减速后,输出轴只转了 5.625°。输出轴真正转一圈需要 64 × 64 = 4096 拍,不是 64 拍。

解决:所有角度计算统一基于“输出轴一圈 = 4096 拍”,不要按内部转子的步距角直接算。建议把4096.0f定义成常量STEPS_PER_REV,代码里所有换算都引用它,避免多处硬编码后改漏。

4.5 下载一次后第二次连接不上:GPIO 占用了调试口

现象:程序能跑,但第二次用下载器连 STM32 时提示找不到芯片,BOOT 方式重新上电才能恢复。

原因:如果电机相线接到了 PB3、PB4、PA13、PA14 这类默认的 JTAG/SWD 调试引脚,初始化这些 GPIO 后会占用调试接口,下载器无法再接管芯片。

解决:最稳妥的办法是把相序线换到 PA0~PA3 这类普通 IO 口。如果只能占用调试口,可以在初始化前禁用 JTAG 复用功能并开启 SWD 保留,但每个板子的处理方式不一样,容易折腾,新手直接换引脚最省心。

5. 进阶:给步进电机加加减速,避免启停瞬间丢步

固定拍间隔的启停方式,在低负载下还能用,但负载一重,启动瞬间丢步几乎是必然的。28BYJ-48 减速机构惯性大,从 0 直接切到高速,转子根本来不及跟。解决办法是让拍间隔在启动阶段逐渐缩短、停止阶段逐渐拉长,这样速度曲线呈梯形,启停过程就平滑了。

核心思路是在定时器中断里动态修改重装值。中断频率变高,拍间隔变短,转速上升;中断频率变低,拍间隔变长,转速下降。代码示意:

// 加减速参数,单位 us volatile uint16_t pulse_interval = 5000; // 启动拍间隔 5ms volatile uint32_t current_step = 0; // 当前已走拍数 volatile uint32_t target_steps = 1024; // 目标 90° 对应 1024 拍 // 定时器中断内 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim->Instance == TIM3) { motor_write(current_step % 8); current_step++; // 前 200 拍逐步加速,中间保持,最后 200 拍减速 if (current_step < 200) { pulse_interval -= 15; // 每拍缩短一点,转速变快 } else if (current_step > target_steps - 200) { pulse_interval += 15; // 接近终点,逐拍减速 } // 更新定时器重装值,拍间隔 = 计数频率 * 重装值 __HAL_TIM_SET_AUTORELOAD(&htim3, pulse_interval - 1); } }

这段代码里,直接改 ARR 会让定时器周期变化,当前计数值可能超过新 ARR,造成下一个中断提前或延后。在实际低速项目中误差不算大,但要做得精细,应该等定时器更新事件后再同步修改,或者用 PWM + DMA 的方式生成完整脉冲序列。我这个简化版可以作为先跑通的第一步。

从那以后,我每次做步进控制项目,都会先跑一遍空载全行程加减速测试,确认最高速不丢步、减速段不冲过目标,再带负载。电机控制这种东西,参数看着合理没用,上电实测不咔咔响才算数。配置加减速参数时留一点余量,速度宁慢勿丢步,毕竟步进电机丢一步,位置就再也追不回来了。希望这篇拆解能帮你少走一段弯路。

本文还有配套的精品资源,点击获取

相关新闻

从任意文件读取到phar反序列化:CISCN Dropbox综合Web题利用链复现

从任意文件读取到phar反序列化:CISCN Dropbox综合Web题利用链复现

把BUUCTF上这道『CISCN2019 华北赛区 Day1 Web1 Dropbox』拉到本地复现的时候&#xff0c;我一开始是有点轻敌的。CTF Web题见多了&#xff0c;看到“网盘”两个字就会下意识觉得&#xff1a;无非是文件上传绕过呗。直到注册登录进去&#xff0c;面对一个五脏俱全的Dropbox管理…

2026/10/20 16:10:33 阅读更多 →
基于7z SDK API的C#压缩包提取器实战

基于7z SDK API的C#压缩包提取器实战

有段时间我几乎天天压在压缩包上&#xff0c;7z、zip、tar、xz格式从各个渠道涌过来&#xff0c;系统自带的解压工具看着能用&#xff0c;可遇到加密、分卷、特殊文件名就开始闹脾气。折腾几次之后&#xff0c;我干脆基于7z SDKAPI动手写了个简易压缩包文件提取器&#xff0c;把…

2026/10/20 16:10:33 阅读更多 →
前端彩蛋进阶:用字符画和console实现嫦娥奔月动效

前端彩蛋进阶:用字符画和console实现嫦娥奔月动效

前端职业生涯里&#xff0c;有些需求真的让人又爱又恨。Leader发来一句话&#xff1a;“马上中秋节了&#xff0c;你在网站的console面板中画一个嫦娥奔月&#xff0c;要有逼格。”第一反应是打开控制台敲几行彩色的 log 做个静态图交差&#xff0c;但冷静下来想一想&#xff0…

2026/10/20 16:09:30 阅读更多 →

最新新闻

FPGA连通域标记:从二遍扫描到流水线架构的工程实践

FPGA连通域标记:从二遍扫描到流水线架构的工程实践

1. 从工业视觉的痛点说起&#xff1a;为什么要把连通域标记搬进FPGA先讲一个我实际遇到的场景。某工业视觉项目里&#xff0c;前端是高速线阵相机&#xff0c;后端要求把视野里每个工件的面积、外接矩形、质心实时统计出来&#xff0c;帧率不能掉。一开始团队用CPU做&#xff0…

2026/10/20 17:01:22 阅读更多 →
什么是“旁路部署”?防火墙和负载均衡为什么常采用旁路?

什么是“旁路部署”?防火墙和负载均衡为什么常采用旁路?

先分清两种部署形态&#xff1a;串联&#xff08;在线&#xff0c;inline&#xff09; 和 旁路&#xff08;旁挂&#xff09;。 交通枢纽场景&#xff1a; 串联部署 所有进出枢纽的车流必须穿过这个检查站&#xff0c;检查站坏了&#xff0c;整条路直接断&#xff0c;车辆全部…

2026/10/20 17:01:22 阅读更多 →
VST 3 开发实战:vst3sdk 跨平台编译与避坑指南

VST 3 开发实战:vst3sdk 跨平台编译与避坑指南

简介&#xff1a;VST 3插件SDK由Steinberg官方推出&#xff0c;面向音频插件开发者与音乐软件工程师&#xff0c;提供在Windows、macOS、Linux及iOS平台构建VST 3插件所需的完整开发套件&#xff0c;帮助解决跨平台音频处理与宿主通信的实现难题。资源包共7个文件&#xff0c;约…

2026/10/20 17:01:22 阅读更多 →
Pi 1.0:原生MCP与Durable机制让终端编程代理稳定跑长任务

Pi 1.0:原生MCP与Durable机制让终端编程代理稳定跑长任务

这段时间我一直在终端里折腾各种编程代理&#xff0c;从只能简单对话的小工具一路用到能自己改代码、跑测试的那种。说实话&#xff0c;工具见得越多&#xff0c;越能感受到一个共性难题&#xff1a;模型能力再强&#xff0c;落地到真实工程里&#xff0c;很容易折在“不稳定”…

2026/10/20 17:01:22 阅读更多 →
Win32逆向实战:查壳静态分析提取Flag全流程

Win32逆向实战:查壳静态分析提取Flag全流程

前阵子刷题碰到一道名叫 JustRE 的 Windows 逆向题&#xff0c;题目不大&#xff0c;却把查壳、字符串定位、静态反编译、动态调试这几个基本功全串起来了。这道题没有加壳、没有反调试、逻辑也直白&#xff0c;非常适合刚接触逆向的新手拿来练手。整个分析走下来&#xff0c;从…

2026/10/20 17:01:22 阅读更多 →
大数据项目中的“脏活”:数据清洗全流程策略与实操指南

大数据项目中的“脏活”:数据清洗全流程策略与实操指南

EXISTS a data-quality problem is what usually kills a big-data project, not the algorithm. 我见过太多团队把精力花在调模型上&#xff0c;结果进模型的数据全是乱的&#xff0c;跑出来的结果连业务方自己都不敢信。数据预处理里最难、最耗时的环节就是数据清洗&#xff…

2026/10/20 17:00:21 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

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

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

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

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

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

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 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/20 10:02:08 阅读更多 →
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/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练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/20 9:50:45 阅读更多 →