STM32H743 FMC与FPGA通信
STM32H743 与 FPGA 通过 FMCFlexible Static Memory Controller接口通信是一种高效、常见的异构系统互联方案尤其适用于需要高速、大容量数据交换的场景如工业控制、高速数据采集和信号处理。STM32H743 的 FMC 是一个高度灵活的静态存储器控制器原本设计用于连接 NOR Flash、SRAM、NAND Flash 等存储器。通过将其配置为 SRAM / NOR Flash 模式并连接 FPGA 端的双端口 RAM 或寄存器接口可以实现两者间的并行数据交互。这种方案能让 STM32 像访问内部存储器一样直接通过地址总线读写 FPGA 内的数据延迟极低。硬件连接与配置要点引脚分配通常使用 16 位数据总线、地址总线以及控制信号如片选 NE1、读使能 NOE、写使能 NWE、地址有效 NADV实现连接。电平匹配必须确保 STM32H743 的 FMC 接口电压通常是 3.3V与 FPGA 的 IO 电压兼容。不匹配时需添加电平转换芯片。时序配置FMC 的时序参数如DataSetupTime、AddressSetupTime需根据 FPGA 的响应速度进行配置。时序过紧会导致数据不稳过松则会降低传输速率。关键软件实现与优化地址映射访问STM32 端可将 FPGA 的寄存器映射到 FMC 的地址空间如0x60000000通过宏定义实现便捷的读写操作。#define FPGA_REG(addr) (*(volatile uint16_t *)(0x60000000 | ((addr) 1))) // 写入 FPGA 寄存器 FPGA_REG(0x10) 0xABCD; // 读取 FPGA 寄存器 uint16_t status FPGA_REG(0x11);DMA 传输对于批量数据配合 DMA 使用 FMC 可以大幅降低 CPU 负载实现接近内存到内存的传输效率。MPU 配置是必须的STM32H743 的 Cortex-M7 内核带有缓存直接访问 FMC 地址时可能会因缓存一致性导致数据错乱。必须通过MPU内存保护单元将 FMC 所映射的地址区域配置为Strongly-ordered或Device类型以禁止缓存保证每次读写都直接访问 FPGA 硬件避免数据丢失或错位。FPGA 端逻辑FPGA 端需要实现一个双端口 RAM 作为数据缓冲区并通过地址译码逻辑响应 STM32 的读写请求。同时需注意将 FMC 的异步控制信号同步到 FPGA 的时钟域并对双向数据总线进行三态控制。时序参数怎么算H743 的 HCLK3 最高 240MHzFMC 时钟 HCLK3 / (CLKDivision 1)。通常设 CLKDivision1即 FMC_CLK 120MHz但异步 SRAM 模式实际上不用 FMC_CLK时序完全由 ADDSET/DATAST/BUSTURN 以 HCLK3 周期计算参数含义典型值时间 (HCLK3240MHz)ADDSET地址建立到 NOE/NWE 拉低28.3 nsDATASTNOE/NWE 低电平持续时间4-616.6-25 nsBUSTURN总线恢复读转写或连续读间隔1-24.2-8.3 nsFPGA 端逻辑通常跑 50-100MHz所以 DATAST 至少给 4 个 HCLK3 周期~33ns确保 FPGA 有时间响应。如果 FPGA 逻辑慢用 NWAIT 信号动态插入等待周期。常见踩坑清单数据总线悬空— FPGA 的 data 引脚必须实现三态不读时释放为 z。上面的 Verilog 用assign fmc_data data_drive_en ? read_data_r : 16bz;处理了这个问题。字节对齐— 16 位总线模式下偶地址访问 D[7:0]奇地址访问 D[15:8]。如果你用uint16_t*指针地址必须偶数对齐否则触发 HardFault。Cache 问题— H743 有 D-CacheFMC 地址 0x60000000 默认是 Cacheable 的。如果 FPGA 寄存器值随时变化状态寄存器、FIFO必须把 MPU 把 0x60000000 区域设为 Device 或 Non-Cacheable否则读到的是缓存旧值。__DSB() 屏障— 每次写完 FPGA 寄存器后加__DSB()确保写操作真正到达总线再继续执行后续代码。NWAIT 时序— 如果用 NWAITFMC 需要开启AsynchronousWait FMC_ASYNCHRONOUS_WAIT_ENABLEFPGA 在需要延长时拉低 NWAITFMC 会等待。MDMA/DMA 带宽— 大块数据传输用 MDMA 做 memory-to-memory 搬运比 CPU 逐字写快很多。FMC 的突发写可以达到 ~30-40 MB/s16位120MHz。MPU 配置示例关闭 FMC 区域 Cachevoid MPU_ConfigForFMC(void) { MPU_Region_InitTypeDef MPU_InitStruct {0}; HAL_MPU_Disable(); MPU_InitStruct.Enable MPU_REGION_ENABLE; MPU_InitStruct.BaseAddress 0x60000000; MPU_InitStruct.Size MPU_REGION_SIZE_1MB; MPU_InitStruct.AccessPermission MPU_REGION_FULL_ACCESS; MPU_InitStruct.IsBufferable MPU_ACCESS_NOT_BUFFERABLE; MPU_InitStruct.IsCacheable MPU_ACCESS_NOT_CACHEABLE; // Critical! MPU_InitStruct.IsShareable MPU_ACCESS_SHAREABLE; MPU_InitStruct.Number MPU_REGION_NUMBER0; MPU_InitStruct.TypeExtField MPU_TEX_LEVEL1; MPU_InitStruct.SubRegionDisable 0x00; MPU_InitStruct.DisableExec MPU_INSTRUCTION_ACCESS_DISABLE; HAL_MPU_ConfigRegion(MPU_InitStruct); HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT); }代码示例/** * STM32H743 FMC FPGA communication example * FMC configured as SRAM mode, 16-bit data bus, Bank1 NE1 * * Memory map: * Bank1 NE1 base address: 0x6000_0000 * FPGA register space: 0x6000_0000 ~ 0x600F_FFFF (1MB) * * HCLK3 240 MHz, FMC clock HCLK3 / (divider1) * With divider1 (FMC prescaler /2), FMC_CLK 120 MHz */ #include stm32h7xx_hal.h #include string.h /* * FPGA register address definitions * */ /* Bank1, NE1 base address (defined by STM32H743 FMC memory map) */ #define FPGA_BASE_ADDR 0x60000000U /* FPGA internal register offsets (word offset, each 2 bytes since 16-bit bus) */ #define FPGA_REG_ID 0x00 /* Read-only: FPGA firmware ID */ #define FPGA_REG_CTRL 0x02 /* Control register */ #define FPGA_REG_STATUS 0x04 /* Status register */ #define FPGA_REG_DATA_LEN 0x06 /* Data length */ #define FPGA_REG_DATA_PORT 0x08 /* Data FIFO port (read/write) */ #define FPGA_REG_IRQ_EN 0x0A /* Interrupt enable */ #define FPGA_REG_VERSION 0x0C /* Firmware version */ /* Register pointer macros */ #define FPGA_REG(off) (*(volatile uint16_t *)(FPGA_BASE_ADDR (off))) /* * FMC GPIO initialization * D0-D15, A0-A18, NE1, NOE, NWE, NBL0, NBL1, NWAIT * */ static void FMC_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct {0}; __HAL_RCC_GPIOD_CLK_ENABLE(); __HAL_RCC_GPIOE_CLK_ENABLE(); __HAL_RCC_GPIOF_CLK_ENABLE(); __HAL_RCC_GPIOG_CLK_ENABLE(); __HAL_RCC_GPIOH_CLK_ENABLE(); /* Configure FMC pins: all alternate function, push-pull, speed very high */ GPIO_InitStruct.Mode GPIO_MODE_AF_PP; GPIO_InitStruct.Pull GPIO_PULLUP; GPIO_InitStruct.Speed GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate GPIO_AF12_FMC; /* --- Data bus D0-D15 --- */ /* PD0D0, PD1D1, PD8D8, PD9D9, PD10D10, PD14D14, PD15D15 */ GPIO_InitStruct.Pin GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_14 | GPIO_PIN_15; HAL_GPIO_Init(GPIOD, GPIO_InitStruct); /* PE7D4, PE8D5, PE9D6, PE10D7, PE11D12, PE12D13, PE13D14, PE14D15 */ GPIO_InitStruct.Pin GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14; HAL_GPIO_Init(GPIOE, GPIO_InitStruct); /* PE0NBL0, PE1NBL1 */ GPIO_InitStruct.Pin GPIO_PIN_0 | GPIO_PIN_1; HAL_GPIO_Init(GPIOE, GPIO_InitStruct); /* --- Address bus A0-A18 --- */ /* PF0A0, PF1A1, PF2A2, PF3A3, PF4A4, PF5A5, PF12A6, PF13A7, PF14A8, PF15A9 */ GPIO_InitStruct.Pin GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15; HAL_GPIO_Init(GPIOF, GPIO_InitStruct); /* PG0A10, PG1A11, PG2A12, PG3A13, PG4A14, PG5A15 */ GPIO_InitStruct.Pin GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5; HAL_GPIO_Init(GPIOG, GPIO_InitStruct); /* PG9A16, PG10A17, PG12A18 */ GPIO_InitStruct.Pin GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_12; HAL_GPIO_Init(GPIOG, GPIO_InitStruct); /* --- Control signals --- */ /* PD4NOE, PD5NWE, PD7NE1 */ GPIO_InitStruct.Pin GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_7; HAL_GPIO_Init(GPIOD, GPIO_InitStruct); /* NWAIT input on PD6 (optional) */ GPIO_InitStruct.Pin GPIO_PIN_6; GPIO_InitStruct.Mode GPIO_MODE_INPUT; GPIO_InitStruct.Pull GPIO_PULLUP; HAL_GPIO_Init(GPIOD, GPIO_InitStruct); } /* * FMC SRAM mode initialization * Configured for FPGA communication * */ static void FMC_SRAM_Init(void) { FMC_NORSRAM_TimingTypeDef Timing {0}; __HAL_RCC_FMC_CLK_ENABLE(); /* --- Timing configuration --- * HCLK3 240 MHz, FMC prescaler FMC_NORSRAM_FLASH_ACCESS_NO_DIVIDER * FMC_CLK HCLK3 / 2 120 MHz (8.33 ns per cycle) * * For FPGA at ~50 MHz internal logic, typical safe timing: * ADDSET 2 (16.6 ns address setup) * DATAST 4 (33.3 ns data valid time for FPGA to respond) * BUSTURN 2 (16.6 ns bus turnaround) * * Total read cycle ADDSET DATAST 1 7 cycles ≈ 58 ns * Total write cycle ADDSET DATAST 1 7 cycles ≈ 58 ns */ Timing.AddressSetupTime 2; Timing.AddressHoldTime 1; Timing.DataSetupTime 4; Timing.BusTurnAroundDuration 2; Timing.CLKDivision 1; /* FMC_CLK HCLK3/2 */ Timing.DataLatency 2; Timing.AccessMode FMC_ACCESS_MODE_A; /* SRAM mode A */ hsram.Instance FMC_NORSRAM_DEVICE; hsram.Extended FMC_NORSRAM_EXTENDED_DEVICE; hsram.Init.NSBank FMC_NORSRAM_BANK1; /* Use NE1 */ hsram.Init.DataAddressMux FMC_DATA_ADDRESS_MUX_DISABLE; hsram.Init.MemoryType FMC_MEMORY_TYPE_SRAM; hsram.Init.MemoryDataWidth FMC_NORSRAM_MEM_BUS_WIDTH_16; /* 16-bit */ hsram.Init.BurstAccessMode FMC_BURST_ACCESS_MODE_DISABLE; hsram.Init.WaitSignalPolarity FMC_WAIT_SIGNAL_POLARITY_LOW; hsram.Init.WaitSignalActive FMC_WAIT_TIMING_BEFORE_WS; hsram.Init.WriteOperation FMC_WRITE_OPERATION_ENABLE; hsram.Init.WaitSignal FMC_WAIT_SIGNAL_DISABLE; /* Set ENABLE if using NWAIT */ hsram.Init.ExtendedMode FMC_EXTENDED_MODE_DISABLE; hsram.Init.AsynchronousWait FMC_ASYNCHRONOUS_WAIT_DISABLE; hsram.Init.WriteBurst FMC_WRITE_BURST_DISABLE; hsram.Init.ContinuousClock FMC_CONTINUOUS_CLOCK_SYNC_ASYNC; HAL_SRAM_Init(hsram, Timing, Timing); } /* * High-level FPGA access functions * */ /** * Write a 16-bit value to FPGA register at given offset * param offset Register offset (must be even for 16-bit bus) * param value 16-bit data to write */ void FPGA_WriteReg(uint16_t offset, uint16_t value) { FPGA_REG(offset) value; __DSB(); /* Data Synchronization Barrier - ensure write completes */ } /** * Read a 16-bit value from FPGA register at given offset * param offset Register offset (must be even for 16-bit bus) * return 16-bit data read from FPGA */ uint16_t FPGA_ReadReg(uint16_t offset) { uint16_t val FPGA_REG(offset); __DSB(); return val; } /** * Burst write data block to FPGA * Uses pointer increment for fast transfer * param offset Starting register offset (FIFO port recommended) * param buf Source data buffer * param len Number of 16-bit words to write */ void FPGA_BurstWrite(uint16_t offset, const uint16_t *buf, uint32_t len) { volatile uint16_t *p (volatile uint16_t *)(FPGA_BASE_ADDR offset); for (uint32_t i 0; i len; i) { *p buf[i]; } __DSB(); } /** * Burst read data block from FPGA * param offset Starting register offset (FIFO port recommended) * param buf Destination buffer * param len Number of 16-bit words to read */ void FPGA_BurstRead(uint16_t offset, uint16_t *buf, uint32_t len) { volatile uint16_t *p (volatile uint16_t *)(FPGA_BASE_ADDR offset); for (uint32_t i 0; i len; i) { buf[i] *p; } __DSB(); } /** * Use MDMA for high-speed DMA transfer to FPGA * FMC can be MDMA destination/source in memory-to-memory mode */ void FPGA_MDMA_Write(uint16_t offset, const uint16_t *src, uint32_t len) { /* Configure MDMA channel for memory-to-memory transfer */ /* Source: internal SRAM buffer */ /* Destination: FMC bank1 address (FPGA) */ /* This achieves near-maximum FMC bandwidth */ extern MDMA_HandleTypeDef hmdma_fpga; HAL_MDMA_Start(hmdma_fpga, (uint32_t)src, (uint32_t)(FPGA_BASE_ADDR offset), len * 2, /* byte count */ 128); /* 128-byte block transfer */ /* Wait for transfer complete */ HAL_MDMA_PollForTransfer(hmdma_fpga, HAL_MDMA_FULL_TRANSFER, 1000); } /* * Example: Initialize FPGA and transfer data * */ void FPGA_Example(void) { uint16_t fpga_id; uint16_t tx_buf[256]; uint16_t rx_buf[256]; /* Initialize FMC GPIO and controller */ FMC_GPIO_Init(); FMC_SRAM_Init(); /* Wait for FPGA to be ready */ HAL_Delay(100); /* Read FPGA ID to verify connection */ fpga_id FPGA_ReadReg(FPGA_REG_ID); if (fpga_id ! 0xFPGA) { /* Replace with your expected ID */ /* Handle error: FPGA not responding */ return; } /* Prepare test data */ for (int i 0; i 256; i) { tx_buf[i] (uint16_t)(i 0xFFFF); } /* Write 256 words to FPGA data FIFO */ FPGA_WriteReg(FPGA_REG_DATA_LEN, 256); FPGA_BurstWrite(FPGA_REG_DATA_PORT, tx_buf, 256); /* Trigger processing */ FPGA_WriteReg(FPGA_REG_CTRL, 0x0001); /* Start bit */ __DSB(); /* Wait for done (poll status register) */ while ((FPGA_ReadReg(FPGA_REG_STATUS) 0x01) 0) { /* Timeout handling recommended */ } /* Read back processed data */ FPGA_BurstRead(FPGA_REG_DATA_PORT, rx_buf, 256); /* Verify data integrity */ for (int i 0; i 256; i) { if (rx_buf[i] ! tx_buf[i]) { /* Data mismatch */ } } }

