STM32 DAC高频输出实战:从建立时间到DMA触发,突破音频信号生成瓶颈
1. 项目缘起从“能响”到“好听”的DAC进阶之路搞嵌入式开发的朋友尤其是玩过STM32的对DAC数模转换器肯定不陌生。最常见的入门实验无非是配置一下DAC让它输出个固定电压点个灯或者用个电位器调调电压再用ADC读回来形成一个简单的闭环。再进阶一点可能就是输出个正弦波、三角波用示波器看看波形感觉“成了”。但不知道你有没有遇到过这样的困惑当你想用DAC生成一个频率稍高一点的信号比如几KHz甚至几十KHz的正弦波时波形就开始变得“不对劲”了——顶部变平、毛刺增多、失真严重。这时候你可能会怀疑是代码效率问题或是DAC本身性能不行。我最近就在一个音频信号发生器的项目里踩了这个坑。项目要求STM32的DAC能稳定输出最高20KHz的正弦波这对于人耳听觉上限来说是个很基础的指标。一开始我用了最经典的“查表定时器中断更新DAC值”的方法结果在10KHz以上波形就严重失真根本没法用。这促使我深入折腾了一番STM32的DAC特别是它的“高频”输出能力。今天这篇内容就是把我从“踩坑”到“爬出来”的全过程以及背后涉及的核心技术点、硬件限制和软件优化策略系统地梳理分享出来。这不是一个简单的“Hello DAC”教程而是一次针对如何挖掘并逼近STM32 DAC性能极限的深度实践。2. 理解STM32 DAC的“速度”天花板不是你想跑多快就能跑多快在开始写代码之前我们必须先搞清楚STM32内部DAC模块的硬性限制。很多初学者容易产生一个误解我主频168MHz定时器触发频率设到1MHzDAC输出频率就能到1MHz。这完全错了。DAC的输出速度受限于一个更底层的参数建立时间Setting Time。2.1 DAC建立时间决定最高输出频率的关键DAC的建立时间指的是从数字输入代码发生改变比如你更新了DAC的数据寄存器到模拟输出电压稳定在目标值误差带内通常是±0.5 LSB或±1 LSB所需要的时间。你可以把它想象成DAC内部的一个“反应速度”。以STM32F4系列比如F407的DAC为例在数据手册的电气特性章节你可以找到这个关键参数。通常在特定条件下如供电电压、负载情况它的建立时间可能在几微秒µs的量级。例如假设DAC的建立时间是1µs。那么理论上它完成一次稳定的输出转换就需要1µs。这意味着即使你的软件能以1MHz的频率周期1µs去更新DAC数据DAC硬件本身也根本来不及响应结果就是输出波形严重畸变。最高理论输出频率估算对于一个正弦波我们通常需要在一个周期内输出足够多的点比如N个来保证波形质量。如果DAC建立时间为T_settle那么更新两个点之间的最小时间间隔就不能小于T_settle。因此输出一个点所需的时间至少为T_settle输出N个点所需的时间就是 N * T_settle。这N个点构成一个正弦波周期周期T N * T_settle。那么最高输出频率 F_max 1 / T 1 / (N * T_settle)。举例T_settle 1µs我们希望一个正弦波周期由100个点构成N100那么F_max 1 / (100 * 1e-6) 10,000 Hz 10 KHz。这就是在保证100个点/周期波形质量下的理论频率上限。如果你想输出20KHz要么降低点数N牺牲波形质量要么换用建立时间更短的DAC。注意数据手册给出的建立时间通常是在最严苛的测试条件下如满量程跳变的值。实际应用中如果电压变化幅度小建立时间可能会短一些但这不能作为设计依据我们必须按最坏情况考虑。2.2 触发源与数据更新机制硬件自动化的力量知道了速度限制下一步就是如何以最接近这个极限的速度、且稳定可靠地去更新DAC数据。这里就引出了STM32 DAC的两个核心特性触发转换和DMA。1. 定时器触发Timer Trigger 这是实现高频、精准波形输出的基石。我们不应该在main函数循环里调用HAL_DAC_SetValue也不应该用SysTick中断来更新。正确的做法是将一个硬件定时器如TIM2, TIM4, TIM6, TIM7等具体看芯片参考手册配置为更新事件Update Event并将这个事件连接到DAC的触发源。这样定时器就像是一个精准的节拍器每隔一个固定的时间定时器周期就自动“踢”DAC一脚告诉它“该转换下一个数据了”2. DMA传输 光有定时器触发还不够。如果每次触发都进入中断在中断服务函数里查表、赋值那么中断响应时间、函数调用开销将成为新的瓶颈尤其在频率高的时候CPU会被频繁打断严重影响系统其他任务。DMA直接存储器访问就是为了解决这个问题而生的。我们可以预先把一个周期的波形数据数组存放在内存比如一个uint32_t sineWave[100]然后配置DMA将DAC的数据寄存器如DHR12R1作为目标地址。当定时器触发DAC时DAC的触发信号会同时启动DMA传输DMA自动将内存中的下一个数据搬运到DAC寄存器整个过程无需CPU干预。这才是实现高频DAC输出的标准且唯一推荐的方式。组合起来的工作流定时器周期性触发 - 触发信号启动DMA - DMA搬运下一个波形数据至DAC数据寄存器 - DAC硬件开始转换 - 模拟端口输出电压。CPU只在初始化时配置好这一切之后就可以“袖手旁观”了。3. 实战配置以STM32F407的DAC1为例输出高频正弦波理论聊完我们上干货。这里以STM32CubeIDE和HAL库为例展示如何配置DAC通过定时器触发和DMA输出一个10KHz正弦波。我们目标是每个周期输出100个点。3.1 CubeMX图形化配置引脚配置使能DAC1选择通道1PA4。注意如果PA4被用于其他功能如SPI1_NSS需要先解除复用。DAC配置Mode:Output Buffer使能。输出缓冲可以增强带负载能力但会引入一定的建立时间延迟。对于高频输出可以尝试禁用缓冲Buffer Disable输出阻抗会变大但建立时间可能更快需要根据实际负载测试。Trigger: 选择Timer 6 Trigger Out event. 这里我们选用TIM6这是一个基本定时器没有外部IO专门用于内部触发。Output: 保持默认。TIM6配置Clock Source:Internal Clock.Prescaler: 计算值。我们的系统主频假设为168MHz。我们希望DAC更新率为 10KHz * 100点 1MHz即每秒更新100万个点。所以定时器触发频率应为1MHz。Counter Period: 定时器计数周期。定时器时钟 168MHz / (Prescaler 1)。我们需要定时器时钟 / (Counter Period 1) 1MHz。计算令Prescaler 167则定时器时钟 168M / (1671) 1MHz。此时设置Counter Period 0即可得到1MHz的更新频率因为1MHz / (01) 1MHz。实际上Counter Period决定了定时器溢出频率公式为Update Rate Timer Clock / (Period 1)。Trigger Event Selection: 在Parameter Settings标签页找到Trigger Output (TRGO) Parameters将Master Mode Selection设置为Update Event。这样每次TIM6更新时都会产生一个触发信号TRGO输出给DAC。DMA配置在DAC1的DMA Settings标签页点击Add。DMA Request:DAC1。Stream: 选择一个可用的Stream比如DMA2 Stream 5。Direction:Memory To Peripheral。Mode:Circular。循环模式当DMA传输完整个波形数组后会自动从头开始实现连续输出。Data Width: 都选择Word32位。因为DAC数据寄存器是32位的虽然只用到低12或16位内存中的数据我们也用uint32_t数组存储。3.2 关键代码实现生成代码后我们需要在main.c中补充波形数据和启动代码。/* 私有变量定义 */ #define SINE_WAVE_POINTS 100 uint32_t sineWaveData[SINE_WAVE_POINTS]; /* 函数生成正弦波数据表 */ void GenerateSineWave(uint32_t* buffer, uint32_t points, float amplitude_scale) { // amplitude_scale 范围 0.0 ~ 1.0对应满量程比例 uint32_t offset 2048; // 对于12位DAC0V对应值约为2048如果使用对齐方式为右对齐12位 uint32_t amplitude (uint32_t)(2047.0 * amplitude_scale); // 峰值幅度 2047对应满量程 for(uint32_t i 0; i points; i) { float radian 2.0f * 3.1415926f * i / points; float sine_value sinf(radian); // 计算DAC值偏移 幅度 * sin(θ) int32_t dac_value offset (int32_t)(amplitude * sine_value); // 确保值在0-4095范围内12位 if(dac_value 0) dac_value 0; if(dac_value 4095) dac_value 4095; // HAL库中DAC数据寄存器是12位右对齐写入到16位寄存器的低12位。 // 所以需要将12位值左移对齐到存储格式。对于DAC通道1数据应放在DHR12R1位域即[11:0]。 // 实际上HAL_DAC_Start_DMA函数会处理对齐我们直接给0-4095的值即可。 buffer[i] dac_value; // 对于HAL库DMA传输通常直接传这个值 } } int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_DMA_Init(); MX_DAC1_Init(); MX_TIM6_Init(); // 1. 生成正弦波数据 GenerateSineWave(sineWaveData, SINE_WAVE_POINTS, 0.8f); // 80%幅度的正弦波 // 2. 启动DAC并关联DMA传输 // 参数DAC句柄通道数据地址数据长度点数数据对齐方式 if (HAL_DAC_Start_DMA(hdac1, DAC_CHANNEL_1, (uint32_t*)sineWaveData, SINE_WAVE_POINTS, DAC_ALIGN_12B_R) ! HAL_OK) { Error_Handler(); } // 3. 启动定时器让它开始产生触发信号 HAL_TIM_Base_Start(htim6); while (1) { // 主循环可以空着或者处理其他任务。DAC输出完全由TIM6触发和DMA自动完成。 // 如果需要动态改变波形频率可以修改TIM6的ARR或PSC值。 // 如果需要动态改变波形幅度或形状可以更新sineWaveData数组并注意内存一致性。 } }3.3 频率计算与动态调整如何改变输出正弦波的频率公式很清晰输出信号频率 定时器触发频率 / 一个周期的点数。在我们的例子里定时器触发频率 1MHz点数 100所以输出频率 1,000,000 Hz / 100 10,000 Hz 10 KHz。如果想改为20KHz有两种方法。点数不变提高触发频率将定时器触发频率提高到 20KHz * 100 2MHz。这需要重新计算TIM6的预分频器和周期值并确保2MHz没有超过DAC建立时间允许的极限。触发频率不变减少点数将点数减少到50。SINE_WAVE_POINTS改为50重新生成数据表。但点数减少会导致波形阶梯感变强失真度THD增加。在程序中动态调整频率通常通过修改定时器的自动重载值ARR来实现因为改变预分频器PSC可能会导致定时器时钟变化影响其他可能使用同一时钟源的外设。使用__HAL_TIM_SET_AUTORELOAD(htim6, new_arr_value)可以动态调整。4. 示波器实测与波形失真分析理想与现实的差距配置完了代码也跑了用示波器一看可能心就凉了半截。你会发现10KHz的波形可能还行但到了20KHz、30KHz波形就开始出现各种问题。4.1 常见的失真现象与原因波形顶部/底部削平限幅原因DAC输出缓冲器Output Buffer的压摆率Slew Rate不足。压摆率是输出电压变化的最大速率单位是V/µs。当信号频率高、幅度大时电压变化要求快如果压摆率跟不上波形在过零点和峰值点就会变圆滑甚至被削平。对策在CubeMX中尝试禁用DAC输出缓冲Buffer Disable。禁用后DAC输出阻抗变大约几十kΩ压摆率会提高但带负载能力急剧下降必须后接一个高输入阻抗的运放电压跟随器进行缓冲否则直接接负载会导致电压被拉低。阶梯状毛刺Glitches原因这是DAC的“固有缺陷”称为“毛刺能量Glitch Energy”。当DAC的数字输入码发生重大变化时尤其是最高有效位MSB变化时如从0111_1111_1111跳到1000_0000_0000内部开关切换不同步会产生一个短暂的尖峰脉冲。对策硬件层面在DAC输出端添加一个低通滤波器和/或一个简单的RC滤波电路称为“去毛刺电路”可以平滑掉这些高频尖刺。软件层面对于高速输出毛刺影响相对固定。但对于低速高精度应用有专门的“去毛刺”技术。高频分量衰减正弦波变“三角波”原因DAC本身、PCB走线、示波器探头等都会引入分布电容和电感形成一个低通滤波器。高频分量被过滤掉了波形看起来就“圆”了像三角波。对策优化PCB布局DAC输出走线尽量短且远离数字信号线。使用带宽足够的示波器和探头进行测量。4.2 实测对比开缓冲 vs 关缓冲为了直观感受我做了个对比测试使用STM32F407输出20KHz正弦波100点/周期幅度3.3Vpp配置项输出缓冲状态实测波形现象带负载能力建议配置A使能 (Enable)20KHz时波形顶部明显变圆类似被压缩。30KHz以上严重失真。强可直接驱动轻负载如50kΩ。适用于低频、高精度、需直接驱动负载的场景。配置B禁用 (Disable)20KHz波形明显更“方正”接近理想正弦波。可达50KHz仍有较好形状。极弱输出阻抗高必须接运放缓冲。追求高频性能时的必选方案但必须后接运放。这个对比清晰地说明了输出缓冲对高频性能的影响。在我的项目中为了得到20KHz的清晰正弦波最终选择了“禁用缓冲 外部电压跟随器OPAMP”的方案。5. 突破瓶颈当内置DAC不够用时怎么办即使优化到极致STM32内置的DAC性能天花板依然存在。对于需要更高频率如数百KHz、更高精度16位以上或更复杂波形任意波的应用我们必须寻找外部方案。5.1 专用高速DAC芯片这是最直接专业的方案。芯片如ADI的AD97xx系列、TI的DAC90xx系列都是专门的高速DAC建立时间可以达到纳秒ns级别更新率可达数百MSPS每秒百万次采样。使用这类芯片STM32的角色就变成了一个“数据泵”和控制器通过高速并行接口或SPI接口向DAC芯片发送数据。此时STM32的DMA和定时器依然扮演关键角色负责以精确的节奏将波形数据从内存搬运到外部DAC。5.2 PWM 低通滤波器模拟DAC这是一个低成本、低精度的替代方案。原理是利用STM32高级定时器产生高分辨率的PWM波然后通过一个多阶的低通滤波器LC或RC滤除高频的PWM载波保留其低频的模拟量信息。PWM的占空比对应输出电压的平均值。优点成本极低所有MCU都有定时器。缺点分辨率与频率矛盾PWM频率越高滤波器设计越容易截止频率可以设高些但PWM的分辨率会下降因为计数器位数有限。例如72MHz主频下要产生1MHz的PWM分辨率只有72级远低于DAC的12位4096级。响应速度慢低通滤波器会引入延迟动态响应性能差。纹波无法完全滤除载波输出会有纹波。负载影响大输出电压受负载影响显著。因此PWM DAC仅适用于对精度、速度和动态性能要求不高的场合比如LED调光、电机调速等。5.3 比较与选型建议方案性能上限成本复杂度适用场景内置DAC中低频~100KHz中精度12位零芯片已集成低音频生成语音范围、闭环控制设定值、简单波形发生专用高速DAC高频1MHz高精度14-16位或更高高高需外围电路、布线专业音频、通信信号合成、雷达波形生成、高速仪器PWM模拟DAC低频1KHz低精度8-10位有效极低中需设计滤波器调光、调速、对精度和速度不敏感的模拟量输出6. 项目中的其他坑与经验拾遗最后分享几个在调试STM32 DAC高频输出时容易忽略但至关重要的细节。1. 电源与地线的噪声高频模拟电路对电源噪声极其敏感。务必确保模拟部分VDDA、VSSA和数字部分VDD、VSS的供电是干净且隔离的。在PCB上使用磁珠或0Ω电阻将模拟地和数字地在单点连接并给VDDA加上CLC电容-电感-电容π型滤波。2. 时钟源的稳定性定时器触发DAC的时钟其抖动Jitter会直接转化为输出信号的相位噪声。确保系统主时钟HSE或HSI稳定。对于要求极高的应用可以考虑使用更高精度的外部有源晶振。3. DMA传输完成中断的误用在循环模式下DMA传输完成中断HAL_DAC_ConvCpltCallback会在每完成一整轮数组传输时调用一次而不是每个点。不要在这个中断里做频繁的操作更不要在这里重新启动DMA。它的正确用途是当你需要动态更换波形数据时可以在这里安全地更新源数据数组注意双缓冲或确保DMA不在访问时修改。4. 数据对齐的坑HAL库的HAL_DAC_Start_DMA函数需要指定对齐方式DAC_ALIGN_12B_R,_8B_R等。你必须确保你传入的数据数组里的每个值都是按照这个对齐方式“准备好”的。对于12位右对齐有效值就是0-4095放在一个uint32_t变量的低12位。如果你错误地传入了左对齐的值或者值超出了范围输出就会乱套。5. 测量工具的重要性不要用低带宽的示波器去测量高频信号。一个100MHz带宽的示波器测量1MHz方波可能已经失真了。测量模拟信号探头的带宽和接地方式同样关键。使用探头配套的接地弹簧针而不是长长的鳄鱼夹地线可以显著减少测量引入的噪声。折腾STM32的DAC输出从简单的直流到复杂的高频波形是一个逐步深入MCU模拟外设和硬件设计的过程。它强迫你去阅读数据手册的电气特性章节去理解时序和极限参数去考虑PCB布局和电源完整性。这个过程获得的经验远比让一个LED呼吸或者读一个电位器值要宝贵得多。当你最终在示波器上看到一个干净、稳定的高频正弦波时那种成就感就是嵌入式开发最纯粹的乐趣之一。

