STM32 ADC与DMA配置指南:实现高效数据采集与CPU零开销
1. 项目概述为什么DMAADC是STM32开发的必修课如果你正在用STM32做数据采集比如读取传感器电压、电流或者做音频信号处理还在用轮询或者中断的方式读取ADC转换结果那你的CPU可能正在“负重前行”。我见过不少项目主循环里塞满了HAL_ADC_GetValueCPU时间被大量浪费在等待ADC转换完成上导致系统响应变慢甚至错过关键事件。而“STM32通过DMA进行ADC采集”这个组合正是解决这个痛点的标准答案。它能让ADC在后台自动、连续地把转换数据搬运到指定的内存数组中完全解放CPU实现高效、低功耗的数据流。简单来说这个项目就是配置STM32的ADC和DMA外设让它们俩“搭伙干活”。ADC负责把模拟信号比如0-3.3V电压转换成数字值比如0-4095DMA直接存储器访问则像一个不知疲倦的搬运工ADC每转换完一个数据DMA就立刻把这个数据从ADC的数据寄存器“搬”到你预先定义好的数组里。整个过程不需要CPU参与你只需要在初始化时设置好然后就可以在程序里随时读取那个已经装满数据的数组进行分析。这对于需要高频、连续、稳定采集的应用场景比如振动监测、电源质量分析、甚至是简易的示波器都是基石般的技术。2. 核心思路与方案选型理解数据流的“高速公路”在动手写代码之前我们必须把整个数据流的逻辑理清楚。这就像规划一条从原料模拟信号到仓库内存数组的自动化生产线。方案选型的核心就在于如何高效、可靠地搭建这条生产线。2.1 为何选择DMA而非中断或轮询STM32的ADC数据读取有三种经典模式轮询、中断和DMA。轮询主程序不断查询ADC的转换完成标志位。这是最原始的方式CPU利用率极低在等待期间什么也干不了只适用于极低频率或单次采集。中断ADC转换完成后产生一个中断在中断服务函数里读取数据。这比轮询好CPU在等待时可以处理其他任务。但当采样率很高时比如几十kHz频繁的中断会带来可观的上下文切换开销可能影响其他实时任务的执行。DMAADC转换完成信号直接触发DMA传输数据搬运由硬件完成零CPU开销。这是高速连续采集的唯一选择。选型结论对于任何需要连续采集、且采样率高于1kHz的应用DMA是必选项。它能保证数据流的连续性避免因CPU忙而导致的数据丢失为系统留出充足的算力进行滤波、算法处理或通信。2.2 HAL库与标准外设库SPL的选择早些年我们可能用标准外设库需要手动配置一大堆寄存器。现在ST主推HAL库和LL库。HAL库提供了更高层次的抽象函数封装性好初始化流程清晰跨STM32系列兼容性更强但代码效率稍低。LL库更接近寄存器效率高。对于ADCDMA这种标准操作我强烈建议使用HAL库。原因有三一是开发速度快HAL提供了完整的HAL_ADC_Start_DMA这类一站式函数二是CubeMX工具可以图形化配置自动生成初始化代码极大降低配置复杂度三是对于大多数应用HAL库那点效率损失微不足道开发效率和代码可维护性的收益更大。2.3 单次、连续、扫描与间断模式的理解这是ADC配置中最容易混淆的概念决定了生产线的“工作节奏”。单次Single vs 连续Continuous针对单个ADC通道。单次模式下ADC转换一次后就停止需要再次触发连续模式下ADC转换完一次立刻开始下一次永不停歇。在DMA配合下我们通常选择连续转换模式以维持稳定的数据流。扫描Scan vs 间断Discontinuous针对多个ADC通道。扫描模式下ADC会按照规则序列中定义的顺序自动依次转换多个通道。间断模式则每次触发只转换序列中的一个通道。对于多通道采集我们使用扫描模式。DMA的循环模式Circular这是DMA的“灵魂”配置。在此模式下当DMA搬运数据填满你指定的目标数组后它会自动回到数组开头重新开始搬运形成一个环形的缓冲区。这完美匹配ADC的连续转换实现了“采集-存储”的无限循环你只需要处理这个环形缓冲区里的数据即可。我们的核心方案ADC配置为连续转换模式扫描模式如果多通道DMA配置为循环模式。这样只需一次启动ADC和DMA就会自动、循环地将多个通道的数据搬运到内存中。3. 硬件设计与软件配置详解理论清楚了我们开始搭建。这里我以STM32F4系列以F407为例和STM32CubeIDE开发环境进行说明其他系列原理相通。3.1 硬件连接与引脚配置首先确定你的模拟信号源。假设我们要采集一个电位器的电压单通道信号连接到芯片的PA0引脚对应ADC1的通道0。原理图检查确保PA0引脚没有被复用作其他功能如UART_TX。在PCB上模拟信号走线应尽量远离数字信号如时钟、PWM以减少噪声干扰。参考电压确保VREF和VREF-或VDDA和VSSA连接稳定。VREF通常接3.3V它是ADC测量的基准其稳定性直接决定测量精度。建议在VDDA引脚附近放置一个0.1uF和10uF的电容进行滤波。模拟输入保护如果输入信号可能超过VREF或低于VREF-必须在输入端添加钳位保护电路如使用肖特基二极管钳位到电源和地防止损坏ADC输入引脚。3.2 使用STM32CubeMX进行图形化配置CubeMX能可视化配置时钟树、外设和中间件并生成初始化代码是避免低级配置错误的神器。新建工程选择你的具体芯片型号如STM32F407ZGTx。配置时钟在RCC设置中将高速外部时钟HSE设置为Crystal/Ceramic Resonator。在Clock Configuration标签页将系统时钟SYSCLK配置到芯片允许的最高频率如168MHz并确保ADC的时钟ADCCLK不超过芯片手册规定的最大值对于F4通常为36MHz。可以通过APB2预分频器来调整。配置ADC1在Analog下拉菜单中找到ADC1。在Parameter Settings标签页Resolution: 选择12-bit分辨率决定量化精度。Scan Conversion Mode: 启用Enabled。即使单通道也建议启用为以后扩展留余地。Continuous Conversion Mode: 启用Enabled。DMA Continuous Requests: 启用Enabled。这是保证DMA在连续模式下持续请求数据的关键。End Of Conversion Selection: 选择EOC after each conversion每次转换后产生EOC信号。在NVIC Settings标签页不要使能ADC的全局中断。因为我们使用DMA不需要ADC转换完成中断。配置ADC通道在Pinout View上找到PA0将其功能设置为ADC1_IN0。回到ADC1的Configuration点击Channel Settings下的Add选择IN0。设置Rank为1Sampling Time采样时间根据信号源阻抗选择。阻抗越高需要更长的采样时间来让内部采样电容充放电稳定。对于电位器阻抗通常10kΩ选择Cycles 84或Cycles 112是安全的。采样时间越长精度越高但转换速率越低。配置DMA在DMA Settings标签页点击Add。DMA Request: 选择ADC1。Mode: 选择Circular循环模式。Data Width: 源和目标都选择Word32位。注意虽然ADC是12位数据但数据寄存器是32位的。选择Word可以避免对齐问题HAL库会处理数据提取。生成代码在Project Manager标签页设置好工程名、路径和IDE然后点击GENERATE CODE。3.3 生成的代码分析与关键函数解读CubeMX会生成main.c、adc.c、dma.c等文件。我们重点关注main.c中的用户代码区。MX_ADC1_Init(): 这个函数包含了ADC的所有初始化配置包括我们刚才在CubeMX里设置的参数。你一般不需要修改它。MX_DMA_Init(): 初始化DMA控制器。HAL_ADC_MspInit(): 这个函数在adc.c里它由HAL库在初始化ADC时自动调用负责底层的GPIO和DMA配置比如将DMA通道与ADC外设关联。CubeMX生成的代码已经把它写好了。用户需要自己添加的核心代码 在main.c的/* USER CODE BEGIN 2 */和/* USER CODE END 2 */之间添加启动代码和数据处理代码。/* USER CODE BEGIN PV */ #define ADC_BUFFER_SIZE 1024 // 定义DMA目标缓冲区大小 uint32_t adc_buffer[ADC_BUFFER_SIZE]; // DMA搬运的目标数组 /* USER CODE END PV */ int main(void) { // ... 系统初始化外设初始化由CubeMX生成 /* USER CODE BEGIN 2 */ // 启动ADC并关联DMA到目标缓冲区 if (HAL_ADC_Start_DMA(hadc1, (uint32_t*)adc_buffer, ADC_BUFFER_SIZE) ! HAL_OK) { Error_Handler(); // 启动失败处理 } /* USER CODE END 2 */ while (1) { // 主循环里adc_buffer数组已经在被DMA自动更新了 // 你可以随时访问它例如计算最近N个点的平均值 uint32_t sum 0; for(int i0; i100; i) { sum adc_buffer[i]; } uint32_t average_voltage (sum / 100) * 3300 / 4095; // 转换为毫伏值 // ... 其他处理或发送 } }关键函数HAL_ADC_Start_DMA解析 这个函数做了三件事1. 启动ADC转换。2. 启动指定的DMA流/通道。3. 将DMA的目标地址指向你提供的数组并设置传输长度。调用之后ADC和DMA的自动化流水线就正式运转了。注意adc_buffer数组必须定义在全局或静态存储区不能是函数内的局部变量。因为DMA操作的是物理内存地址函数退出后局部变量的地址可能失效或重复使用导致数据写入不可预测的区域引发程序崩溃。4. 核心环节实现与数据处理技巧配置好只是第一步如何稳定、准确地获取并利用这些数据才是体现功力的地方。4.1 多通道采集的配置与数据排列如果需要采集多个通道比如IN0,IN1,IN2在CubeMX的ADC配置中在Channel Settings下依次添加多个通道并设置不同的Rank顺序号。假设我们按Rank1IN0、Rank2IN1、Rank3IN2的顺序扫描。 那么在DMA循环模式下adc_buffer数组中的数据将会按照[IN0, IN1, IN2, IN0, IN1, IN2, ...]的顺序循环填充。 如果你定义的缓冲区大小是300那么前三个数据adc_buffer[0], [1], [2]就是第一次扫描的三个通道值[3], [4], [5]是第二次扫描的值以此类推。数据处理示例要获取最新一轮的IN1通道的值你需要知道它的索引位置。由于是循环缓冲区最新数据的位置在不停变化。一个常用技巧是使用DMA的CNDTR寄存器当前剩余数据计数来推算当前写指针位置。// 获取DMA通道1假设是ADC1的DMA当前剩余未传输的数据量 uint16_t remaining __HAL_DMA_GET_COUNTER(hdma_adc1); // 计算当前DMA写指针在缓冲区中的索引 uint32_t current_index ADC_BUFFER_SIZE - remaining; // 获取上一轮IN1的数据注意索引回绕处理 uint32_t last_IN1_index (current_index - 2 ADC_BUFFER_SIZE) % ADC_BUFFER_SIZE; uint32_t IN1_value adc_buffer[last_IN1_index];更稳健的做法是开启DMA的传输完成中断TC或半传输完成中断HT在中断里处理半缓冲或全缓冲的数据这就是“双缓冲”或“乒乓缓冲”机制可以有效避免处理数据时缓冲区被DMA覆盖的问题。4.2 数据校准与滤波ADC采集的原始值存在偏移和增益误差且混有噪声。内部校准STM32的ADC模块内置自校准功能。在初始化ADC之后、启动之前执行以下代码可以显著减少内部电容误差。HAL_ADCEx_Calibration_Start(hadc1); // 执行校准实操心得校准应在ADC上电稳定后进行。对于高精度应用可以在每次ADC初始化后都执行一次校准。软件滤波均值滤波最简单有效。连续采集N个点求和后取平均。N越大平滑效果越好但响应速度越慢。适用于变化缓慢的信号如温度。#define FILTER_N 32 uint32_t moving_average_filter(uint32_t new_sample) { static uint32_t buf[FILTER_N] {0}; static uint8_t idx 0; static uint64_t sum 0; sum - buf[idx]; // 减去最旧的值 sum new_sample; // 加上最新的值 buf[idx] new_sample; // 更新缓冲区 idx (idx 1) % FILTER_N; // 移动索引 return (uint32_t)(sum / FILTER_N); }中值滤波对采集的N个点排序取中间值。能有效滤除脉冲干扰毛刺。一阶低通滤波惯性滤波Y(n) α * X(n) (1-α) * Y(n-1)。α是滤波系数0α1决定新旧数据的权重。适合实时性要求高的场合计算量小。4.3 电压计算与定标将12位ADC原始值0-4095转换为实际电压单位mV// VREF 是参考电压单位mV如3300 // adc_raw 是ADC原始值 uint32_t voltage_mv (adc_raw * VREF) / 4095;如果参考电压VREF不是精确的3.300V或者你需要更高的精度可以使用外部高精度基准源如REF30252.5V并在公式中使用实际的基准电压值。对于比例测量如电位器位置直接使用原始值adc_raw可能更方便。5. 常见问题排查与实战经验即使配置看起来正确实际调试中也可能遇到各种问题。下面是我踩过的一些坑和解决方法。5.1 DMA数据不更新或全是0这是最常见的问题。检查1缓冲区地址和大小确认HAL_ADC_Start_DMA传入的缓冲区地址和大小正确。缓冲区必须是全局/静态数组。检查2DMA模式确认DMA配置为Circular模式。如果是Normal模式DMA传输完指定次数后就停止了。检查3ADC时钟使用调试器或通过翻转IO口测量确认ADC的时钟ADCCLK已使能且未超频。超频会导致ADC无法正常工作。检查4采样时间不足如果信号源阻抗大如MΩ级采样时间太短会导致内部采样电容充电不足读回的值随机或为0。逐步增加Sampling Time如从3个周期增加到480个周期测试。检查5触发源在连续转换模式下ADC需要一次“启动”触发。HAL_ADC_Start_DMA函数提供了这个触发。确保它被成功调用且返回HAL_OK。5.2 数据跳动噪声大ADC读数不稳定最后几位数字不停跳动。对策1硬件滤波在模拟输入端并联一个10nF~100nF的电容到地构成一个简单的RC低通滤波器滤除高频噪声。注意电容太大会影响信号变化速度。对策2优化PCB布局确保模拟地AGND和数字地DGND单点连接。VDDA电源线尽量粗并紧耦合去耦电容0.1uF10uF。对策3软件滤波如上节所述施加均值滤波或低通滤波。对策4检查参考电压用万用表测量VREF或VDDA的电压是否稳定。如果系统其他部分如电机、继电器工作时导致电源波动也会影响ADC精度。5.3 多通道数据错位采集多个通道时发现数据对不上号比如IN0的值跑到了IN1的位置。原因这几乎总是因为DMA的数据宽度Data Width配置错误。ADC数据寄存器是32位的但有效数据是右对齐的16位或12位。解决方案在CubeMX的DMA配置中将源端Source Data Width和目标端Destination Data Width都设置为Word32位。让HAL库来处理数据对齐。如果你设置为Half Word16位在传输32位寄存器到16位内存时高16位和低16位的顺序可能导致错位。5.4 采样率上不去或达不到理论值实际采样频率低于计算值。计算公式总转换时间 采样时间 逐次逼近转换时间固定如12位分辨率下为12.5个周期。采样率 ADCCLK / 总转换时间。例如ADCCLK36MHz采样时间84.5周期转换时间12.5周期。总周期数97。理论采样率 36,000,000 / 97 ≈ 371 kHz。瓶颈排查DMA带宽对于多通道高速采集确保DMA有足够带宽。检查DMA总线是否被其他高优先级传输占用。内存访问速度如果目标缓冲区位于速度较慢的内存区域如DTCM可能成为瓶颈。通常放在默认的SRAM即可。中断干扰虽然DMA不占用CPU但如果系统中有非常高优先级的中断频繁发生可能会短暂阻塞总线影响DMA访问。可以尝试降低ADC/DMA的优先级在CubeMX的NVIC配置中调整。实际测量最好的方法是在DMA传输完成中断TC里翻转一个GPIO引脚用示波器测量翻转频率这个频率乘以缓冲区大小就是实际的平均采样率。5.5 低功耗模式下的ADCDMA在电池供电设备中我们可能希望MCU进入睡眠Sleep或停止Stop模式但ADC仍能通过DMA采集数据并唤醒MCU。挑战在低功耗模式下系统时钟可能关闭或降频ADC和DMA可能无法工作。解决方案以Stop模式为例配置一个定时器如LP_TIM在低功耗模式下仍能运行用它来触发ADC转换将ADC的触发源设置为该定时器。配置DMA在传输完成时产生中断并将此中断设置为唤醒事件通过EXTI线。进入Stop模式前启动定时器和ADC的DMA采集。ADC被定时器触发转换DMA搬运数据填满缓冲区后产生中断唤醒MCU。MCU唤醒后处理缓冲区数据然后可以再次进入低功耗模式。注意这需要仔细查阅芯片参考手册的“低功耗模式”章节确认在目标低功耗模式下哪些时钟和外设仍然可用以及具体的唤醒源配置方法。不同系列如F0, L4, G0的支持程度差异很大。