相关新闻

【办公类-110-03】20260822 “闵豆家园”开学信息处理(幼儿:归档、升班、转园、批量添加托班、小班幼儿账号Python,拆分班级幼儿转班改学号;教师:转院区)

【办公类-110-03】20260822 “闵豆家园”开学信息处理(幼儿:归档、升班、转园、批量添加托班、小班幼儿账号Python,拆分班级幼儿转班改学号;教师:转院区)

一、背景需求马上开学,我们使用的幼儿打卡系统闵豆家园发布信息更新通知——把数据发给他们,进行大班归档、小中班升班、托小班建班、托小班幼儿信息导入的批量操作。根据以往经验,1.托小班新生幼儿信息导入提供的是批量导入托小幼儿信息的服…

2026/8/23 23:22:37 阅读更多 →
虚假邮件网络钓鱼侵权的司法认定与组织风控研究

虚假邮件网络钓鱼侵权的司法认定与组织风控研究

摘要伴随着数字化办公深度嵌入医疗机构内部管理流程,伪造电子邮件实施身份冒用、名誉侵害的非传统网络钓鱼行为,已经成为职场侵权的新型风险源。美国宾夕法尼亚州赫希医疗中心涉住院医师伪造邮件侵权诉讼案件,为研究机构内部虚假邮件风险、民…