相关新闻

有源医疗器械报警术语 | 栓锁(Latching)与非栓锁(non-Latching)报警

有源医疗器械报警术语 | 栓锁(Latching)与非栓锁(non-Latching)报警

想象一下你家的烟雾报警器,它有两种工作模式:模式一:非栓锁报警(像“智能”烟雾报警器)工作方式:当烟雾(报警条件)出现时,报警器会大声尖叫。一旦烟雾散去(报…

2026/9/28 13:43:58 阅读更多 →
半导体人的英语:阅读原版spec的“生存法则”让上手速度翻倍

半导体人的英语:阅读原版spec的“生存法则”让上手速度翻倍

01 问题背景:等一份翻译,等丢了整个窗口去年三月,我们产线新引进了一台海外二手薄膜设备,随机附带的只有一份三百多页的原版英文操作手册和一份加密的工艺spec。设备到货第三天就报了一个我从没见过的报警代码,界面上跳…

2026/10/10 18:12:42 阅读更多 →
XXL-JOB分布式任务调度架构与实现原理

XXL-JOB分布式任务调度架构与实现原理

1. XXL-JOB核心架构解析XXL-JOB作为一款轻量级分布式任务调度平台,其源码结构清晰体现了"调度中心执行器"的经典设计模式。整个项目采用Spring Boot构建,核心模块划分如下:xxl-job-admin:调度中心模块,负责任…

2026/10/4 8:06:53 阅读更多 →

最新新闻

Java Function接口深度解析:从设计原理到实战应用

Java Function接口深度解析:从设计原理到实战应用

1. 从一个真实场景说起:为什么我们要聊 Function做Java后端的兄弟大概率都遇到过这种代码:一个方法里塞了七八个if-else,每个分支都在做数据转换,参数类型还都不一样。某次需求变更,产品说“这个字段的转换规则要改一下…

2026/10/12 8:45:42 阅读更多 →
“买几送几”应用题解题全解:从折扣本质到分组算法

“买几送几”应用题解题全解:从折扣本质到分组算法

"买几送几"这四个字,估计每个辅导过小学作业的家长都见过。超市酸奶柜贴出"买3送1"时,大多数人第一反应是"等于打了75折",这个直觉没错。可试卷一旦把问题变成"买3件送1件,需要买7件要付几件钱…

2026/10/12 8:45:42 阅读更多 →
GCC 14.2源码构建实战:适配国产系统与C++23编译链

GCC 14.2源码构建实战:适配国产系统与C++23编译链

简介:本资源为GNU Compiler Collection(GCC)官方最新稳定版gcc-14.2.0的完整源码发布包,面向Linux/UNIX系统开发者、编译器研究者、嵌入式工具链构建者及高校计算机系统课程实践者,用于定制化编译器开发、平台移植、性…

2026/10/12 8:45:42 阅读更多 →
火山引擎Agent Toolkit三层架构实战:Plugin、Skills、CLI从零搭建云巡检Agent

火山引擎Agent Toolkit三层架构实战:Plugin、Skills、CLI从零搭建云巡检Agent

1. 从一次云上开发踩坑说起:为什么需要三层架构去年年底我接手了一个云资源自动化巡检的需求,说白了就是每天定时去查一批云主机的状态、磁盘水位、网络配置,发现异常就触发告警和自愈脚本。一开始我想得很简单,写个脚本调API不就…

2026/10/12 8:45:42 阅读更多 →
Java构建生产级AI Agent:解耦决策与执行的工程实践

Java构建生产级AI Agent:解耦决策与执行的工程实践

1. 为什么 Java 还能做 AI Agent?——打破“Java 只适合后端”的思维定式很多人看到“AI Agent”四个字,第一反应是 Python、PyTorch、LangChain、LlamaIndex——这几乎成了行业默认配置。我第一次在某高校实验室看到一个用 Java 写的 Agent 调度器时&am…

2026/10/12 8:45:42 阅读更多 →
gRPC从入门到实战:跨语言微服务通信与Python并发避坑指南

gRPC从入门到实战:跨语言微服务通信与Python并发避坑指南

我真的是太爱学习了——这种念头冒出来的时候,通常不是因为刚学会了一个妙招,而是因为刚被一个不算难的框架折腾到凌晨一点。最近这个对象就是 gRPC。很长一段时间里,我提到 gRPC 都是能躲就躲:要写 .proto、要装 protoc、跨语言还…

2026/10/12 8:44:35 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 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/11 10:45:37 阅读更多 →
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/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练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/11 14:36:54 阅读更多 →