FPGA模块——SPI协议(读写FLASH)

FPGA模块——SPI协议(读写FLASH)

  • (1)FLASH芯片 W25Q16BV
  • (2)SPI协议
  • (3)芯片部分命令
    • 1.Write Enable(06h)
    • 2.Chip Erase (C7h / 60h)
    • 3.写指令(02h)
    • 4.读指令(03h)
  • (4)代码
    • 1. FPGA做主机的SPI协议
    • 2. SPI协议的使用

(1)FLASH芯片 W25Q16BV

芯片引脚图:
在这里插入图片描述

内部结构图:
存储区域总共分成了32块,每块64KB。每块又分成了16个部分,每个部分4KB。方便进行读取和局部操作。
在这里插入图片描述
电路设计
在这里插入图片描述

(2)SPI协议

SPI的四种模式
在这里插入图片描述

这里使用这个模式:
主机和从机在时钟上升沿放入要输出的数据,在时钟下降沿读取要输入的数据。
8个时钟后交换一个字节8位数据(高位在前)。
在这里插入图片描述

(3)芯片部分命令

有个输入时序的要求 开始时CS拉低等待(tSLCH要求最小5ns)再开始, 结束时CS拉高等待(tSHSL用100ns )再进行下一次操作。
在这里插入图片描述

这个寄存器的第一位数据可以判断操作是否完成(BUSY位)
在这里插入图片描述

1.Write Enable(06h)

写使能:开始时CS拉低等待(tSLCH要求最小5ns)再开始,结束时CS拉高等待(tSHSL取100ns )再进行下一次操作。
在这里插入图片描述

2.Chip Erase (C7h / 60h)

整片擦除,要判断操作是否完成
在这里插入图片描述

3.写指令(02h)

数据写多了会把之前的数据覆盖掉,要判断操作是否完成。
在这里插入图片描述

4.读指令(03h)

要判断操作是否完成
在这里插入图片描述

(4)代码

1. FPGA做主机的SPI协议

在这里插入图片描述
对信号进行同步和提前准备:
100m时钟和clk_cnt配合进行数据的读取和输出(clk_cnt有等于1和0的时候)
spi_clk基于100m时钟输出一个相当于clk_cnt的延时半个周期的时钟,确保输入输出数据稳定。