相关新闻

【数据分享】2005-2026年我国逐日露点温度栅格数据

【数据分享】2005-2026年我国逐日露点温度栅格数据

气象数据是我们在各项研究中都经常使用的数据,尤其是高空间精度或者高时间精度的气象数据非常受欢迎。今日我们分享的是2005—2026年我国逐日露点气温栅格数据!该数据来源于Climate Data Store(CDS)中的ERA5-Land再分析数据集。数…

2026/8/9 19:05:59 阅读更多 →
自动化工作流与知识管理系统的技术实践

自动化工作流与知识管理系统的技术实践

1. 项目概述过去一年里,我尝试了各种技术实验和个人项目,从自动化工具到创意编程,从效率提升到生活优化。这些探索不仅让我积累了丰富的实践经验,也促使我对技术、生活和创造力之间的关系有了更深的思考。这篇总结将分享其中最具价…

2026/8/9 11:49:57 阅读更多 →
HART协议详解:03 HART协议结构解析

HART协议详解:03 HART协议结构解析

第三季 HART协议结构解析 ——从FSK波形到数据帧:看懂智能仪表之间的数字语言 各位工业现场的工程师朋友们,大家好! 上一季我们揭开了HART物理层的“数字魔法”:在4–20mA电流环上,通过Bell202 FSK实现了模拟与数字的和谐共存。 我们用示波器“听到了”1200/2200Hz的…

