7系列FPGA动态配置

Xilinx 7系列FPGA GTX DRP配置避坑指南:从手册到实战,搞定SRIO速率动态调节 本文深入解析Xilinx 7系列FPGA GTX DRP配置在SRIO速率动态调节中的五大核心难题,包括DRP地址映射、MMCM DRP地址陷阱、时钟与速率切换的原子操作、DRP总线握手隐藏规则及链路训练细节。通过实战案例和调试技巧,帮助工程师避开手册未提及的陷阱,实现稳定的SRIO速率动态调节。 阅读详情
AI摘要

本文介绍AMD FPGA配置相关内容。因项目中发现FPGA配置很重要,尤其是动态配置。7系列芯片配置步骤通用,在线更新和动态配置需准备两个固件。还介绍了IPROG命令、WBSTAR寄存器、命令顺序、数据位交换等内容,最后给出重启模块代码及参考文章。

        由于之前在基础学习阶段不太重视FPGA的配置,但是在做项目过程中发现需要特别关注这部分内容,而且FPGA自带的配置会给最终设备的操作提供很多便利,尤其是动态配置(通俗讲就是可以做到不断电重启),所以这一篇介绍AMD FPGA此部分内容。

       虽然每个系列配置接口都不同,但7系列芯片的配置步骤步骤对于所有芯片都是相同的。如果需要做到在线更新以及动态配置,一般需要准备两个固件,Golden Image(Base Address)和Multiboot Image(Upper Address)。首先,Golden Image从Base Address加载,接下来,Golden Image将触发要加载的MultiBoot Image。如果在Upper Address加载Multiboot Image时出错,将从Base Address加载Golden Image。

        IPROG命令是PROGRAM_B引脚功能的一个子集。IPROG命令不会擦除用于启动多启动和回退的WBSTAR、计时器、BSPI和引导寄存器。IPROG命令触发初始化,当发出IPROG命令并尝试配置时,INIT和DONE都变为Low。该命令可以通过用户逻辑控制ICAPE2发出IPROG命令。这允许用户逻辑重新配置芯片。

        WBSTAR(热启动启动地址)寄存器保存配置控制器在发出IPROG命令后使用的地址。这个寄存器可以从bit流中加载,或从ICAPE2中加载。如果在bit流中没有设置寄存器,则加载它的默认值为0。因此,在Golden Image设置WBSTAR值并启动MultiBoot Image后。在通电时,设备向闪灯发出读取命令,然后发出一个开始地址为0。在加载WBSTAR命令并发出IPROG命令后,配置控制器从WBSTAR地址指定的地址发出读取命令。

命令的顺序:

        在配置逻辑接收到IPROG命令后,FPGA将重置除专用重配置逻辑之外的所有内容,并且INIT_B和DONE引脚变低。在FPGA清除所有配置内存后,INIT_B再次启动。然后将WBSTAR中的值用于起始地址。该配置模式决定了哪些引脚是由WBSTAR控制的。

写入数据需要进行位交换,无论数据的方向如何,每个字节的MSB都指向D0位:

  • 在数据的位交换版本中,进入D0的位是最正确的位;
  • 在非位交换的数据中,到达D0的位是最左边的位;

        数据是否必须进行位交换,这完全依赖于应用程序。位交换适用于Serial, SelectMAP, 或者BPI PROM files文件,以及ICAPE2接口。

 重启模块代码

/* 
 * file			: multiboot_ctrl.v
 * author		: 今朝无言
 * Lab			: WHU-EIS-LMSWE
 * date			: 2023-11-30
 * version		: v1.0
 * description	: ICAP 原语实现程控 multiboot(多重启动),K7需要使用 ICAPE2 原语
 * Copyright © 2023 WHU-EIS-LMSWE, All Rights Reserved.
 */
