STM32 ADC与DMA高效数据采集:CubeMX配置与HAL库实战指南
1. 项目概述为什么ADCDMA是STM32开发的效率利器如果你正在用STM32做数据采集比如读取传感器电压、电流或者做音频信号处理那你肯定绕不开ADC模数转换器。传统的做法是启动ADC转换然后原地死等轮询或者等中断发生再去读取数据。当采样率一高或者你需要连续采集一大段数据时CPU就会被频繁打断啥正经事都干不了效率极低。这时候DMA直接存储器访问就该登场了。它就像一个“数据搬运工”能在ADC转换完成后自动把数据从ADC的数据寄存器搬到我们指定的内存数组里全程不需要CPU插手。而STM32CubeMX配合HAL库把配置ADC和DMA协同工作的流程图形化了大大降低了入门门槛。今天我就结合自己踩过的坑详细拆解一下如何用CubeMX和HAL库稳定、高效地实现ADC的DMA传输让你采集数据时CPU还能腾出手来做算法或通信。2. CubeMX工程配置从零搭建ADCDMA采集框架配置是第一步也是决定后续代码是否简洁、稳定的基础。很多初学者的问题比如数据不对、DMA不启动、数组覆盖根源都出在配置这一步。2.1 芯片选型与引脚分配首先在CubeMX里新建工程选择你的具体型号比如STM32F103C8T6或F407ZGT6。找到你打算用作ADC输入的引脚例如PA0对应ADC1的通道IN0。在Pinout Configuration视图里点击该引脚将其功能设置为ADC1_IN0。这里有个关键点检查数据手册的“引脚复用功能”章节确认该引脚是否默认就是ADC功能有些引脚可能有多个ADC通道可选需要手动选择。2.2 ADC模块的详细参数配置点击左侧Analog下的ADC1进入配置界面。这里参数众多我挑几个最容易出错的讲Mode模式我们做连续DMA采集通常选择Independent mode独立模式。如果你的项目需要多个ADC同步或交替采样才会用到其他模式。Scan Conversion Mode扫描转换模式如果你只用一个通道如IN0可以禁用Disable。如果你要循环采集多个通道比如IN0, IN1, IN2则必须启用Enable。启用后ADC会按照你下面Rank里设置的顺序自动扫描这些通道。Continuous Conversion Mode连续转换模式必须启用Enable。这样ADC在一次转换结束后会自动开始下一次实现不间断采集为DMA的连续传输提供数据源。Discontinuous Conversion Mode间断转换模式禁用。这个模式是手动触发一组转换与我们自动连续的需求不符。DMA Continuous RequestsDMA连续请求强烈建议启用Enable。这个选项控制DMA请求的行为。如果禁用ADC每转换完一个数据或一组在扫描模式下产生一次DMA请求DMA搬运一次后就会停止需要手动重新使能很麻烦。启用后DMA请求会持续不断ADC转换不停DMA搬运就不停真正实现“全自动”。End Of Conversion Selection转换结束选择保持默认EOC flag at the end of single channel conversion每个通道转换结束产生EOC标志即可。如果你用了过采样等高级功能才需要考虑改变。Data Alignment数据对齐选择Right alignment右对齐。这是最常用的方式方便我们直接读取数据。对于12位ADC右对齐时数据存放在低12位高20位为0。Sampling Time采样时间这是精度和速度的权衡点。采样时间越长ADC内部的采样电容充电越充分对抗信号源阻抗的能力越强精度越高但转换速度会变慢。对于低速变化的信号如温度可以设置长一些如239.5 Cycles。对于高速信号必须设置短一些如15.5 Cycles否则跟不上变化。具体计算转换时间 采样时间 12.5个周期。例如ADC时钟为12MHz采样时间设为15.5周期则一次转换时间为(15.512.5)/12MHz ≈ 2.33us对应最高采样率约429kHz。但这是理论值实际还要考虑DMA搬运等开销。接下来在ADC1的Parameter Settings选项卡下找到Rank规则组序列。点击Add添加你要采集的通道并设置每个通道的Channel模拟输入通道号和Sampling Time该通道的采样时间。顺序很重要ADC会严格按照这个顺序扫描。2.3 DMA配置打通数据搬运的“高速公路”这是核心环节。在DMA Settings选项卡点击Add添加一个DMA请求。DMA Request选择ADC1或你使用的ADC。Direction方向选择Peripheral To Memory外设到存储器。因为数据是从ADC数据寄存器搬到我们的内存数组。Priority优先级根据系统需求选择通常Low或Medium即可。如果数据实时性要求极高可选High。Mode模式Normal普通模式DMA传输完指定的数据量比如一个数组的长度后自动停止。需要手动重启。不适合连续采集。Circular循环模式必须选择这个DMA传输完数组后会自动回到数组开头继续传输形成环形缓冲区完美契合ADC的连续转换实现“永不停止”的搬运。Increment Address地址自增Peripheral外设地址必须设为Disable。ADC的数据寄存器地址是固定的不能自增。Memory存储器地址必须设为Enable。这样DMA每搬运一个数据目标内存地址会自动后移数据才能依次存入数组。Data Width数据宽度两边都选择Word字32位。虽然ADC数据是12位但HAL库的ADC数据寄存器是32位的ADCx-DR我们的接收数组也定义为32位类型如uint32_t这样宽度匹配效率最高。如果选Half Word半字16位在某些情况下可能因为对齐问题导致传输错误。注意很多教程和早期代码里这里可能选Half Word因为ADC数据寄存器有效数据在低16位。但对于HAL库和为了确保兼容性特别是DMA传输的原子性我强烈建议统一使用Word。定义接收数组时也用uint32_t读取时再做类型转换或移位处理。2.4 时钟与中断配置时钟在Clock Configuration标签页确保给ADC和DMA所在的总线如APB2提供了足够的时钟。ADC时钟通常由APB2分频得到注意不要超过芯片手册规定的ADC最大时钟频率例如STM32F1通常不超过14MHz。中断对于单纯的ADC DMA采集通常不需要开启ADC的转换完成中断因为DMA已经帮我们处理了数据。但是如果你需要精确知道一组数据何时采集完毕例如做FFT分析可以开启DMA的传输完成中断TC, Transfer Complete。在DMA配置的NVIC Settings中勾选DMAx streamx global interrupt。不建议开启ADC的EOC中断那样会频繁打断CPU失去了DMA的意义。配置完成后生成代码。CubeMX会帮你初始化ADC、DMA并将它们关联起来。3. HAL库代码编写启动、读取与数据处理生成了代码骨架我们还需要自己“填充血肉”。关键代码主要在main.c和stm32xx_it.c如果用了中断中。3.1 变量定义与初始化在/* USER CODE BEGIN PV */区域定义全局变量#define ADC_BUFFER_SIZE 1024 // 定义缓冲区大小 uint32_t adc_value_buf[ADC_BUFFER_SIZE]; // ADC DMA接收缓冲区 volatile uint8_t dma_transfer_complete_flag 0; // DMA传输完成标志位volatile关键字很重要它告诉编译器这个变量可能被中断服务程序修改防止编译器做激进的优化而误删相关代码。在/* USER CODE BEGIN 2 */区域启动ADC和DMA// 启动ADC的DMA传输 // 参数ADC句柄目标内存地址数据长度注意是数据个数不是字节数 if (HAL_ADC_Start_DMA(hadc1, (uint32_t*)adc_value_buf, ADC_BUFFER_SIZE) ! HAL_OK) { Error_Handler(); // 启动失败进入错误处理 }这行代码是灵魂。它做了三件事1. 启动ADC转换。2. 启动DMA。3. 将ADC的DMA请求与这个DMA流关联起来。从此ADC每转换完一个数据或一组扫描数据就会触发DMA搬运一次。3.2 数据处理与DMA传输完成中断如果你开启了DMA传输完成中断那么当DMA搬运完ADC_BUFFER_SIZE个数据后在循环模式下这发生在它“回到数组起点”的那一刻也是一个周期完成点会触发中断。在stm32xx_it.c中找到对应的DMA中断服务函数void DMAx_Streamx_IRQHandler(void) { /* USER CODE BEGIN DMAx_Streamx_IRQn 0 */ if(__HAL_DMA_GET_FLAG(hdma_adc1, DMA_FLAG_TCx)) // 检查是否是传输完成中断 { __HAL_DMA_CLEAR_FLAG(hdma_adc1, DMA_FLAG_TCx); // 清除中断标志 dma_transfer_complete_flag 1; // 设置标志位 } /* USER CODE END DMAx_Streamx_IRQn 0 */ HAL_DMA_IRQHandler(hdma_adc1); /* USER CODE BEGIN DMAx_Streamx_IRQn 1 */ /* USER CODE END DMAx_Streamx_IRQn 1 */ }然后在主循环中检查这个标志位while (1) { if(dma_transfer_complete_flag) { dma_transfer_complete_flag 0; // 此时adc_value_buf中已经充满了最新一轮的ADC数据 process_adc_data(adc_value_buf, ADC_BUFFER_SIZE); // 调用你的数据处理函数 } // CPU可以安心执行其他任务如通信、UI刷新、复杂算法等 HAL_Delay(1); }这种“标志位主循环处理”的模式是嵌入式系统典型的异步处理方式能极大提高CPU利用率。3.3 多通道扫描采集的数据排列这是最容易让人困惑的地方。假设你配置了扫描模式按顺序采集通道0,1,2。DMA目标数组是adc_value_buf[1024]。在单次触发普通DMA模式下启动一次DMA会搬运3个数据通道0,1,2的值到数组的前三个位置。在连续转换循环DMA模式下数据会源源不断地填入数组。此时数组中的数据排列是[CH0, CH1, CH2, CH0, CH1, CH2, CH0, ...]。数组长度必须是通道数的整数倍否则数据处理时索引会错乱。你的数据处理函数需要知道通道数和顺序才能正确解析。例如#define CH_NUM 3 void process_adc_data(uint32_t* buf, uint32_t size) { for(uint32_t i 0; i size; i CH_NUM) { uint32_t ch0_val buf[i]; // 第i组的通道0 uint32_t ch1_val buf[i1]; // 第i组的通道1 uint32_t ch2_val buf[i2]; // 第i组的通道2 // ... 进行你的计算比如求平均、转换电压等 } }4. 核心原理与高级话题深入理解工作机制理解了怎么用我们再来看看它为什么能这样工作以及一些进阶玩法。4.1 ADC与DMA的硬件握手流程初始化CubeMX生成的代码配置了ADC的转换模式、序列、DMA的源地址ADC-DR、目标地址你的数组、数据宽度、传输模式。启动HAL_ADC_Start_DMA函数使能ADC和DMA。转换与搬运ADC开始第一次转换。转换结束ADC硬件不仅会置位EOC标志还会向DMA控制器发出一个请求信号。DMA控制器收到请求执行一次数据传输从ADC-DR寄存器读取一个字32位写入到你数组的当前地址。由于ADC是连续转换模式它会立刻开始下一次转换。由于DMA是循环模式且内存地址自增它会自动将目标地址指向数组的下一个位置等待下一次ADC请求。循环往复这个过程在硬件层面自动、不间断地进行形成一个“生产ADC转换-消费DMA搬运”的流水线CPU完全被解放。4.2 双缓冲与数据一致性处理在高速采集场景下数据处理可能跟不上数据产生的速度。如果DMA正在向数组A写数据而CPU同时在读数组A就会读到“半新半旧”的不一致数据。双缓冲Ping-Pong Buffer是解决这个问题的经典方法。思路是准备两个一样大的缓冲区BufA和BufB。初始让DMA向BufA写数据。当BufA被写满时通过DMA半传输完成中断HT或传输完成中断TC判断触发中断。在中断里立刻将DMA的目标地址切换到BufB同时设置一个标志告诉主循环“BufA数据已就绪可以处理了”。主循环看到标志开始安全地处理BufA的数据。当BufB被写满时再切换回BufA如此往复。HAL库提供了HAL_ADC_Start_DMA但它一次只能绑定一个缓冲区。实现双缓冲需要一些技巧可以在传输完成中断里调用HAL_ADC_Stop_DMA然后重新HAL_ADC_Start_DMA指向另一个缓冲区但这会引入短暂停顿。更高级的做法是直接操作DMA的CMAR存储器地址寄存器来动态切换目标地址但这需要对寄存器有更深的理解。4.3 采样率计算与性能极限采样率是衡量采集系统能力的关键指标。理论采样率Fs ADC_CLK / (采样周期 12.5)。其中ADC_CLK是ADC模块的时钟频率采样周期是你为每个通道设置的采样时间如15.5 Cycles。多通道扫描下的采样率每个通道的采样率会降低。总转换时间 通道数 * (单个通道采样时间12.5) Cycles。整体采样周期对所有通道采样一遍的时间变长了。DMA开销DMA搬运本身几乎不占用ADC时间线因为它与ADC转换是并行的。瓶颈通常在ADC转换速度上。CPU处理能力即使DMA不占CPU时间但CPU处理数据的速度必须高于数据产生的速度否则缓冲区会溢出。这就是为什么高速采集时数据处理算法必须高效或者采用双缓冲机制。5. 实战调试与常见问题排查理论再好调试时也会遇到各种妖魔鬼怪。下面是我总结的常见问题清单和解决方法。现象可能原因排查步骤与解决方法ADC值始终为0或固定值1. 引脚配置错误未设置为模拟输入。2. ADC或DMA时钟未使能。3. 采样时间太短信号未稳定就被转换。4. 参考电压未接或错误。1. 检查CubeMX引脚配置确认功能是ADCx_INy。2. 在Clock Configuration和生成的SystemClock_Config()函数中确认相关外设时钟已开启。3. 增加Sampling Time尤其是信号源阻抗较大时。4. 检查芯片VREF和VREF-或VDDA和VSSA引脚连接确保稳定、干净。DMA不搬运数据数组内容不变1. DMA配置模式错误用了Normal而非Circular。2.HAL_ADC_Start_DMA调用失败或未调用。3. DMA或ADC外设时钟故障。4. 内存地址自增未开启。1. 检查CubeMX中DMA的Mode是否为Circular。2. 单步调试检查HAL_ADC_Start_DMA的返回值。3. 使用调试器查看ADC-CR2和DMAx_Streamx-CR寄存器确认使能位是否置1。4. 确认DMA配置中Memory的Increment Address为Enable。数据错位多通道时1. 数组长度不是通道数的整数倍。2. 数据处理函数解析索引错误。3. DMA数据宽度与ADC数据寄存器宽度不匹配。1. 确保#define ADC_BUFFER_SIZE (CH_NUM * N)。2. 仔细检查数据处理循环的步长和索引计算。3. 确保CubeMX中DMA的Data Width两边都是Word接收数组类型为uint32_t。采样率远低于预期1. ADC时钟配置过低。2. 采样时间设置过长。3. 在扫描模式下总转换时间被通道数拉长。4. 错误地开启了间断模式或单次转换模式。1. 检查Clock Configuration中ADC时钟分频系数。2. 在保证精度的前提下尝试减小Sampling Time。3. 重新计算多通道下的理论采样率确认是否符合预期。4. 检查Continuous Conversion Mode是否启用Discontinuous Conversion Mode是否禁用。运行一段时间后数据异常或程序卡死1. 数组越界DMA写穿了缓冲区破坏了其他内存数据。2. 中断嵌套或优先级冲突导致死锁。3. 电源噪声或地线干扰影响ADC精度。1. 使用调试器的内存观察窗口监视数组边界外的内存是否被意外修改。2. 检查NVIC中断优先级避免在DMA中断中调用耗时长的HAL函数或处理大量数据。3. 优化PCB布局为模拟部分使用独立的LDO供电增加去耦电容使用屏蔽线连接传感器。调试心得善用调试器不仅仅是设断点。STM32CubeIDE或Keil的Live Watch功能可以实时查看全局变量如adc_value_buf的值Peripherals-ADC/DMA视图可以直观看到寄存器状态这是定位硬件配置问题最快的方法。从简到繁务必先实现单通道、连续采集、循环DMA这个最基本的功能并验证通过。然后再逐步增加通道、尝试中断、实现双缓冲。不要一开始就所有功能一起上。理解数据流在脑子里或纸上画一下数据流图信号-引脚-ADC-DR寄存器-DMA-内存数组。哪个环节断了问题就在哪里。电压换算ADC读到的原始值是数字量需要转换成电压Voltage (ADC_Value / 4095) * Vref对于12位ADCVref通常是VDDA即模拟供电电压通常是3.3V。确保你的Vref是准确的可以用万用表测量。最后关于HAL库的效率争议。很多人觉得HAL库慢、代码臃肿。对于ADC DMA这种对实时性要求极高的操作HAL库的抽象层确实会引入一点开销。但在绝大多数应用场景下这点开销相对于ADC转换时间来说微不足道。HAL库带来的开发效率、可读性和跨型号移植性是巨大的优势。当你真正需要极致性能时再去深入研究寄存器直接操作也不迟。对于绝大多数项目CubeMXHAL库配置ADCDMA绝对是快速实现稳定数据采集的最佳选择。