2026/8/23 23:22:37 阅读更多 →
角膜地形图仪价格战打响:国产Scheimpflug断层杀入9万价位

角膜地形图仪价格战打响:国产Scheimpflug断层杀入9万价位

系列一 价格革命角膜地形图仪价格战打响:国产Scheimpflug断层杀入9万价位2026年,角膜地形图仪市场迎来一个标志性事件——国产Scheimpflug断层设备首次进入9万元价位。光弧医疗 OPV-30 正式上市,打破了"Scheimpflug断层60万"的行业…

2026/8/23 23:22:37 阅读更多 →

最新新闻

开源项目商业化实战:从零到月入9000美元的微型应用开发指南

开源项目商业化实战:从零到月入9000美元的微型应用开发指南

这次我们来看一个对独立开发者和开源项目维护者非常有启发性的案例:一个“微型”开源应用,如何通过巧妙的商业模式和社区运营,实现月入9000美元的稳定收入。这不仅仅是关于代码,更是关于如何将一个开源项目转化为可持续的生意。对…

2026/8/24 5:09:46 阅读更多 →
调用看着还能失败就立刻重试,也不要急着拉满并发:退避、抖动和熔断联动更关键

调用看着还能失败就立刻重试,也不要急着拉满并发:退避、抖动和熔断联动更关键