`default_nettype none
module Multiboot_Ctrl(
input	wire			clk,
input	wire			rst_n,

input	wire			multiboot_start,	//触发Multiboot, 上升沿有效
input	wire	[31:0]	multiboot_addr,		//要启动的Muliboot Image的起始地址

output	reg				busy
);

//-------------------ICAPE2原语-----------------------------
wire			ICAPE2_CLK;
wire	[31:0]	ICAPE2_O;
reg				ICAPE2_CSIB;
wire	[31:0]	ICAPE2_I;
reg				ICAPE2_RDWRB;

assign	ICAPE2_CLK	= clk;

ICAPE2 #(
     .DEVICE_ID			(32'h362D093),	// Specifies the pre-programmed Device ID value to be used for simulation purposes. K7-325T的为32'h3651093
     .ICAP_WIDTH		("X32"),		// Specifies the input and output data width.
     .SIM_CFG_FILE_NAME	("NONE")		// Specifies the Raw Bitstream (RBT) file to be parsed by the simulation model.
)
ICAPE2_inst(
     .O					(ICAPE2_O),		// 32-bit output: Configuration data output bus
     .CLK				(ICAPE2_CLK),	// 1-bit input: Clock Input
     .CSIB				(ICAPE2_CSIB),	// 1-bit input: Active-Low ICAP Enable
     .I					(ICAPE2_I),		// 32-bit input: Configuration data input bus
     .RDWRB				(ICAPE2_RDWRB)	// 1-bit input: Read/Write Select input    1对应rd,0对应wr
);

wire	[31:0]	Dummy		= 32'hFFFFFFFF;
wire	[31:0]	Sync_Word	= 32'hAA995566;
wire	[31:0]	NOOP		= 32'h20000000;
wire	[31:0]	WR_WBSTAR	= 32'h30020001;

/*When using ICAPE2 to set the WBSTAR address, the 24 most significant address bits should be written
  to WBSTAR[23:0]. For SPI 32-bit addressing mode, WBSTAR[23:0] are sent as address bits [31:8]. The
  lower 8 bits of the address are undefined and the value could be as high as 0xFF. Any bitstream
  at the WBSTAR address should contain 256 dummy bytes before the start of the bitstream.*/
wire	[31:0]	WBSTAR		= {3'b000, 5'h0, multiboot_addr[31:8]};

wire	[31:0]	WR_CMD		= 32'h30008001;
wire	[31:0]	IPROG		= 32'h0000000F;

//ICAPE2位翻转
reg		[31:0]	wrdat;
assign	ICAPE2_I	= {wrdat[24], wrdat[25], wrdat[26], wrdat[27], wrdat[28], wrdat[29], wrdat[30], wrdat[31], 
					   wrdat[16], wrdat[17], wrdat[18], wrdat[19], wrdat[20], wrdat[21], wrdat[22], wrdat[23], 
					   wrdat[8], wrdat[9], wrdat[10], wrdat[11], wrdat[12], wrdat[13], wrdat[14], wrdat[15], 
					   wrdat[0], wrdat[1], wrdat[2], wrdat[3], wrdat[4], wrdat[5], wrdat[6], wrdat[7]};

//------------------------FSM----------------------------------
localparam	S_IDLE			= 16'h0001;
localparam	S_DUMMY			= 16'h0002;
localparam	S_SYN_WORD		= 16'h0004;
localparam	S_NOOP1			= 16'h0008;
localparam	S_WR_WBSTAR		= 16'h0010;
localparam	S_WBSTAR		= 16'h0020;
localparam	S_WR_CMD		= 16'h0040;
localparam	S_IPROG			= 16'h0080;
localparam	S_NOOP2			= 16'h0100;
localparam	S_STOP			= 16'h0200;

wire	multiboot_start_pe;
reg		multiboot_start_d0;
reg		multiboot_start_d1;

assign	multiboot_start_pe	= multiboot_start_d0 & (~multiboot_start_d1);

always @(posedge clk) begin
	multiboot_start_d0		<= multiboot_start;
	multiboot_start_d1		<= multiboot_start_d0;
end

reg		[15:0]	state		= S_IDLE;
reg		[15:0]	next_state;

always @(posedge clk) begin
	if(~rst_n) begin
		state	<= S_IDLE;
	end
	else begin
		state	<= next_state;
	end
end

always @(*) begin
	case(state)
	S_IDLE: begin
		if(multiboot_start_pe) begin
			next_state	<= S_DUMMY;
		end
		else begin
			next_state	<= S_IDLE;
		end
	end
	S_DUMMY:		next_state	<= S_SYN_WORD;
	S_SYN_WORD:		next_state	<= S_NOOP1;
	S_NOOP1:		next_state	<= S_WR_WBSTAR;
	S_WR_WBSTAR:	next_state	<= S_WBSTAR;
	S_WBSTAR:		next_state	<= S_WR_CMD;
	S_WR_CMD:		next_state	<= S_IPROG;
	S_IPROG:		next_state	<= S_NOOP2;
	S_NOOP2:		next_state	<= S_STOP;
	S_STOP:			next_state	<= S_IDLE;
	default:		next_state	<= S_IDLE;
	endcase
end

always @(posedge clk) begin
	case(state)
	S_IDLE: begin
		wrdat			<= 32'd0;
		ICAPE2_CSIB		<= 1'b1;
		ICAPE2_RDWRB	<= 1'b1;
	end
	S_DUMMY: begin
		wrdat			<= Dummy;
		ICAPE2_CSIB		<= 1'b0;
		ICAPE2_RDWRB	<= 1'b0;
	end
	S_SYN_WORD: begin
		wrdat			<= Sync_Word;
		ICAPE2_CSIB		<= 1'b0;
		ICAPE2_RDWRB	<= 1'b0;
	end
	S_NOOP1: begin
		wrdat			<= NOOP;
		ICAPE2_CSIB		<= 1'b0;
		ICAPE2_RDWRB	<= 1'b0;
	end
	S_WR_WBSTAR: begin
		wrdat			<= WR_WBSTAR;
		ICAPE2_CSIB		<= 1'b0;
		ICAPE2_RDWRB	<= 1'b0;
	end
	S_WBSTAR: begin
		wrdat			<= WBSTAR;
		ICAPE2_CSIB		<= 1'b0;
		ICAPE2_RDWRB	<= 1'b0;
	end
	S_WR_CMD: begin
		wrdat			<= WR_CMD;
		ICAPE2_CSIB		<= 1'b0;
		ICAPE2_RDWRB	<= 1'b0;
	end
	S_IPROG: begin
		wrdat			<= IPROG;
		ICAPE2_CSIB		<= 1'b0;
		ICAPE2_RDWRB	<= 1'b0;
	end
	S_NOOP2: begin
		wrdat			<= NOOP;
		ICAPE2_CSIB		<= 1'b0;
		ICAPE2_RDWRB	<= 1'b0;
	end
	S_STOP: begin
		wrdat			<= 32'd0;
		ICAPE2_CSIB		<= 1'b1;
		ICAPE2_RDWRB	<= 1'b1;
	end
	default: begin
		wrdat			<= 32'd0;
		ICAPE2_CSIB		<= 1'b1;
		ICAPE2_RDWRB	<= 1'b1;
	end
	endcase
end

always @(*) begin
	case(state)
	S_IDLE:		busy	<= 1'b0;
	default:	busy	<= 1'b1;
	endcase
end

endmodule

顶层文件: 

//生成2个点灯的程序,使用ICAP来回切换这两个Image
//本工程作为 Golden Image 存入地址 0
`default_nettype none
module Top(
input	wire			clk_sys,	//OXCO_10M
input   wire 			sys_rst_n,

input	wire	[1:0]	Key,
output	wire	[3:0]	LED
);