module spi_drive(input             clk_100m      ,input             sys_rst_n     ,//user interfaceinput             spi_start     ,//spi开启使能。input [7:0 ]      spi_cmd       ,//FLAH操作指令input [23:0]      spi_addr      ,//FLASH地址input [7:0 ]      spi_data      ,//FLASH写入的数据input [3:0 ]      cmd_cnt       ,output            idel_flag_r   ,//空闲状态标志的上升沿 output reg        w_data_req    ,//FLASH写数据请求 output reg [7:0]  r_data        ,//FLASH读出的数据output reg        erro_flag     ,//读出的数据错误标志//spi interfaceoutput reg        spi_cs        ,//SPI从机的片选信号,低电平有效。output reg        spi_clk       ,//主从机之间的数据同步时钟。output reg        spi_mosi      ,//数据引脚,主机输出,从机输入。input             spi_miso       //数据引脚,主机输入,从机输出。);//状态机
parameter IDLE         =4'd0;//空闲状态
parameter WEL          =4'd1;//写使能状态
parameter S_ERA        =4'd2;//扇区擦除状态
parameter C_ERA        =4'd3;//全局擦除
parameter READ         =4'd4;//读状态
parameter WRITE        =4'd5;//写状态
parameter R_STA_REG    =4'd6;//指令集
parameter WEL_CMD      =8'h06;
parameter S_ERA_CMD    =8'h20;
parameter C_ERA_CMD    =8'hc7;
parameter READ_CMD     =8'h03;
parameter WRITE_CMD    =8'h02;
parameter R_STA_REG_CMD=8'h05;//wire define
wire      idel_flag;//reg define
reg[3:0]  current_state  ;
reg[3:0]  next_state     ;
reg[7:0 ] data_buffer    ;
reg[7:0 ] cmd_buffer     ;
reg[7:0 ] sta_reg        ;
reg[23:0] addr_buffer    ;
reg[31:0] bit_cnt        ;
reg       clk_cnt        ;
reg       dely_cnt       ;
reg[31:0] dely_state_cnt ;
reg[7:0 ] rd_data_buffer ;
reg       spi_clk0       ;
reg       stdone         ;
reg[7:0 ] data_check     ;
reg       idel_flag0     ;
reg       idel_flag1     ;//*****************************************************
//**                    main code
//*****************************************************//*抓取上升沿
assign idel_flag=(current_state==IDLE)?1:0;//空闲状态标志
assign idel_flag_r=idel_flag0&&(~idel_flag1);//空闲状态标志的上升沿//*抓取上升沿要用的
always @(posedge clk_100m or negedge sys_rst_n )beginif(!sys_rst_n)beginidel_flag0<=1'b1;idel_flag1<=1'b1;endelse beginidel_flag0<=idel_flag;idel_flag1<=idel_flag0;end
end//请求数据 + 把数据放入buffer 
always @(posedge clk_100m or negedge sys_rst_n )beginif(!sys_rst_n)w_data_req<=1'b0;else if((bit_cnt+2)%8==0&&bit_cnt>=30&&clk_cnt==0&&current_state==WRITE) //提前2个时钟周期w_data_req<=1'b1;elsew_data_req<=1'b0;
endalways @(posedge clk_100m or negedge sys_rst_n )begin//读出的数据移位寄存if(!sys_rst_n)rd_data_buffer<=8'd0;else if(bit_cnt>=32&&bit_cnt<=2080&&clk_cnt==0&&current_state==READ)									rd_data_buffer<={rd_data_buffer[6:0],spi_miso};elserd_data_buffer<=rd_data_buffer;
endalways @(posedge clk_100m or negedge sys_rst_n )begin//检查读出的数据是否正确if(!sys_rst_n)data_check<=8'd0;else if(bit_cnt%8==0&&bit_cnt>=40&&clk_cnt==1&&current_state==READ)data_check<=data_check+1'd1;elsedata_check<=data_check;
endalways @(posedge clk_100m or negedge sys_rst_n )begin//读出的数据if(!sys_rst_n)r_data<=8'd0;else if(bit_cnt%8==0&&bit_cnt>38&&clk_cnt==1&&current_state==READ)r_data<=rd_data_buffer;elser_data<=r_data;
endalways @(posedge clk_100m or negedge sys_rst_n )begin//读出的数据错误标志if(!sys_rst_n)erro_flag<=1'd0;else if(bit_cnt>32&&bit_cnt<=2080&&current_state==READ&&cmd_cnt==6)beginif(data_check!=r_data)erro_flag<=1'd1;elseerro_flag<=erro_flag;endelseerro_flag<=erro_flag;
end//*把数据放入buffer 提前一个周期
always @(posedge clk_100m or negedge sys_rst_n )beginif(!sys_rst_n)data_buffer<=8'd0;else if((bit_cnt+1)%8==0&&bit_cnt>30&&clk_cnt==1)//*把数据放入buffer 提前一个周期data_buffer<=spi_data;else if(clk_cnt==1&&current_state==WRITE&&bit_cnt>=32)data_buffer<={data_buffer[6:0],data_buffer[7]};elsedata_buffer<=data_buffer;
end//*----位移cmd指令存储器 开始:cs选中且dely未生效,提前了100mhz的周期------------
//使50mhz时数据提前半个周期获得
always @(posedge clk_100m or negedge sys_rst_n )beginif(!sys_rst_n)cmd_buffer<=8'd0;else if(spi_cs==0&&dely_cnt==0)cmd_buffer<=spi_cmd;else if(clk_cnt==1&&(current_state==WEL||current_state==S_ERA||current_state==C_ERA||current_state==READ||current_state==WRITE||current_state==R_STA_REG)&&bit_cnt<8)cmd_buffer<={cmd_buffer[6:0],1'b1};elsecmd_buffer<=cmd_buffer;
end//取出地址每一位
always @(posedge clk_100m or negedge sys_rst_n )beginif(!sys_rst_n)addr_buffer<=8'd0;else if(spi_cs==0&&dely_cnt==0)addr_buffer<=spi_addr;else if(clk_cnt==1&&(current_state==READ||current_state==WRITE)&&bit_cnt>=8&&bit_cnt<32)addr_buffer<={addr_buffer[22:0],addr_buffer[23]};elseaddr_buffer<=addr_buffer;
end//------------使能后clk_cnt输出50M时钟用于操作信号--------------
always @(posedge clk_100m or negedge sys_rst_n )beginif(!sys_rst_n)clk_cnt<=1'd0;else if(dely_cnt==1)clk_cnt<=clk_cnt+1'd1;else clk_cnt<=1'd0;
end//*---------cs选中器件后的信号输出的  dely_cnt 可以认为是使能操作------------
always @(posedge clk_100m or negedge sys_rst_n )beginif(!sys_rst_n)dely_cnt<=1'd0;else if(spi_cs==0)beginif(dely_cnt<1)dely_cnt<=dely_cnt+1'd1;elsedely_cnt<=dely_cnt;endelsedely_cnt<=1'd0;
end//*-----------------结束的延时计时器------------------------------------
always @(posedge clk_100m or negedge sys_rst_n )beginif(!sys_rst_n)dely_state_cnt<=1'd0;else if(spi_cs)beginif(dely_state_cnt<400000000)dely_state_cnt<=dely_state_cnt+1'd1;elsedely_state_cnt<=dely_state_cnt;endelsedely_state_cnt<=1'd0;
end//*-------------------------bit读写计数---------------------
always @(posedge clk_100m or negedge sys_rst_n )beginif(!sys_rst_n)bit_cnt<=11'd0;else if(dely_cnt==1)beginif(clk_cnt==1'b1)bit_cnt<=bit_cnt+1'd1;elsebit_cnt<=bit_cnt;endelsebit_cnt<=11'd0;
end

