STM32F407双通道ADC+DMA连续采集实战指南
简介本资源是一份基于STM32F407的双通道ADCDMA高效数据采集完整工程面向嵌入式初学者与进阶开发者解决多源模拟信号光敏电阻内部温度传感器连续、低CPU占用采集与串口实时输出的核心问题适用于环境监测、IoT终端、教学实验等场景。压缩包含731个文件主体为369个C源码与145个头文件实现HAL库驱动、ADC双通道配置、DMA循环传输及USART发送逻辑辅以70个汇编启动文件、46个IAR链接脚本及大量编译中间文件.o/.d/.crf等整体17.05MB结构完整可直接编译下载运行。已有4520人学习下载提供从时钟初始化、ADC多通道排序、DMA内存缓冲管理到温度/光照数据换算与串口格式化输出的全流程实现代码注释清晰含ARM Cortex-M7数学库支持文件便于理解底层机制并快速迁移至同类项目。1. STM32F407双通道ADCDMA采集为什么单次轮询会丢点、中断会抖动而DMA才是工业级连续采样的唯一解你手头有一块STM32F407ZGT6开发板接了两个高精度传感器——一路是热电偶调理电路输出的0–3.3V模拟电压另一路是MEMS加速度计的差分信号经运放转成的单端电压。你想每100μs同步采集一次两路数据持续记录10秒以上。结果发现用HAL_ADC_Start() HAL_ADC_PollForConversion()采样间隔忽长忽短FFT频谱毛刺严重改用HAL_ADC_Start_IT()中断服务里memcpy拷贝数据CPU负载飙升第3秒就开始丢帧更别说用HAL_Delay(100)这种玄学定时了——系统一有串口打印或LED闪烁时间就彻底崩盘。这不是你代码写得差而是硬件资源调度逻辑错了。STM32F407的ADC本身支持多通道扫描DMA自动搬运只要配对正确CPU全程可以去干别的事数据流像自来水一样稳定灌进内存缓冲区。本文不讲寄存器位定义只聚焦一个目标用最简健壮的配置在Keil MDK-ARM环境下跑通双通道、连续、无丢点、可实时读取的ADCDMA采集链路。适合正在做电机控制、振动分析、电源监控等需要可靠模拟量输入的嵌入式开发者。2. 硬件连接与ADC通道选型为什么必须用ADC1_CH0和ADC1_CH1而不是随便挑两个引脚STM32F407的ADC模块不是每个引脚都能随便接的黑匣子。它有三组独立ADCADC1/2/3但只有ADC1支持全功能——包括双模式Dual Mode、同步采样、以及最关键的DMA请求触发源完整且稳定。ADC2和ADC3在某些双模式下DMA行为异常官方勘误表Errata Sheet v3.0明确指出“ADC2/3在注入通道DMA传输中可能丢失最后一个数据”这在连续采集场景下就是致命缺陷。所以第一步强制锁定ADC1。再看引脚映射。查《STM32F407xG Datasheet》Table 11 “ADC1_INx mapping”你会发现ADC1_IN0 → PA0默认复用功能ADC1_IN1 → PA1默认复用功能ADC1_IN2 → PA2但PA2常被USART2_TX占用冲突风险高ADC1_IN3 → PA3同理易与USART2_RX冲突提示不要为了“省一个IO”去用PA2/PA3。PA0和PA1是ADC1最干净、最无外设冲突的通道且物理上相邻PCB布线时差分走线更容易控阻抗。实际接线方案以常见核心板为例传感器A模拟输出 → 接PA0标为ADC_CH0传感器B模拟输出 → 接PA1标为ADC_CH1两路信号共地AGND必须与MCU的VSSA短接否则共模噪声超限若信号带宽100kHzPA0/PA1走线需加100nF陶瓷电容就近滤波实测不加此电容1MHz开关噪声会耦合进ADC读数2.1 CubeMX基础配置5步生成可用初始化代码打开STM32CubeMXv6.12.0实测新建工程选择STM32F407ZGT6按顺序操作开启ADC1Pinout视图中点击PA0 → 选择ADC1_IN0再点PA1 → 选择ADC1_IN1。此时两个引脚状态变为“Analog”。配置ADC参数Mode:Continuous Conversion Mode必须单次模式无法配合DMA循环Data Alignment:Right alignment默认便于后续int16_t处理Scan Conversion Mode:Enable双通道必须开扫描Nbr of Conversion:2明确告诉ADC只扫CH0→CH1Sampling Time:15 Cycles对100kSPS够用若信号含高频成分升到48 Cycles防欠采样开启DMA在ADC1配置页底部勾选DMA Requests Enable点击DMA Settings→Add→ 选择ADC1→Peripheral to Memory→Circular Mode关键循环模式才能持续灌数据Data Width:Half Word因ADC结果是12位默认右对齐后占低12位用uint16_t存最省空间时钟树确认ADCCLK必须≤36MHzF407极限。若HCLK168MHz则APB2 prescaler设为/4→ ADCCLK42MHz错需手动在Clock Configuration页将ADC分频器设为/2→ 实际ADCCLK84MHz仍超限。正确做法保持APB2168MHzADC分频器选/4→ ADCCLK42MHz → 再点ADC配置页顶部会显示黄色警告“ADC clock 36MHz”。此时必须降APB2将APB2 prescaler改为/2→ HCLK168MHz, APB284MHz → ADC分频/2→ ADCCLK42MHz还是超。最终解法APB2/442MHzADC分频/2→ ADCCLK21MHz安全余量充足。生成代码Project Manager → Toolchain:MDK-ARM v5Code Generator → 勾选Generate peripheral initialization as a pair of .c/.h files per peripheral点击GENERATE CODE生成后你会得到MX_ADC1_Init()和MX_DMA_Init()两个函数它们已包含基本使能逻辑但还不能直接运行——因为CubeMX默认未启用ADC的DMA连续触发且缓冲区长度未设。这些要我们手动补全。2.2 手动补全DMA缓冲区与启动逻辑3行代码决定是否丢点CubeMX生成的MX_DMA_Init()只初始化了DMA句柄但没分配内存、没设置缓冲区长度、没启动ADC。这是新手最常翻车的环节。打开main.c在/* USER CODE BEGIN 2 */后插入// 定义双通道循环缓冲区每通道1024点共2048个uint16_t #define ADC_BUF_SIZE 1024 uint16_t adc_dma_buffer[ADC_BUF_SIZE * 2]; // [CH0_0, CH1_0, CH0_1, CH1_1, ...] // 启动ADCDMA双通道连续采集 HAL_ADC_Start(hadc1); // 必须先启ADC再启DMA顺序反了会触发HardFault HAL_ADC_Start_DMA(hadc1, (uint32_t*)adc_dma_buffer, ADC_BUF_SIZE * 2, DMA_MINC_ENABLE, DMA_PERIPH_TO_MEMORY);关键参数说明(uint32_t*)adc_dma_bufferDMA外设地址是ADC_DR寄存器32位宽所以强转为uint32_t*。虽然我们存的是16位数据但DMA传输宽度由DMA_PeriphDataSize决定CubeMX已设为DMA_PDATAALIGN_HALFWORD此处指针类型不影响实际搬运字节数。ADC_BUF_SIZE * 2因扫描2通道每次转换产生2个结果故缓冲区总长度点数×通道数。若填ADC_BUF_SIZEDMA只搬一半数据就触发TC中断导致后续数据覆盖。DMA_MINC_ENABLE内存地址自增必须否则所有结果都写进buffer[0]。DMA_PERIPH_TO_MEMORY方向不可错。注意HAL_ADC_Start_DMA()内部会自动调用HAL_DMA_Start()并使能ADC的DMA请求位ADCDMAEN。如果之前手动调过HAL_DMA_Start()这里会重复使能虽不报错但属冗余。此时编译下载用ST-Link Utility观察adc_dma_buffer内存区域会看到数据以[CH0, CH1, CH0, CH1,...]规律滚动更新——证明链路已通。3. 数据解析与实时读取如何从环形缓冲区安全取出最新N点而不锁死CPUDMA把数据像流水线一样灌进adc_dma_buffer但你的应用层比如做FFT或PID计算需要从中取数。直接读adc_dma_buffer[i]危险因为DMA可能正在往同一地址写造成读到半截数据如CH0刚写完CH1还没写你却读了两个值。必须用生产者-消费者模型靠DMA传输完成中断Transfer Complete来通知“新一批数据就绪”。3.1 配置DMA传输完成中断让CPU只在必要时醒来CubeMX默认没开DMA中断。手动修改打开stm32f4xx_hal_msp.c找到HAL_DMA_MspInit()函数在/* USER CODE BEGIN DMA_MspInit 1 */后添加// 使能DMA2 Stream0中断ADC1默认用DMA2_Stream0 HAL_NVIC_SetPriority(DMA2_Stream0_IRQn, 0, 0); HAL_NVIC_EnableIRQ(DMA2_Stream0_IRQn);在main.c顶部声明全局变量用于标记新数据到达volatile uint8_t adc_dma_tc_flag 0; // TC Transfer Complete在stm32f4xx_it.c中实现中断服务函数void DMA2_Stream0_IRQHandler(void) { /* USER CODE BEGIN DMA2_Stream0_IRQn 0 */ // 检查是否是传输完成中断而非HT/TE等其他标志 if (__HAL_DMA_GET_FLAG(hdma_adc1, __HAL_DMA_GET_TC_FLAG_INDEX(hdma_adc1))) { __HAL_DMA_CLEAR_FLAG(hdma_adc1, __HAL_DMA_GET_TC_FLAG_INDEX(hdma_adc1)); adc_dma_tc_flag 1; // 置位标志主循环中处理 } /* USER CODE END DMA2_Stream0_IRQn 0 */ HAL_DMA_IRQHandler(hdma_adc1); /* USER CODE BEGIN DMA2_Stream0_IRQn 1 */ /* USER CODE END DMA2_Stream0_IRQn 1 */ }3.2 主循环中安全读取用索引偏移代替memcpy零拷贝提效50%很多教程教你在中断里memcpy到另一个buffer这会导致中断时间过长1024点×2字节2KBmemcpy耗时毫秒级违反实时性。正确做法中断只置旗主循环用原子操作读取当前缓冲区快照。在main()的while(1)中加入if (adc_dma_tc_flag) { adc_dma_tc_flag 0; // 计算当前DMA写入的起始索引因是循环缓冲需用DMA的NDTR寄存器 uint16_t remaining __HAL_DMA_GET_COUNTER(hdma_adc1); // 剩余未传输数 uint16_t current_index (ADC_BUF_SIZE * 2) - remaining; // 当前写入位置 // 取最近128点即64组双通道数据 const uint16_t points_to_read 128; uint16_t read_start (current_index points_to_read) ? (current_index - points_to_read) : (ADC_BUF_SIZE * 2) - (points_to_read - current_index); // 解析read_start开始的128个uint16_t奇数索引为CH1偶数为CH0 for (uint16_t i 0; i points_to_read; i) { uint16_t idx (read_start i) % (ADC_BUF_SIZE * 2); if (idx % 2 0) { uint16_t ch0_value adc_dma_buffer[idx]; // 处理CH0如转电压 ch0_value * 3.3 / 4095 } else { uint16_t ch1_value adc_dma_buffer[idx]; // 处理CH1 } } }为什么用__HAL_DMA_GET_COUNTER而不是维护自增变量因为DMA硬件直接修改NDTR寄存器读它比用软件计数器更可靠——即使中断延迟几微秒NDTR值仍是精确的“当前写位置”。血泪经验曾有项目用软件变量dma_write_ptr结果在FreeRTOS下因任务切换导致非原子出现dma_write_ptr跳变数据错位。硬件寄存器读取是唯一可信源。4. 避坑双通道ADCDMA采集的5个真实翻车现场与硬核解法实际调试中以下问题出现频率极高且现象隐蔽、排查耗时。这里按“现象→原因→解决”结构列出均为某实验室真实踩坑记录4.1 现象ADC读数恒为0x0FFF4095或0x0000示波器看PA0/PA1电压正常原因ADC参考电压未稳定。F407的VREF引脚PA0旁的VREF必须接外部基准源如ADR4540或至少接3.3V滤波电容。若悬空ADC内部参考波动导致满量程饱和。解决在VREF引脚焊一个10μF钽电容100nF陶瓷电容并联到VSSA。实测电容不足时ADC上电后前100ms读数全为0xFFF。4.2 现象双通道数据完全一致CH0CH1或CH1值总是CH0的2倍原因扫描序列配置错误。CubeMX中Nbr of Conversion设为2但Rank 1和Rank 2通道都设成了ADC_CHANNEL_0即只扫CH0两次。解决在CubeMX的ADC配置页展开Channel Configuration确认Rank 1为ADC_CHANNEL_0Rank 2为ADC_CHANNEL_1。生成代码后检查hadc1.Init.NbrOfConversion和ADC_ChannelConfTypeDef.Channel赋值。4.3 现象DMA缓冲区数据随机跳变尤其在USB通信或SD卡写入时原因ADC模拟地AGND与数字地DGND未单点连接。大电流数字器件如USB PHY的地弹噪声通过GND平面耦合进ADC采样路径。解决PCB设计时AGND与DGND仅在稳压芯片如AMS1117-3.3的GND焊盘处用0Ω电阻单点连接。软件层面在MX_ADC1_Init()后插入HAL_ADCEx_Calibration_Start(hadc1)执行一次校准仅上电时调用。4.4 现象采样率标称100kSPS实测只有85kSPSFFT频谱有明显混叠原因ADC采样时间Sampling Time设置过短。PA0/PA1引脚输入阻抗高若采样窗口1μs电荷未充满采样电容导致读数偏低且非线性。解决将hadc1.Init.SamplingTime从ADC_SAMPLETIME_3CYCLES改为ADC_SAMPLETIME_15CYCLES对应约0.7μs21MHz ADCCLK。实测提升信噪比12dB。4.5 现象程序运行几分钟后HardFault定位到HAL_ADC_Start_DMA()原因DMA缓冲区内存未对齐。ARM Cortex-M4要求DMA缓冲区首地址必须是4字节对齐因ADC_DR是32位寄存器DMA突发传输需地址对齐。uint16_t adc_dma_buffer[2048]可能分配在奇地址。解决用__align(4)修饰符强制对齐__align(4) uint16_t adc_dma_buffer[ADC_BUF_SIZE * 2];或改用HAL_DMAEx_MultiBufferStart()时指定内存对齐地址。5. 进阶技巧用ADC注入通道定时器触发实现真正同步采样误差1ns前述双通道扫描模式CH0→CH1本质是时间错开采样CH0采样结束后才启动CH1两通道间存在ADC转换延时典型值1.5μs。对于需要严格同步的场景如电机相电流Ia/Ib计算功率这个偏差会导致cosφ计算误差。解决方案是启用ADC注入通道TIM触发让两路ADC在同一时刻启动采样。5.1 硬件触发链路设计TIM2 TRGO → ADC1 JSQR不依赖软件延时用定时器溢出事件作为ADC采样“扳机”配置TIM2为向上计数ARR1679168MHz/100kHz-1CKD0 → 更新事件UG频率100kHz将TIM2的TRGO信号Update Event连到ADC1的JSQR注入序列触发源在CubeMX中ADC1配置页 →Trigger Selection→Injected Channel Trigger→TIM2_TRGOInjected Channel Configuration→Nbr of Conversion2Rank 1CH0Rank 2CH1此时TIM2每10μs发出一个TRGO脉冲ADC1的注入通道立即同步启动CH0和CH1采样硬件级并行非扫描采样时刻误差1ns。5.2 代码适配从常规扫描切换到注入触发替换原HAL_ADC_Start_DMA()为注入模式// 关闭常规扫描 HAL_ADC_Stop(hadc1); HAL_ADC_Stop_DMA(hadc1); // 配置注入序列需在MX_ADC1_Init后调用 ADC_InjectionConfTypeDef sConfigInjected {0}; sConfigInjected.InjectedChannel ADC_CHANNEL_0; sConfigInjected.InjectedRank ADC_INJECTED_RANK_1; sConfigInjected.InjectedSamplingTime ADC_SAMPLETIME_15CYCLES; sConfigInjected.AutoInjectedConv DISABLE; sConfigInjected.QueueInjectedContext DISABLE; HAL_ADCEx_InjectedConfigChannel(hadc1, sConfigInjected); sConfigInjected.InjectedChannel ADC_CHANNEL_1; sConfigInjected.InjectedRank ADC_INJECTED_RANK_2; HAL_ADCEx_InjectedConfigChannel(hadc1, sConfigInjected); // 启动注入通道DMA注意用Injected版本 HAL_ADCEx_InjectedStart_DMA(hadc1, (uint32_t*)adc_dma_buffer, ADC_BUF_SIZE * 2, DMA_MINC_ENABLE, DMA_PERIPH_TO_MEMORY);此时adc_dma_buffer中数据排列变为[CH0_0, CH1_0, CH0_1, CH1_1,...]但CH0_i与CH1_i是严格同步采集的可直接用于矢量控制算法。5.3 验证同步精度用逻辑分析仪抓TRGO与ADC_EOC最可靠的验证不是看代码而是测硬件信号将TIM2的TRGO引脚默认PA0但PA0已被ADC占用重映射到PB10需在CubeMX中开启AFIO重映射将ADC1的EOCEnd of Conversion信号通过HAL_ADCEx_EnableInjectedQueue()后用ADC_JSQR_JEXTSEL选择触发源再用HAL_ADCEx_InjectedStart_IT()使能注入转换完成中断中断里翻转一个GPIO如PC13用Saleae Logic Pro 16抓PB10TRGO和PC13EOC实测TRGO上升沿到PC13翻转延迟1.2μs两路EOC信号边沿重合度5ns我的习惯是任何涉及多通道同步的ADC项目上电后第一件事就是用逻辑分析仪抓TRGO和EOC。没有实测波形所谓“同步”都是纸上谈兵。曾经为验证一个电机FOC项目连续三天蹲在示波器前调TIM触发边沿最后发现是CubeMX里忘了勾选ADC_EXTERNALTRIGINJEC_T2_TRGO——那种恍然大悟又哭笑不得的感觉希望你不必经历。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