相关新闻

四向车选哪家好?2026国内主流四向穿梭车品牌盘点

四向车选哪家好?2026国内主流四向穿梭车品牌盘点

随着智能仓储和自动化立体库快速发展,越来越多企业开始关注四向穿梭车系统。但对于采购负责人来说,一个常见问题是:四向车选哪家好?实际上,不同厂商在技术路线、行业经验和服务能力方面各有优势。选择适合自身业务需求…

2026/7/30 12:48:22阅读更多 →
OCR预处理关键一步:文本方向(正/倒)判断的原理与实践

OCR预处理关键一步:文本方向(正/倒)判断的原理与实践

在光学字符识别(OCR)的实际应用中,我们处理的文档图像来源复杂,其文本方向并非总是规整的“正向”。有时,由于扫描仪设置、相机拍摄角度或原始文档排版等问题,图像中的文本可能是倒置的(旋转180…

2026/7/30 12:48:22阅读更多 →
AI视觉检测系统:终结FA光纤阵列外观不良困扰

AI视觉检测系统:终结FA光纤阵列外观不良困扰

在光通信器件、数据中心互联等高端制造领域,FA(Fiber Array)光纤阵列作为光信号传输与耦合的核心元件,其质量直接决定了整个光模块的性能与可靠性。然而,在生产过程中,FA光纤阵列总被各类外观不良所困扰&am…

2026/7/30 12:48:22阅读更多 →
树莓派运行Windows 11 ARM版:性能实测与优化指南

树莓派运行Windows 11 ARM版:性能实测与优化指南

最近在技术圈看到一个有趣的话题:树莓派能否流畅运行Windows 11?作为一款主打轻量级Linux应用的开发板,树莓派运行Windows系统听起来确实很有挑战性。本文将基于实际测试,全面揭秘树莓派运行Windows 11的性能表现、安装方法和优化…

2026/7/30 14:11:01阅读更多 →
DC-DC转换器实战指南:从拓扑选型到PCB布局的硬件设计核心

DC-DC转换器实战指南:从拓扑选型到PCB布局的硬件设计核心

1. 从“电源”到“能量调度官”:DC-DC转换器的角色重塑 在硬件设计的江湖里,DC-DC转换器常常被简单地称为“电源芯片”。这个称呼没错,但格局小了。它更像是一个隐藏在电路板深处的“能量调度官”。它的核心任务,是把一个直流电压…

2026/7/30 14:11:01阅读更多 →
12个月后,Claude跌出了周榜前十

12个月后,Claude跌出了周榜前十

下班回家,我打开OpenRouter的排行榜,想找个模型跑一批代码审查。往下划了三屏,没找到Claude。 不是网络问题。Anthropic的Opus 4.7和4.8双双跌出了周榜前十。近一年来,OpenRouter的榜单里第一次没有任何一款Claude模型。 我把截…

2026/7/30 14:11:01阅读更多 →
GVM 使用指南:管理多版本 Go

GVM 使用指南:管理多版本 Go

GVM 使用指南:管理多版本 Go GVM(Go Version Manager)是 Go 版本管理工具,定位类似于 Node 生态的 nvm、Python 生态的 uv。它可以在同一台机器上安装、切换多个 Go 版本,互不干扰。 日常开发中最常见的需求无非这几个…

2026/7/30 14:11:01阅读更多 →
室内装修给排水设计深度解析

室内装修给排水设计深度解析

室内装修给排水设计深度解析:4个核心维度筑牢居住品质防线 室内装修给排水设计做对了,能避免90%的后期居住漏水、返臭、排水不畅等糟心问题。很多业主在装修时容易把注意力放在外观风格上,忽略了隐蔽的给排水系统,等到入住后出现墙…

2026/7/30 14:11:01阅读更多 →
UE5全局光照选型指南:Path Tracing与Lumen的核心原理与实战决策

UE5全局光照选型指南:Path Tracing与Lumen的核心原理与实战决策

1. 项目概述:UE全局光照的十字路口 在虚幻引擎(UE)的世界里,全局光照(Global Illumination,简称GI)的抉择,几乎是每个项目从蓝图走向现实时都必须面对的核心技术岔路口。尤其是在UE5…

2026/7/30 14:09:00阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/29 9:47:45阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/30 12:22:27阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/29 7:58:51阅读更多 →
3分钟解锁iOS应用自由:TrollInstallerX让你的iPhone摆脱安装限制 [特殊字符]

3分钟解锁iOS应用自由:TrollInstallerX让你的iPhone摆脱安装限制 [特殊字符]

3分钟解锁iOS应用自由:TrollInstallerX让你的iPhone摆脱安装限制 🚀 【免费下载链接】TrollInstallerX A TrollStore installer for iOS 14.0 - 16.6.1 项目地址: https://gitcode.com/gh_mirrors/tr/TrollInstallerX 你是否曾经因为iOS系统的严格…

2026/7/30 0:00:58阅读更多 →
[GESP202606 四级] 扫雷

[GESP202606 四级] 扫雷

B4557 [GESP202606 四级] 扫雷 https://www.luogu.com.cn/problem/B4557 中国计算机学会(CCF)2026年6月C四级讲解——扫雷 https://www.bilibili.com/video/BV1MCMg6AEXR/ B4557 [GESP202606 四级] 扫雷 https://www.bilibili.com/video/BV1ZKTj6ZEVh/ 2…

2026/7/30 0:00:58阅读更多 →
Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 您是否曾因Windows系统盘空间不足而烦恼?是否遇到过设…

2026/7/30 0:00:58阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/30 0:27:26阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/30 4:47:18阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/29 14:26:42阅读更多 →