状态机 :每个状态该干什么,怎么转移
修改里面的命令和转态就可以移植到其他的地方了。

//三段式状态机
always @(posedge clk_100m or negedge sys_rst_n )beginif(!sys_rst_n)current_state<=IDLE;elsecurrent_state<=next_state;
endalways @(*)begincase(current_state)IDLE: beginif(spi_start&&spi_cmd==WEL_CMD)next_state=WEL;else if(spi_start&&spi_cmd==C_ERA_CMD)next_state=C_ERA;else if(spi_start&&spi_cmd==S_ERA_CMD)next_state=S_ERA;else if(spi_start&&spi_cmd==READ_CMD)next_state=READ;else if(spi_start&&spi_cmd==WRITE_CMD)next_state=WRITE;else if(spi_start&&spi_cmd==R_STA_REG_CMD)next_state=R_STA_REG;elsenext_state=IDLE;endWEL: beginif(stdone&&bit_cnt>=8)next_state=IDLE;elsenext_state=WEL;endS_ERA: beginif(stdone)next_state=IDLE;elsenext_state=S_ERA;endC_ERA: begin		if(stdone)next_state=IDLE;elsenext_state=C_ERA;endREAD: begin 		if(stdone&&bit_cnt>=8)next_state=IDLE;elsenext_state=READ;endWRITE: begin		if(stdone&&bit_cnt>=8)next_state=IDLE;elsenext_state=WRITE;endR_STA_REG: begin		if(stdone)next_state=IDLE;elsenext_state=R_STA_REG;enddefault: next_state=IDLE;			endcase				
endalways @(posedge clk_100m or negedge sys_rst_n )beginif(!sys_rst_n) beginspi_cs<=1'b1;spi_clk<=1'b0;spi_clk0<=1'b0;spi_mosi<=1'b0;	stdone<=1'b0;		endelse begincase(current_state)IDLE: beginspi_cs<=1'b1;spi_clk<=1'b0;spi_mosi<=1'b0;				endWEL: beginstdone<=1'b0;spi_cs<=1'b0;if(dely_cnt==1&&bit_cnt<8) begin						spi_clk0<=~spi_clk0;spi_clk<=spi_clk0;spi_mosi<=cmd_buffer[7];endelse if(bit_cnt==8&&clk_cnt==0)beginstdone<=1'b1;spi_clk<=1'b0;						spi_mosi<=1'b0;						endelse if(bit_cnt==8&&clk_cnt==1)beginspi_cs<=1'b1;						endendC_ERA: beginstdone<=1'b0;if(dely_state_cnt==10)                spi_cs<=1'b0;else if(dely_cnt==1&&bit_cnt<8) begin						spi_clk0<=~spi_clk0;spi_clk<=spi_clk0;spi_mosi<=cmd_buffer[7];endelse if(bit_cnt==8&&clk_cnt==0)beginstdone<=1'b1;				    spi_clk<=1'b0;spi_mosi<=1'b0;	endelse if(bit_cnt==8&&clk_cnt==1)beginspi_cs<=1'b1;						endendS_ERA: beginstdone<=1'b0;				 if(dely_state_cnt==10)                spi_cs<=1'b0;else if(dely_cnt==1&&bit_cnt<8) begin						spi_clk0<=~spi_clk0;spi_clk<=spi_clk0;spi_mosi<=cmd_buffer[7];endelse if(bit_cnt>=8&&bit_cnt<32&&spi_cs==0)beginspi_cs<=1'b0;spi_clk0<=~spi_clk0;spi_clk<=spi_clk0;spi_mosi<=addr_buffer[23];endelse if(bit_cnt==32&&clk_cnt==0) beginspi_cs<=1'b1;spi_clk<=1'b0;spi_mosi<=1'b0;stdone<=1'b1;endendREAD: beginstdone<=1'b0;if(dely_state_cnt==10)                spi_cs<=1'b0;else if(dely_cnt==1&&bit_cnt<8) begin						spi_clk0<=~spi_clk0;spi_clk<=spi_clk0;spi_mosi<=cmd_buffer[7];endelse if(bit_cnt>=8&&bit_cnt<32&&spi_cs==0)begin					    spi_clk0<=~spi_clk0;spi_clk<=spi_clk0;spi_mosi<=addr_buffer[23];endelse if(bit_cnt>=32&&bit_cnt<2080)begin						spi_clk0<=~spi_clk0;spi_clk<=spi_clk0;spi_mosi<=1'b0;						endelse if(bit_cnt==2080&&clk_cnt==0) begin						spi_clk<=1'b0;spi_mosi<=1'b0;stdone<=1'b1;						endelse if(bit_cnt==2080&&clk_cnt==1) beginspi_cs<=1'b1;endendWRITE: beginstdone<=1'b0;if(dely_state_cnt==10)                spi_cs<=1'b0;else if(dely_cnt==1&&bit_cnt<8) begin						spi_clk0<=~spi_clk0;spi_clk<=spi_clk0;spi_mosi<=cmd_buffer[7];endelse if(bit_cnt>=8&&bit_cnt<32&&spi_cs==0)begin					   spi_clk0<=~spi_clk0;spi_clk<=spi_clk0;spi_mosi<=addr_buffer[23];endelse if(bit_cnt>=32&&bit_cnt<2080)begin						spi_clk0<=~spi_clk0;spi_clk<=spi_clk0;spi_mosi<=data_buffer[7];endelse if(bit_cnt==2080&&clk_cnt==0) beginspi_clk<=1'b0;spi_mosi<=1'b0;stdone<=1'b1;endelse if(bit_cnt==2080&&clk_cnt==1) beginspi_cs<=1'b1;endendR_STA_REG:begin				              stdone<=1'b0;if(dely_state_cnt==10)                spi_cs<=1'b0;else if(dely_cnt==1&&bit_cnt<8)begin						spi_clk0<=~spi_clk0;spi_clk<=spi_clk0;spi_mosi<=cmd_buffer[7];endelse if(bit_cnt==8)begin					   				    spi_clk0<=~spi_clk0;spi_clk<=spi_clk0;spi_mosi<=1'b0;						end                      				 else if(~spi_miso&&bit_cnt%8==0)beginspi_clk<=1'b0;spi_cs<=1'b1;stdone<=1'b1;endelse if(~spi_cs&&dely_cnt==1)beginspi_clk0<=~spi_clk0;spi_clk<=spi_clk0;end	   			         	 end default: beginstdone<=1'b0;spi_cs<=1'b1;spi_clk<=1'b0;spi_clk0<=1'b0;spi_mosi<=1'b0;				        endendcaseend
endendmodule