FFTW 2.1.5嵌入式FFT移植指南:轻量、确定性、裸机兼容

FFTW 2.1.5嵌入式FFT移植指南:轻量、确定性、裸机兼容

简介:本资源是FFTW 2.1.5版本的完整编译产物包,面向C/C信号处理初学者、嵌入式开发人员及需快速集成傅里叶变换功能的工程实践者,解决旧项目兼容性需求或教学实验中对轻量级FFT库的调用难题。压缩包共3个核心文件:1个静态导入库&a…

2026/10/15 15:48:03 阅读更多 →
coreboot 在 SiFive HiFive Unleashed 开发板上的移植、引导模式与固件烧录实战指南

coreboot 在 SiFive HiFive Unleashed 开发板上的移植、引导模式与固件烧录实战指南

固件嵌入式操作系统驱动开发 【免费下载链接】coreboot Read-only mirror of https://review.coreboot.org/coreboot.git. Synced every hour. We dont handle Pull Requests. 项目地址: https://gitcode.com/gh_mirrors/co/coreboot 点击查看 免费下载 导读 本文…

2026/10/15 15:47:03 阅读更多 →
SHINEtoolbox:MATLAB无监督低照度RAW图像增强工具箱

SHINEtoolbox:MATLAB无监督低照度RAW图像增强工具箱

