STM32F407寄存器版ADC双通道DMA采集详解与代码实现
做嵌入式这几年ADCDMA算是遇到频率最高的需求之一了但很多刚接触寄存器编程的朋友一提到“ADC双通道DMA采集”就容易卡在配置位上。这次我把自己整理的STM32F407寄存器版本独立ADC-DMA双通道采集方案完整分享出来双通道分别接在PA0和PA1上对应ADC1的通道0和通道1用规则组连续采样转换结果由DMA自动搬运到内存缓冲区CPU全程不参与。适合传感器模拟量采集、电池电压监测、电位器位置检测这些场景更适合想彻底搞懂底层配置逻辑、不愿意被初始化工具牵着走的人。不用CubeMX生成代码不用HAL库函数从时钟到DMA全部手写寄存器。这样做的好处很直接你清楚每一个位的作用出问题的时候能顺着寄存器状态一路查下去。这篇文章不光是贴代码我会把配置思路、采样周期计算、DMA选型逻辑和踩过的坑一起讲明白。1. 项目概述与核心思路拆解1.1 需求本质与方案选型这个项目的本质需求其实很简单两个独立模拟信号需要被持续采集而且不能因为采样过程拖累主程序性能。如果只有一路信号用ADC中断读数据完全能接受一旦通道数量变成两路并且需要连续采集时问题就来了——每次转换都触发一次中断CPU要频繁进出中断服务函数数据一多还会出现响应不及时的问题。F407的ADC转换速度很快在21MHz的ADC时钟下单次转换最快不到1微秒。这种速度下如果每转换一个通道就中断一次主逻辑的执行节奏会被搅乱。DMA方案的核心价值在于ADC转换完成后硬件自动把数据从ADC数据寄存器搬到指定的内存地址CPU只需要在初始化时配置好一切后续完全不用管。“独立ADC”这个词在这个方案里指的不是双ADC同步模式而是用单个ADC的规则通道组通过序列转换依次采集两个通道。它和双ADC同步模式有本质区别双ADC同步模式追求的是两路信号同一时刻采样而独立ADC双通道是分时采集。如果你的应用要求两路信号严格同步建议上双ADC同步模式如果只是普通的电压、温度、位置检测独立ADC的方案已经足够接线简单资源占用也少。寄存器版本的选择理由在工程上还有一个实际好处固件体积更小运行行为可预期。库函数封装越厚底层细节越模糊出了问题越难查。寄存器版本虽然写起来累一些但每一个配置位的含义都摆在明面上调起试来也更有底气。1.2 硬件资源与数据流向梳理先理清F407上这条数据链路。STM32F407有3个ADC模块ADC1的引脚分布中PA0固定对应ADC1_IN0PA1固定对应ADC1_IN1。这两个引脚在GPIO层面需要配置成模拟输入模式。DMA资源的选型尤其容易踩坑。F407有DMA1和DMA2两个控制器ADC1的DMA请求是硬件固定映射到DMA2的Stream0通道0不能用DMA1。很多人第一次调“ADC-DMA”时习惯性地用DMA1结果死活不出数据其实原因就在这里。完整的映射关系如下ADC模块DMA控制器与数据流DMA通道ADC1DMA2 Stream0Channel0ADC2DMA2 Stream1Channel1ADC3DMA2 Stream2Channel2数据流向可以概括为外部模拟信号进入PA0/PA1引脚经过ADC1规则通道的序列转换结果写入ADC1的数据寄存器ADC1_DR再由DMA2把数据搬运到内存缓冲区。缓冲区用长度为2的数组维护数组下标0对应第一个转换的通道下标1对应第二个转换的通道。从这个链路图里可以看出整个采集过程的关键环节有三个ADC序列配置是否正确、DMA数据流映射是否正确、缓冲区与通道的对应关系是否清晰。任何一个环节出错表现出的现象往往是数据永远不变、数据全零、或者两个通道的值互相串位。2. 关键原理与寄存器配置详解2.1 转换序列与扫描模式的关系F407的规则通道转换依赖于SQR寄存器中的序列定义。SQR1寄存器的L[3:0]字段用来定义序列长度规则是L 转换通道数 - 1所以两个通道时L1。两个通道具体是谁写在SQR3寄存器里SQ1字段位0~4表示序列中第一个要转换的通道SQ2字段位5~9表示第二个要转换的通道。本项目里SQ10表示先采ADC1_IN0PA0SQ21表示再采ADC1_IN1PA1。这里的模式位特别容易出问题。ADC_CR1的SCAN位是扫描模式的总开关必须置1否则转换序列轮不到后面的通道只转换第一个就停了。ADC_CR2的CONT位是连续转换开关置1后ADC会在整个序列转换完成之后立刻重新开始下一轮转换这才是两路信号“持续更新”的原理所在。所以这个方案的模式组合是SCAN1 CONT1。启动一次之后ADC硬件就会自动循环往复地转换通道0和通道1不需要软件反复干预。还有一个经常被忽略的位是ADC_CR2的EOCS。EOCS0时每个通道转换结束都会产生一次转换结束事件和DMA请求如果EOCS1只有整个序列全部转换完才会产生事件导致DMA搬运的节奏完全错乱。这个位复位值就是0很多库函数初始化时不会特意改它但手动写寄存器时要确认自己没有误置1。2.2 采样周期与转换时间计算采样周期配置在SMPR寄存器组里。通道0对应ADC_SMPR2的SMP0字段位0~2通道1对应SMP1字段位3~5。F407可选采样周期为3、15、28、56、84、112、144、480个ADC时钟周期寄存器值分别对应0~7。ADC时钟频率来自APB2。在F407主频168MHz的典型配置下APB2是84MHzF407的ADC允许最高时钟为36MHz因此ADC_CCR的ADCPRE预分频器需要设置工作。我实测下来推荐4分频也就是ADC时钟为21MHz。这个值没有超过最高限制余量也能保证转换稳定性。一次完整转换的时间计算公式为转换时间 (采样周期 12个固定时钟周期) / ADC时钟频率。举个例子配置采样周期为15个ADC时钟时单个通道转换时间 (15 12) / 21MHz约等于1.29微秒两个通道各自转换一遍大约需要2.57微秒。这个速度应对绝大多数传感器采样场景都已经足够快。如果追求极限速度可以把采样周期降到3单通道约0.71微秒但信号源内阻大时读数容易偏。如果信号源阻抗高建议把采样周期提高到56甚至84周期换取更稳定的内部采样电容充电时间。2.3 DMA数据流配置与工作原理DMA2_Stream0的配置里最关键的是外设地址、内存地址、传输方向和地址递增方式。外设地址必须写成ADC1数据寄存器的地址即(uint32_t)ADC1-DR这里漏掉取地址符号是常见错误。内存地址指向缓冲区数组DMA会把每次转换结果依次写入数组的相邻元素。数据宽度方面ADC1_DR寄存器是32位12位ADC结果在低16位中有效高16位补零。为了对齐效率和逻辑清晰PSIZE和MSIZE都设置为32位缓冲区也用uint32_t类型数组。这样每次搬一个寄存器正好对应一个通道的转换结果。DMA的循环模式CIRC位是这个方案能长期稳定运行的关键。循环模式开启后DMA搬运完NDTR指定的数据数量本例是2NDTR会自动恢复初值内存地址也自动回到缓冲区起点然后等待下一轮ADC转换结果继续搬运。如果不开启循环模式DMA只搬一次就停住了缓冲区里的数据永远不会更新。传输方向设置为外设到内存DIR00。外设地址不递增PINC0因为ADC1_DR是固定地址内存地址递增MINC1因为要依次填充两个缓冲区元素。这些位看起来琐碎但任何一位配置错误整个DMA搬运链路都会出问题。3. 实操过程与完整代码实现3.1 初始化步骤与顺序要求寄存器版本的代码风格因人而异但初始化顺序有硬性要求。我采用的操作顺序如下每一步都有它的理由开启GPIOA、ADC1、DMA2的时钟。GPIOA在AHB1总线ADC1在APB2总线DMA2在AHB1总线三个时钟源不能漏。配置PA0、PA1为模拟输入模式。GPIO_MODER寄存器里每两位对应一个引脚模拟输入模式值是0b11。设置ADC预分频为4分频得到21MHz的ADC时钟。给ADC上电置位ADON然后短暂等待保证ADC内部稳定。执行ADC校准。置位CAL位等待硬件自动完成校准。这一步很多人嫌麻烦会跳过但想要读数准确校准时必须做的。配置SQR1序列长度、SQR3序列通道号、SMPR2采样周期。初始化DMA2_Stream0的参数并先使能DMA。配置ADC的连续模式、扫描模式、DMA请求使能然后触发启动转换。第7步和启动转换之间的顺序非常关键。DMA必须先就绪ADC再启动转换。如果ADC先开始转产生的第一个DMA请求可能因为DMA还没有配置完毕而丢失表现出来的现象就是缓冲区第一个数据永远是初始值其他通道数据却正常更新。3.2 核心代码与逐段注释下面是我实际项目中使用的核心代码片段。我这里假设系统主时钟已经初始化为168MHzAPB2为84MHz并且使用了标准CMSIS头文件中的寄存器定义。// 缓冲区下标0对应通道0(PA0)下标1对应通道1(PA1) static uint32_t adc_buf[2]; void ADC_DMA_Init(void) { // 1. 开启时钟 RCC-AHB1ENR | RCC_AHB1ENR_GPIOAEN; RCC-APB2ENR | RCC_APB2ENR_ADC1EN; RCC-AHB1ENR | RCC_AHB1ENR_DMA2EN; // 2. 配置PA0和PA1为模拟输入 // MODER两位为0b11即为模拟输入模式 GPIOA-MODER ~(GPIO_MODER_MODER0 | GPIO_MODER_MODER1); GPIOA-MODER | (0x03U GPIO_MODER_MODER0_Pos); GPIOA-MODER | (0x03U GPIO_MODER_MODER1_Pos); // 3. ADC时钟4分频APB2 84MHz / 4 21MHz ADC-CCR | ADC_CCR_ADCPRE_1; // 4. ADC上电并等待稳定 ADC1-CR2 | ADC_CR2_ADON; for (volatile uint32_t i 0; i 100; i); // 5. 校准置位CAL等待硬件清除 ADC1-CR2 | ADC_CR2_CAL; while ((ADC1-CR2 ADC_CR2_CAL) ! 0); // 6. 配置转换序列 // L1表示序列长度2从bit20开始 ADC1-SQR1 (1U 20); // SQ1通道0SQ2通道1 ADC1-SQR3 (0U 0) | (1U 5); // 采样周期设置通道0和通道1都设为15周期 ADC1-SMPR2 ~(0x07U 0); ADC1-SMPR2 | (0x05U 0); ADC1-SMPR2 ~(0x07U 3); ADC1-SMPR2 | (0x05U 3); // 7. 配置DMA2_Stream0Channel0 // 先关闭数据流等待硬件确认关闭 DMA2_Stream0-CR ~DMA_SxCR_EN; while ((DMA2_Stream0-CR DMA_SxCR_EN) ! 0); // 清除数据流上的标志位避免历史状态干扰 DMA2-LIFCR | DMA_LIFCR_CTCIF0 | DMA_LIFCR_CHTIF0 | DMA_LIFCR_CTEIF0 | DMA_LIFCR_CDMEIF0 | DMA_LIFCR_CFEIF0; // 外设地址ADC1数据寄存器地址 DMA2_Stream0-PAR (uint32_t)ADC1-DR; // 内存地址缓冲区首地址 DMA2_Stream0-M0AR (uint32_t)adc_buf; // 传输数量两个通道各一次 DMA2_Stream0-NDTR 2; // 控制寄存器配置 // 32位数据宽度外设和内存都是32位 DMA2_Stream0-CR | DMA_SxCR_PSIZE_1 | DMA_SxCR_MSIZE_1; // 内存地址递增 DMA2_Stream0-CR | DMA_SxCR_MINC; // 循环模式 DMA2_Stream0-CR | DMA_SxCR_CIRC; // 方向外设到内存DIR00不置位 // 通道0CHSEL000不置位 // 优先级设为高 DMA2_Stream0-CR | DMA_SxCR_PL_1; // 使能DMA数据流 DMA2_Stream0-CR | DMA_SxCR_EN; // 8. 配置ADC连续转换、扫描模式和DMA请求 // CONT1连续转换SCAN1扫描模式 ADC1-CR1 | ADC_CR1_SCAN; ADC1-CR2 | ADC_CR2_CONT | ADC_CR2_DMA | ADC_CR2_DDS; // 启动转换 ADC1-CR2 | ADC_CR2_SWSTART; }启动之后主程序里直接读取adc_buf数组就能拿到两路最新的转换结果。电压换算公式是实际电压 adc_buf[x] * 3.3 / 4096。12位ADC的分辨率是4096个码值满量程对应3.3V。// 读取通道0电压 float vol0 (float)adc_buf[0] * 3.3f / 4096.0f; // 读取通道1电压 float vol1 (float)adc_buf[1] * 3.3f / 4096.0f;如果你想在数据搬运完成时得到通知可以额外打开DMA传输完成中断。在DMA2_Stream0的CR里置位TCIE然后使能DMA2_Stream0的中断向量每轮两个通道都搬运完成后中断服务函数会被触发此时adc_buf数组里的数据已经完整刷新过一轮。3.3 实测验证与数值校准代码写完实测是必须做的环节。我的验证方法是搭一个简单的分压电路PA0输入1.65VPA1输入0.825V用调试器在线查看adc_buf的值。理想情况下adc_buf[0]读到的码值应该接近2048adc_buf[1]接近1024。第一次上电实测时如果发现adc_buf[0]和adc_buf[1]相差一个固定偏差不要急着怀疑代码先把ADC校准做完再对比。F407的片上校准能消除一部分内部比较器的失调电压上电后执行一次校准对精度有明显帮助。还有一个细节值得注意ADC刚上电后内部采样电容的初始状态不稳定前几次转换结果往往不可靠。实际项目中我一般让ADC-DMA先跑一小段时间忽略起始的几组数据或者直接把前几组数据丢弃再取平均。DMA循环模式跑起来之后adc_buf数组里的数据是持续刷新的具体滞后多少取决于转换速度和DMA搬运周期。4. 常见问题与排查经验4.1 现象与原因对照速查表寄存器版本调通之前问题往往集中在下面几类。我把最典型的故障现象和排查思路整理成了一张表故障现象可能原因排查与解决adc_buf全为0DMA外设地址写错确认DMA2_Stream0-PAR取的是ADC1-DR的地址而不是寄存器值adc_buf全为0DMA使用了错误的数据流确认使用的是DMA2_Stream0不是DMA1只有第一个通道有数据SQR1的L字段没设置为1检查SQR1 (1U 20)不是bit0只有第一个通道有数据SCAN位没有打开ADC_CR1的SCAN必须置1两个通道数据相同引脚配置错误或外部接线短路用万用表测PA0、PA1引脚电压数据更新一次后不再变化DMA没有开启循环模式确认CR寄存器中的CIRC位已经置1数据跳动幅度大采样周期太短把采样周期从15提高到56或84周期首轮数据中有一个值是初始值DMA使能顺序不对先使能DMA再启动ADC转换数据有规律性错位SQR3通道顺序与缓冲区期望不符确认SQ1对应数组下标0SQ2对应下标1这张表里的前几行几乎覆盖了我见过的大部分“ADC-DMA不工作”的帖子。其中外设地址类型错误和DMA数据流选错出现频率最高。4.2 调试技巧与避坑记录调寄存器代码时利用调试器观察寄存器实时值是很有效的手段。DMA工作是否正常可以直接看DMA2_Stream0-NDTR的值。循环模式下NDTR会不断在2和1之间变化如果这个值一直停留在某个数字不变说明DMA没有被持续触发。ADC是否在转换则看ADC1-SR的状态EOC位在每次通道转换完成后会被置1连续模式下它会频繁置位和清除。还有一个从实践里得来的经验信号源的内阻对ADC读数影响很大。F407内部采样电容在采样阶段会从外部信号源取电如果信号源内阻很高采样周期又短电容来不及充到稳定电压读数就会偏低。实际电路中高阻抗信号源建议先经过一级运放跟随器再接ADC引脚。如果没法加跟随器就增大采样周期用时间换精度。调试过程中你会发现有些问题根本不是代码问题而是测量方式的问题。有一次我调一个分压电路采集读到的电压始终比万用表量出来的低0.1V查了很久才发现是分压电阻的精度不够。所以真机调试时手上一定要有万用表先确认引脚上的实际电压到底是多少不要一上来就盯着串口打印的数字怀疑DMA配置。还有一点如果两路信号的参考地不同或者测量系统之间存在地环路ADC读数的稳定性会大打折扣。模拟信号的地线布置尽量短而粗ADC参考电压的退耦电容不能省这些硬件层面的问题代码再怎么写也弥补不了。这套寄存器版本的独立ADC-DMA双通道方案我前后在几个项目里都实践过从旋钮位置检测到电源电压监测改一改通道号和采样周期就能复用。最大的感受是寄存器版本的门槛不在于配置本身而在于你需要真正理解每个位的因果关系。库版本能帮你把代码写出来但只有理解了底层机制遇到数据不对时才能顺着信号链路一步步定位问题。最后提醒一句模拟采集系统的稳定性往往是软硬件共同决定的电源噪声、参考电压、地线质量都会直接影响读数调试时先测引脚电压再谈寄存器配置能少走很多弯路。