2. SPI协议的使用

首先系统开始运行,来几个周期延伸。
spi_start信号只是一个周期脉冲。
idel_flag_r是进入空闲状态的标志位也就是意味着上一步操作完成。
cmd计数指令不断加来切换不同的命令。
spi_cmd 输出命令

module flash_rw(input            sys_clk      ,input            sys_rst_n    ,input            idel_flag_r  ,input            w_data_req   ,output reg[3:0 ] cmd_cnt      ,output reg       spi_start    ,//spi开启使能。output reg[7:0 ] spi_cmd      ,output reg[7:0 ] spi_data      );//指令集
parameter WEL_CMD      =16'h06;
parameter S_ERA_CMD    =16'h20;
parameter C_ERA_CMD    =16'hc7;
parameter READ_CMD     =16'h03;
parameter WRITE_CMD    =16'h02;
parameter R_STA_REG_CMD=8'h05 ;//reg define
reg[3:0] flash_start;//SPI 要写入的数据
always @(posedge sys_clk or negedge sys_rst_n )beginif(!sys_rst_n)flash_start<=0;else if(flash_start<=5)flash_start<=flash_start+1;elseflash_start<=flash_start;
endalways @(posedge sys_clk or negedge sys_rst_n )beginif(!sys_rst_n)cmd_cnt<=0;else if(flash_start==4)spi_start<=1'b1;else if(idel_flag_r&&cmd_cnt<10)begincmd_cnt<=cmd_cnt+1;spi_start<=1'b1;endelse begincmd_cnt<=cmd_cnt;spi_start<=1'b0;end
endalways @(posedge sys_clk or negedge sys_rst_n )beginif(!sys_rst_n)spi_data<=8'd0;else if(w_data_req)spi_data<=spi_data+1'b1;elsespi_data<=spi_data;
endalways @(*)begincase(cmd_cnt)0:spi_cmd=WEL_CMD;1:spi_cmd=C_ERA_CMD;2:spi_cmd=R_STA_REG_CMD;3:spi_cmd=WEL_CMD;4:spi_cmd=WRITE_CMD;5:spi_cmd=R_STA_REG_CMD;6:spi_cmd=READ_CMD;7:spi_cmd=WEL_CMD;8:spi_cmd=S_ERA_CMD;9:spi_cmd=R_STA_REG_CMD;10:spi_cmd=READ_CMD;default:;endcase
endendmodule

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/169735.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3.前端--HTML标签2【2023.11.25】

1.HTML常用标签(文本图像链接&#xff09; 文本标签 标题 <h1> - <h6> 段落<p> 我是一个段落标签 </p> 换行 <br /> <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta ht…

js无法请求后端接口,别的都可以?

在每个接口的控制器中加入以下代码即可&#xff1a; header(Access-Control-Allow-Methods:*); header("Access-Control-Allow-Origin:*"); 如果嫌麻烦可以添加在api初始函数里面

全面(16万字)深入探索深度学习:基础原理到经典模型网络的全面解析

前言 Stacking(堆叠) 网页调试 学习率&#xff1a;它决定了模型在每一次迭代中更新参数的幅度激活函数-更加详细 激活函数的意义: 激活函数主要是让模型具有非线性数据拟合的能力&#xff0c;也就是能够对非线性数据进行分割/建模 如果没有激活函数&#xff1a; 第一个隐层: l…

jpom学习

jpom学习 整理jpom 一键安装 部署会需要 mvn跟jdk环境 # 安装服务端和 jdk、maven 环境 yum install -y wget && \ wget -O install.sh https://jpom.top/docs/install.sh && \ bash install.sh Server jdkmvndocker安装 安装docker挂载方式安装 docker …

2023.11.23 云服务器实现 Spring Boot 项目文件上传并访问

环境介绍 云服务器&#xff1a;京东云云服务器系统&#xff1a; CentOS 7.9JDK 版本&#xff1a;1.8Spring Boot 版本&#xff1a;2.7.17 具体步骤 步骤一 首先我们得先创建一个 Spring Boot 项目 创建如下目录结构 关于如何创建一个 Spring Boot 项目 请点击下方链接详细了解 …

【Linux】驱动程序同步和异步通知方式

一、应用程序APP&#xff0c;访问驱动程序/dev/input/enent1流程&#xff1a; 假设用户程序直接访问 /dev/input/event0 设备节点&#xff0c;或者使用 tslib 访问设备节点&#xff0c;数据的流程如下&#xff1a; APP 发起读操作&#xff0c;若无数据则休眠&#xff1b;用户操…

【Linux】 sudo命令使用

sudo sudo是linux系统管理指令&#xff0c;是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具&#xff0c;如halt&#xff0c;reboot&#xff0c;su等等。这样不仅减少了root用户的登录 和管理时间&#xff0c;同样也提高了安全性。sudo不是对shell的一个代替…

AVD黑屏

启动android studio的AVD后&#xff0c;无法开启&#xff0c;一直处于黑屏状态 【解决方案】 1.点击 Android Virtual Device Manager中avd后面的编辑按钮 2.点击Show Advanced Settings按钮 3.找到Boot option中的Cold boot并选中 4.重启AVD

【nacos】配置使用

nacos配置 遇见的问题 代码启动成功&#xff0c;但是配置文件未生效 观察报错 无报错&#xff0c;也看到了加载的配置文件路径&#xff0c;但是配置未生效 [main] [TID: N/A] c.a.c.n.refresh.NacosContextRefresher : [Nacos Config] Listening config: dataIda-servi…

leetcode刷题:17.电话号码的字母组合

leetcode原题网页 题目描述&#xff1a;给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 思路&#xff1a;使用vector&#x…

P12 C++静态关键字static

目录 01 前言 02 静态变量static 03 extern关键字 04 静态函数 最后的话 01 前言 static 关键字在 C 中有两个意思&#xff0c;这个取决于上下文。 第一种情况是在类或结构体外部使用 static 关键字&#xff0c;另一种是在类或者结构体内部使用 static。 类外面的 static…

2023.11.25更新关于mac开发APP(flutter)的笔记与整理(实机开发一)

我自己写的笔记很杂&#xff0c;下面的笔记是我在chatgpt4的帮助下完成的&#xff0c;希望可以帮到正在踩坑mac开发APP&#xff08;flutter&#xff09;的小伙伴 目标&#xff1a;通过MAC电脑使用flutter框架开发一款适用于苹果手机的一个APP应用 本博客的阅读顺序是&#xf…

[Docker]十.Docker Swarm讲解

一.Dokcer Swarm集群介绍 1.Dokcer Swarm 简介 Docker Swarm 是 Docker 公司推出的用来管理 docker 集群的工具&#xff0c; 使用 Docker Swarm 可以快速方便的实现 高可用集群 ,Docker Compose 只能编排单节点上的容器, Docker Swarm 可以让我们在单一主机上操作来完成对 整…

C语言—二维数组

一、二维数组的创建 int arr[3][4];char arr[3][5];double arr[2][4]; 数组创建&#xff1a;“[ ]”中要给一个常量&#xff0c;不能使用变量 二、二维数组的初始化 int arr[3][4]{1,2,3,4};int arr[3][4]{{1,2},{4,5}};int arr[][4]{{2,3},{4,5}}; 前面的为行&#xff0c…

『亚马逊云科技产品测评』活动征文|低成本搭建物联网服务器thingsboard

授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 Developer Centre, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道。 0. 环境 - ubuntu22&#xff08;注意4G内存勉强够&#xff0c;部署完…

『Postman入门万字长文』| 从工具简介、环境部署、脚本应用、Collections使用到接口自动化测试详细过程

『Postman入门万字长文』| 从工具简介、环境部署、脚本应用、Collections使用到接口自动化测试详细过程 1 Postman工具简介2 Postman安装3 Postman界面说明4 一个简单请求4.1 请求示例4.2 请求过程 5 Postman其他操作5.1 import5.2 History5.3 Environment5.4 Global5.5 其他变…

使用信息面板沟通研发工作

凌鲨里面的内容面板里面有专门针对研发团队的白板功能&#xff0c;它可以把文档&#xff0c;图片&#xff0c;软件设计&#xff0c;需求&#xff0c;任务/缺陷等相关研发要素串接起来。 使用 你还可以调整背景颜色。 引用项目内数据 点击面板中的连接会在右侧打开对应内容

不要再往下翻了,你要的女宝穿搭我都有哦

分享女儿的睡衣穿搭 清新自然的浪漫紫 一眼就击中了我的心巴 软糯亲肤上身体验感超赞 轻松自在无束缚 防风又保暖&#xff0c;居家外出都可哦

基于C#实现Kruskal算法

这篇我们看看第二种生成树的 Kruskal 算法&#xff0c;这个算法的魅力在于我们可以打一下算法和数据结构的组合拳&#xff0c;很有意思的。 一、思想 若存在 M{0,1,2,3,4,5}这样 6 个节点&#xff0c;我们知道 Prim 算法构建生成树是从”顶点”这个角度来思考的&#xff0c;然…

c语言内存管理

通常程序访问的是虚拟内存&#xff0c;虚拟内存映射到物理内存的一小部分。 在Linux系统中&#xff0c;虚拟内存默认为4G的大小。每个进程都有独立的4G内存地址空间。 int main() {char s[] "hello world"; //s数组位于栈区&#xff0c;复制了一份字符串到数组里ch…