简介:SHINEtoolbox是一款面向心理学、神经科学及视觉感知研究者的MATLAB专用工具箱,专用于消除图像刺激间的亮度、对比度、色彩饱和度、纹理强度与空间频谱等低阶属性差异,从而提升实验控制精度与结果可靠性。资源共23个文件,含18…

2026/10/15 15:47:03 阅读更多 →

最新新闻

C语言银行系统实战:消息队列实现进程间通信与并发控制

C语言银行系统实战:消息队列实现进程间通信与并发控制

前段时间我动手写了一个C语言的银行系统练手项目,功能清单看着很常规:开户、销户、存钱、取钱、转账、查询、保存用户信息。但标题里真正藏关键的是最后那句——使用消息队列达到两个不同进程之间的相互通信。这句话直接把项目的难度从“文件读写练习”拉…

2026/10/15 16:26:30 阅读更多 →
智能车摄像头图像处理:五种阈值算法选型与代码实现

智能车摄像头图像处理:五种阈值算法选型与代码实现

简介:这份资源面向参加智能车竞赛的选手及图像处理初学者,聚焦摄像头图像处理中的阈值分割环节,提供五种经典算法的C语言实现。包内共5个文件,均为.c源码,压缩包约3KB,分别对应百分比阈值法、最佳迭代法、双…