reg [31:0]start_cnt;
reg start_en;
always@(posedge clk_sys)begin
	if(!sys_rst_n)begin
		start_cnt <= 32'd0;
		start_en <= 0;
	end
	else if(start_cnt == 32'd49_999_999)begin
		start_en <= 1'b1;
	end
	else if(start_en == 1'b0)begin
		start_cnt <=  start_cnt + 1'b1;
	end
end

reg [31:0]reboot_addr;
reg key_sig;
always@(posedge clk_sys)begin
	if(!sys_rst_n)begin
		reboot_addr <= 32'h00400000;
		key_sig <= 1'b0;
	end
	else if(~Key[1])begin
		reboot_addr <= 32'h00000000;
		key_sig <= 1'b1;
	end
	else if(~Key[0])begin
		reboot_addr <= 32'h00400000;
		key_sig <= 1'b1;
	end
end

Multiboot_Ctrl multiboot_ctrl_inst(
	.clk				(clk_sys),
	.rst_n				(1'b1),

	.multiboot_start	(key_sig),
	.multiboot_addr		(reboot_addr),		//加载0x01000000处的Multiboot Image

	.busy				()
);


assign	LED		= (start_en == 1'b0) ? 4'b1100 : 4'b1111;


endmodule

xdc文件内添加的代码: 

set_property CFGBVS VCCO [current_design]
set_property CONFIG_VOLTAGE 3.3 [current_design]
set_property BITSTREAM.GENERAL.COMPRESS true [current_design]
set_property BITSTREAM.CONFIG.CONFIGRATE 50 [current_design]
set_property BITSTREAM.CONFIG.SPI_BUSWIDTH 4 [current_design]
set_property BITSTREAM.CONFIG.SPI_FALL_EDGE Yes [current_design]

参考文章

ug470_7Series_Config.pdf 

K7系列FPGA多重启动(Multiboot)-优快云博客

基于SPI flash的 Multiboot远程更新 xilinx icape2 flash 升级 spi 阅读详情

相关推荐

FPGA中ICAP原语的使用——Multiboot功能的实现

ICAP原语的使用一、杂谈ICAP原语的介绍ICAPE2原语的介绍ICAPE2原语的代码验证结束语 一、杂谈 有一段时间没写博客了,因为从学校回家了。现在正值肺炎流行,不给社会添麻烦,自己在家调调程序看看论文。可是今天写的icap原语在板子上的验证没通过,因为学的是icap原语是用在S6芯片上的,但是因为自己回家没带S6的开发板,这里用7系列的icape2原语进行做实验,虽然板上验证没通过,但是还...

zhangningning1996的博客 2万+

纸上谈兵_FPGA配置_多重加载

.

山音水月 8208

Xilinx 7系列 FPGA 配置时序解析:INIT_B与PROGRAM_B的3种关键应用场景对比

本文深入解析Xilinx 7系列FPGA配置时序,重点探讨INIT_B与PROGRAM_B引脚在三种关键应用场景中的差异与协同工作。通过对比分析常规上电配置、动态重配置和菊花链配置场景,揭示引脚特性对FPGA启动可靠性的影响,并提供实用设计建议和调试技巧,帮助工程师解决实际项目中的配置时序问题。

weixin_30938149的博客 414

K7系列FPGA多重启动(Multiboot)

Xilinx 家的 FPGA 支持多重启动功能(Multiboot),即可以从多个 bin 文件中进行选择性加载,从而实现对系统的动态更新,或系统功能的动态调整。这一过程可以通过嵌入在 bit 文件里的 IPROG 命令实现上电后的自动加载。而同时 Xilinx 也提供了 ICAP 原语,给用户提供了访问配置功能的权限(对于 7 series 的芯片,需要使用 ICAPE2 原语),从而获得更加灵活的多重启动方式。本文即介绍 Multiboot 以及这两种启动方式,并对两种 Multiboot 进行实现。

qq_43557686的博客 1万+

FPGA内部资源(Xilinx) ---- IDELAY(延时)

前言   最近在调试一个源同步的接口,为了时序能够动态调节,需要对输入的数据进行微调。刚好,在Xilinx FPGA中,有用于调整延时的原语。所以记录一下这个原语的使用。 IDELAY   首先看一下手册上是怎么来描述这个原语的。 ...

black_pigeon博客 3万+

别再只查UG470了!FPGA配置时序的隐藏关卡:Init_B引脚的双重角色与外部电路设计精髓

本文深入探讨了7系列FPGA中Init_B引脚的双重角色与系统级设计策略,揭示了其在配置时序中的关键作用。通过分析开漏结构的电气特性和配置状态机的关键转折点,提供了多电源轨协同控制、Flash电压建立保障等实用设计方法,帮助工程师构建更可靠的FPGA系统。

weixin_30505225的博客 559

FPGA时钟设计进阶:Xilinx 7系列动态时钟调整技巧(含AXI4接口配置)

本文深入探讨了Xilinx 7系列FPGA中基于AXI4-Lite接口的动态时钟调整技术。通过配置Clocking Wizard IP核的MMCM/PLL,开发者可在系统运行时动态修改时钟频率、相位及占空比,无需重新编译设计。文章详细解析了动态重配置的原理、安全流程、寄存器映射及驱动开发要点,为构建自适应、可重构的高性能FPGA系统提供了实用指南。

ujm56789012的博客 104

Xilinx 7系列FPGA配置模式深度解析:从MASTER SERIAL到SLAVE SERIAL的实战选择指南

本文深度解析Xilinx 7系列FPGA的多种配置模式,包括MASTER SERIAL、JTAG、MASTER BPI等。通过对比各模式的速度、引脚占用、成本及应用场景,提供实战选择指南,帮助工程师根据项目需求(如独立启动、调试灵活性、配置速度)做出最优决策,并分享硬件设计中的关键避坑经验。

weixin_29290947的博客 276

【INTEL(ALTERA)】Agilex7 M 系列动态重配置FPGA IP接口 PHY Lite 无法校准

Agilex7 M 系列动态重配置FPGA IP接口 PHY Lite 无法校准

sqqwm的专栏 617

[小梅哥FPGA] 如何通过动态重配置实现FPGA时钟的实时频率/相位/占空比调整?

PLL和MMCM是实际存在的硬件电路,用以对输入时钟的负面变化,如抖动、频率变化、相位偏移、占空比失真等进行处理。基于该表,用户在初始化Clk_Wiz后,只需要计算好所需的频率、相位、占空比对应的设置值,使用Xil_Out32函数配置对应寄存器即可。通过上述步骤,在平时的开发调试过程中,亦或是一些对于时钟可能有着实时性要求的设计(如数据采集、图像处理)里,我们便可以在无需重新修改设计的前提下,通过AXI4总线来完成对时钟频率、相位的调控,从而达到缩短设计周期以及让设计适应更多场景的目的。

zgmxs的专栏 2495

FPGA实现串口升级及MultiBoot(六)ICAPE2原语实例讲解

FPGA实现串口升级及MultiBoot(五)通过约束脚本添加IPROG实例中通过配置(bit)文件嵌入IPROG命令,实现最简单,占用资源也最少,但是只能支持一个Update Bit文件。今天通过ICAPE2原语进行控制可以任意指定Flash地址,非常灵活。下一讲我们讲一下ICAPE2的"变形体”-AXI HWICAPIP的使用。

OpenFPGA的博客 2104

FPGA - 7系列 FPGA内部结构之Clocking -03- 时钟管理模块(CMT)

本文节选UG472的第三章,进行整理翻译,用于介绍7系列 FPGA的时钟管理模块的内部结构以及相关用法。本文介绍的CMT在FPGA开发设计中是比较重要的一个内容,因此文章篇幅也相对较长。

Vuko_Coding Zone 4659

UG470中文版实战指南:7系列FPGA配置调试与安全启动全解析

FPGA配置是硬件启动的关键环节,涉及引脚时序、协议帧结构、加密机制与状态监控等底层技术。理解配置原理需深入芯片手册,而UG470作为Xilinx/AMD官方硬件操作规范,定义了Spartan-7、Artix-7等7系列器件的物理层电气约束、SPI/BPI/JTAG协议细节、bitstream帧格式及AES-256加密绑定流程。其技术价值在于将分散的173页硬性规则转化为可执行的调试清单,支撑军工、工控等高可靠场景下的安全启动与MultiBoot设计。本文聚焦UG470中文版v1.17的核心实践要点,涵盖配

weixin_29194255的博客 206

中国航天芯 | 宇航用7系列FPGA整体解决方案

为满足宇航型号对大规模、高性能、高可靠、高安全FPGA应用需求,北京微电子技术研究所提供以7系列FPGA为核心的宇航用整体解决方案,主要器件包括宇航用7系列FPGA、动态重构刷新电路、配置存储器、电平转换电路以及外围接口等。

dpwkj的博客 2882

制造业与工业知识图谱应用

在全球数字化转型背景下,制造业面临创新周期缩短、质量管控精细化等挑战。知识图谱技术通过结构化表示工业知识,为智能制造提供关键技术支撑。工业知识图谱具有专业性强、多源异构数据融合、实时性要求高等特点,其构建流程涵盖本体设计、知识抽取与整合等环节。研究显示,知识图谱与大模型结合可提升工业场景的智能化水平,在设备故障诊断、供应链优化等领域具有显著应用价值。该技术有望成为制造业数字化转型的核心驱动力。

分享一些感兴趣的技术方面 1444

半导体AMHS系统振动控制技术演进:从0.5G到超低振动的工艺革命

在半导体制造进入埃米级时代后,AMHS的振动控制能力将成为区分厂商技术等级的标尺。国内企业通过“弹性机械设计-混合主动控制-智能调度”的三重创新,正逐步突破0.2G阈值,支撑12英寸晶圆厂向3nm/2nm制程升级。未来,振动抑制不再仅是物流系统的性能参数,而是与光刻、刻蚀等核心工艺深度耦合的基础能力,这将重塑半导体设备产业的竞争格局。

m0_60674045的博客 1584

【S029】FPGA动态重配置ICAPE2以及双引导功能实现

UG470 Master-Serial configuration mode Slave-Serial configuration mode Master SelectMAP (parallel) configuration mode (x8 and x16) Slave SelectMAP (parallel) configuration mode (x8, x16, and x32) JTAG/boundary-scan configuration mode Mas...

1615549892 6580

爆肝整理:微信公众号文章HTML编写完整规范,运营必备手册

微信公众号文章排版总是出错?📱 这份完整的HTML编写规范文档帮你彻底解决!文档包含所有支持的标签、CSS属性、实用代码模板和注意事项 📋,让你快速掌握微信文章的HTML编写技巧,告别第三方编辑器依赖 ✅

XiaoqiangClub的博客 2310

Xilinx 7 系列产品部分功能不支持可重配置

最近查看Xilinx FPGA动态重配置功能,差点被坑,因为不是所有器件的所有功能都支持重配置,详见UG909,将7系列产品重配置说明截图贴出。

neufeifatonju的博客 690

Open3D 计算FPFH特征【2025最新版】

FPFH特征描述子的python实现,本文最新更新时间为:2025年3月18日。

点云侠的博客 5275

【2025国赛C题】高教社杯全国大学生数学建模竞赛C题思路+代码+论文

【2025国赛C题】高教社杯全国大学生数学建模竞赛C题思路+代码+论文

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 2903

Xilinx FPGA 重加载 + 动态刷新

本文以Xilinx的v5以及v7系列FPGA为例讲解重加载和动态刷新功能。同时简单描述复旦微FPGA刷新。

leezhiya的博客 2万+

【AI面试】2026 AI Agent 应用开发|应届生简历模板 + 完整学习路线图(校招可直接复用)

很多同学学完 RAG、Agent 之后,不知道简历怎么写,项目写成 “调用大模型 API 实现聊天机器人”,投出去几乎没有面试。AI Agent 应用开发,本质还是软件开发岗位。简历要突出工程能力、踩坑优化、问题解决,不要只堆砌 AI 关键词。注意:本文针对【AI 应用开发 / Agent 应用工程师】本科校招;不适合大模型训练、微调算法岗。AI Agent 应用开发岗位,不是只会写提示词、调用 API 就可以拿到 offer。拥有传统软件工程基本功,同时懂大模型、RAG、Agent 工程落地的开发者。

十年老程序猿,AI 疯狂研究专家,前沿硬核知识分享 304

从MMCM到PLL:手把手教你配置Xilinx-7系列FPGA的时钟管理模块(含DRP动态重配)

本文详细介绍了Xilinx-7系列FPGA中MMCM和PLL时钟管理模块的配置方法,包括基础架构对比、Vivado Clock Wizard的使用技巧以及DRP动态重配置的高级应用。通过实际案例和代码示例,帮助开发者掌握时钟信号的生成、优化和动态调整技术,提升FPGA系统设计的稳定性和灵活性。

weixin_42548888的博客 325

【使用FPGA实现MIPI DSI接口】——如何使用FPGA实现MIPI DSI接口?这是一个让许多开发者都感到困扰的问题。本文将介绍如何使用FPGA设计和实现...

【使用FPGA实现MIPI DSI接口】——如何使用FPGA实现MIPI DSI接口?MIPI DSI(移动产业处理器接口 - 显示串行接口)是一种用于在移动设备中传输视频数据的标准接口,它是目前大部分智能手机和平板电脑所采用的显示接口。首先,我们需要实现MIPI DSI的物理层接口。在实现MIPI DSI接口后,我们还需要编写驱动程序来控制MIPI DSI显示屏显示图像。这里只是提供了MIPI DSI接口的物理层代码示例,完整的MIPI DSI接口实现需要包括控制器和驱动程序等更多内容。

uote_e的博客 1998

vscode中运行gcc -v命令失败了,提示:gcc不是内部或外部命令...如何解决?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!

**My Coding Family** 976
上一篇: AMD FPGA基础结构
下一篇: QSPI驱动学习(N25Q128)
时叶塔
博客等级 码龄10年 37粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值