还能失败重试,不等于该立刻拉满 把「多试几次总能成功」当成可省略退避与抖动的理由,往往会在下游故障时把重试打成风暴:客户端齐步重试、线程池打满、下游更慢,形成正反馈。看起来像在提高成功率,实际在放大故障面。…

2026/8/24 5:09:46 阅读更多 →
剩菜剩饭喂猪违法,最高罚10万!这条新规已正式执行,要注意看了

剩菜剩饭喂猪违法,最高罚10万!这条新规已正式执行,要注意看了

你碗里的红烧肉,可能和这条新规有着你想不到的关系。先说一个让很多人懵圈的消息:以后用剩饭剩菜喂猪,违法了。最高罚10万,情节严重的直接停业关闭。消息一出,全网炸了。有人说:"我家农村养猪&#xf…

2026/8/24 5:09:46 阅读更多 →
认识继电器和接触器

认识继电器和接触器

ESim 电工课堂 零基础学电工 认识继电器和接触器继电器和接触器是电气控制电路的"左膀右臂":一个管信号与逻辑,一个管动力通断。本章从电磁铁原理出发,带你认识它们的结构、符号、类型,并用电工接线模拟仿真软件ESim电…

2026/8/24 5:09:46 阅读更多 →
让AI查业务库,安全边界要跑四次交集