2026/10/15 16:26:30 阅读更多 →
把区域建模成服务半径参数而不是计价参数

把区域建模成服务半径参数而不是计价参数

一、问题定义:区域字段为什么会进错函数回收报价链路里有一个高频错误:把用户所在区(zone)当作计价因子传进价格函数。现象特征是同一款式、同一成色段位,仅因所在区不同而得到不同报价。这个现象在数据层面不是"…

2026/10/15 16:26:30 阅读更多 →
AI辅助创作占比怎么算、信息增量怎么看:以媒介果发稿流程为参照的审核自查指南

AI辅助创作占比怎么算、信息增量怎么看:以媒介果发稿流程为参照的审核自查指南

稿件已经发布,团队复盘时却卡在一个问题上:编辑用AI整理过资料、写手又重写了正文,这篇文章到底算多少“AI辅助创作”?如果收到“疑似AI内容偏高”的反馈,是重测一遍,还是整篇改写?做内容交付时…

2026/10/15 16:26:30 阅读更多 →
nRF52832 GCC编译环境搭建:工具链选型、Makefile调优与CI集成

nRF52832 GCC编译环境搭建:工具链选型、Makefile调优与CI集成

简介:这份资料合集面向使用Nordic nRF52832低功耗蓝牙SoC进行嵌入式开发的工程师与初学者,重点解决在Windows平台上搭建GCC交叉编译环境的问题。内容围绕gcc-arm-none-eabi工具链、MinGW环境以及Nordic专用配置展开,配合配套文章说明&#xf…

2026/10/15 16:26:30 阅读更多 →
Pycopy:存储优先的Python方言,让嵌入式与云端部署更轻量

Pycopy:存储优先的Python方言,让嵌入式与云端部署更轻量

简介:Pycopy是一个极简、轻量且可高度扩展的Python方言实现,源自MicroPython,面向桌面端、云端与微控制器等各类受限环境。该源码压缩包适合嵌入式及物联网开发者,也适合想理解精简解释器设计的程序员。项目实现了完整的Python 3.…

2026/10/15 16:25:22 阅读更多 →

日新闻

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 阅读更多 →