2026/8/9 10:49:25 阅读更多 →

最新新闻

Python-for-Android:为什么Python开发者应该选择它而非传统Android开发方案

Python-for-Android:为什么Python开发者应该选择它而非传统Android开发方案

Python-for-Android:为什么Python开发者应该选择它而非传统Android开发方案 【免费下载链接】python-for-android Turn your Python application into an Android APK 项目地址: https://gitcode.com/gh_mirrors/py/python-for-android 对于数百万Python开发…

2026/8/11 14:57:36 阅读更多 →
Pi + DeepSeek-v4-Flash,这用着也太爽了。

Pi + DeepSeek-v4-Flash,这用着也太爽了。

各位小伙伴们大家好,我是 cxuan。 今天我们来聊一下 Pi ,Pi 这个 Agent 我也是想写很久了。 如果你刚接触 Pi,就暂且可以先把它理解成一个运行在 CLI 里的 Coding Agent,它的设计逻辑就是四个字 — 极简内核。 极简到像是只有内核…

2026/8/11 14:57:36 阅读更多 →
词达人自动化助手:3分钟解放30分钟枯燥练习的终极指南

词达人自动化助手:3分钟解放30分钟枯燥练习的终极指南

词达人自动化助手:3分钟解放30分钟枯燥练习的终极指南 【免费下载链接】cdr 微信词达人,高正确率,高效简洁。支持班级任务及自选任务 项目地址: https://gitcode.com/gh_mirrors/cd/cdr 你是否厌倦了每周在词达人平台上重复枯燥的词汇…

2026/8/11 14:57:36 阅读更多 →
Java项目代码规范与静态检查实战:Checkstyle、PMD、SpotBugs集成指南

Java项目代码规范与静态检查实战:Checkstyle、PMD、SpotBugs集成指南

在技术开发领域,我们常常追求代码的“优雅”与“高效”,正如美学中对“标准”的探讨。今天,我们不谈视觉美学,而是聚焦于一个在软件开发中堪称“标准”且至关重要的环节—— 代码规范与静态检查 。它就像是代码世界的“标准眼型…

2026/8/11 14:57:36 阅读更多 →
Unity GC优化入门:从原理到实战,解决移动端卡顿问题

Unity GC优化入门:从原理到实战,解决移动端卡顿问题

1. 项目概述:为什么Unity GC优化是初学者的必修课? 如果你刚开始接触Unity开发,可能觉得游戏能跑起来、画面看起来不错就万事大吉了。但当你第一次尝试在手机上打包运行一个稍微复杂点的场景,或者看着编辑器里那个代表内存的绿色柱…

2026/8/11 14:57:36 阅读更多 →
C++ RAII编程范式:资源自动管理、异常安全与工程实践

C++ RAII编程范式:资源自动管理、异常安全与工程实践

1. 项目概述:为什么RAII是C程序员的必修课 如果你写过C,大概率遇到过内存泄漏、文件句柄未关闭或者互斥锁忘记解锁的“惊喜”。这些资源管理上的失误,轻则导致程序内存占用缓慢增长,重则直接引发程序崩溃或死锁,尤其是…

2026/8/11 14:56:35 阅读更多 →

日新闻

如何用Video2X实现专业级视频画质提升:AI视频增强完整指南

如何用Video2X实现专业级视频画质提升:AI视频增强完整指南

如何用Video2X实现专业级视频画质提升:AI视频增强完整指南 【免费下载链接】video2x A machine learning-based video super resolution and frame interpolation framework. Est. Hack the Valley II, 2018. 项目地址: https://gitcode.com/GitHub_Trending/vi/v…

2026/8/11 0:00:02 阅读更多 →
前后端分离项目中控制台与接口工具数据差异排查指南

前后端分离项目中控制台与接口工具数据差异排查指南

1. 问题现象解析:控制台与Apifox的数据差异 最近在调试一个前后端分离项目时,遇到了一个典型问题:后端服务在本地开发环境控制台能正常输出查询数据,但通过Apifox测试时却返回空结果。这种"控制台有数据,接口工具…

2026/8/11 0:00:03 阅读更多 →
AI编程实战:从Claude Code踩坑到游戏开发入门

AI编程实战:从Claude Code踩坑到游戏开发入门

1. 从“AI能帮我做游戏”到“AI让我重新学编程”最近身边不少朋友,尤其是一些非技术背景、但对游戏开发有浓厚兴趣的朋友,都在问我同一个问题:“听说现在用Claude Code这种AI编程工具,小白也能做游戏了,是真的吗&#…

2026/8/11 0:00:03 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/11 1:08:05 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/11 1:08:05 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/11 1:08:05 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/10 17:07:33 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/11 1:08:06 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/10 17:07:33 阅读更多 →