让AI查业务库,安全边界要跑四次交集

请求清洗、服务端授权、Schema检索和SQL复核,是四个不能互相替代的边界。 摘要| 我沿 Microi吾码AI 当前 NL2SQL 链路,从 V8 请求绑定追到角色策略、FormEngine 权限、Schema 检索与 SQL 校验。结论是:提示词不能授予数据权限&…

2026/8/24 5:09:46 阅读更多 →
AI招聘系统技术解析:算力驱动与架构优化

AI招聘系统技术解析:算力驱动与架构优化

1. 项目背景:AI招聘系统的行业现状与痛点2026年的招聘行业正经历一场前所未有的技术变革。作为从业十年的HR科技观察者,我亲眼见证了传统ATS(Applicant Tracking System)从简单的简历筛选工具,逐步演变为具备AI面试、智…

2026/8/24 5:08:42 阅读更多 →

日新闻

前端内容安全与依赖审计实践

前端内容安全与依赖审计实践

前端内容安全与依赖审计实践 前端安全依赖分层防护。没有任何单一配置能替代输出编码、权限校验和依赖更新。 把不可信内容当作数据 默认使用框架的转义能力;确需渲染 HTML 时,先在服务端或可信的客户端库中进行白名单过滤。避免把用户输入直接赋给 inne…

2026/8/24 1:08:15 阅读更多 →
Windows登录密码存储机制全解析:从哈希算法到安全加固实战

Windows登录密码存储机制全解析:从哈希算法到安全加固实战

1. 项目概述:Windows登录密码的“黑匣子”每次你按下CtrlAltDel,输入密码,然后看到那个熟悉的桌面,这背后发生了一系列复杂而精密的操作。作为一名长期与Windows系统打交道的从业者,我经常被问到:“我的密码…

2026/8/24 1:08:15 阅读更多 →
AI面试系统安全挑战与解决方案

AI面试系统安全挑战与解决方案

1. 项目概述:AI面试系统的安全挑战去年参与某跨国企业AI面试系统部署时,遇到一个典型案例:候选人在视频面试中无意提到竞争对手产品名称,系统竟自动将该信息关联到企业知识库并生成竞品分析报告。这个看似"智能"的功能&…

2026/8/24 1:08:15 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/24 0:06:02 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/24 0:20:20 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/24 0:14:11 阅读更多 →

月新闻

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

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

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

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

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

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

2026/8/23 12:10:44 阅读更多 →
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/22 3:22:48 阅读更多 →