相关新闻

deepseek 的 CED 到底在干什么?——把 Transformer 掰开讲清楚

deepseek 的 CED 到底在干什么?——把 Transformer 掰开讲清楚

deepseek 的 ced 为什么会"自然分化" 目录 deepseek 的 ced 为什么会"自然分化" CED 到底在干什么?——把 Transformer 掰开讲清楚 一、先放结论:一句话版 二、先把普通 Transformer 讲透:每层都在干什么 普通 LLM 的一次推理 这就是 KV cache 吃显存的…

2026/10/14 1:24:07 阅读更多 →
NVLink跨卡原子操作与单调计数器:实现多GPU无锁同步的工程实践

NVLink跨卡原子操作与单调计数器:实现多GPU无锁同步的工程实践

/* 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 1:24:07 阅读更多 →
Kafka 生产环境分区热点倾斜治理:基于 Key 加盐与动态再均衡的高并发解法

Kafka 生产环境分区热点倾斜治理:基于 Key 加盐与动态再均衡的高并发解法

在每年双 11 的大促峰值期,许多负责消息中间件保障的架构师都会遇到一个极具迷惑性的“假象报警”: 打开 Kafka 全局监控大盘,集群整体的 CPU 利用率仅仅只有 35%,网络入网总带宽距离物理网卡上限还有一半以上的富余,看…

2026/10/14 1:23:07 阅读更多 →

最新新闻

信创招标要求写在哪一节_96万的燃气项目

信创招标要求写在哪一节_96万的燃气项目

10 月 12 日,焦作市公共资源交易中心公示了一个城市燃气安全监测服务项目的中标结果。金额不大——96 万元,中标方是中国移动通信集团河南有限公司焦作分公司,评审总得分 93.92。项目内容是对市区 150 处燃气领域相邻空间节点建设全覆盖、全天…

2026/10/14 2:02:18 阅读更多 →
Cadence Cerebrus 用户指南:强化学习驱动的数字后端 PPA 自动调优实战

Cadence Cerebrus 用户指南:强化学习驱动的数字后端 PPA 自动调优实战

简介:Cadence Cerebrus User Guide 是面向电子设计自动化工程师与技术人员的官方操作指南,聚焦 Cadence Cerebrus 工具在芯片设计流程优化中的实际应用。该指南对应产品版本 22.1x,最后更新于 2023 年 12 月,内容涵盖工具特定指令…

2026/10/14 2:02:18 阅读更多 →
astropy SAMP Hub 启动与停止完全指南:三种方式详解与底层原理

astropy SAMP Hub 启动与停止完全指南:三种方式详解与底层原理

科学计算科研数据分析 【免费下载链接】astropy Astronomy and astrophysics core library 项目地址: https://gitcode.com/gh_mirrors/as/astropy 点击查看 免费下载 导读 SAMP(Simple Application Messaging Protocol,简单应用消息协议&a…

2026/10/14 2:02:18 阅读更多 →
Knative Eventing 跨命名空间事件链接(Cross Namespace Event Links)特性全解析

Knative Eventing 跨命名空间事件链接(Cross Namespace Event Links)特性全解析

文档教程云原生 【免费下载链接】docs User documentation for Knative components. 项目地址: https://gitcode.com/gh_mirrors/docs1/docs 点击查看 免费下载 Knative Eventing 从 1.15 版本起引入了 cross-namespace-event-links 实验特性,允许 Trig…

2026/10/14 2:02:18 阅读更多 →
NPO光引擎替掉4.8万个光模块_买的是什么

NPO光引擎替掉4.8万个光模块_买的是什么

1. 引言:一次「不追求更快」的互联替换华为在 HUAWEI CONNECT 2026 上发布的 Ascend 960 SuperPoD,宣传语是「业界首个基于近封装光学(NPO)的超节点」。它给了一组很好算的数字:约 5500 个 Hi-ONE 光引擎,替…

2026/10/14 2:02:18 阅读更多 →
基于Vue3+SpringBoot的前后端分离电商系统设计与实现:以雪地装备销售平台为例

基于Vue3+SpringBoot的前后端分离电商系统设计与实现:以雪地装备销售平台为例

简介:一套基于Vue.js、SpringBoot与MySQL构建的雪地装备销售系统成品源码,面向计算机专业毕业设计或课程设计场景,可直接作为高评分项目提交。系统覆盖商品展示、搜索、购买、订单处理、支付接口及用户注册登录等完整电商流程,采用…

2026/10/14 2:01:18 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 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/13 22:01:27 阅读更多 →
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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →