当前位置: 首页 > news >正文

STM32--SPI通信与W25Q64(1)

文章目录

  • 前言
  • SPI通信
    • 硬件电路
    • 移位过程
  • SPI时序
    • 起始与终止条件
    • 交换一个字节
  • W25Q64
    • 硬件电路
    • 框图
  • FLASH操作注意事项
  • 软件SPI读写W25Q64

前言

USART串口链接入口

I2C通信链接入口

SPI通信

SPI(Serial Peripheral Interface)是一种高速的、全双工、同步的串行通信协议。通常用于连接主控芯片和外围设备,比如传感器、存储器、显示屏等。SPI使用简单,只需要几根线就可以实现进行通信。
在这里插入图片描述

硬件电路

在这里插入图片描述
主要线路:

SCLK(时钟信号):由主设备产生,用于同步数据传输的时钟信号。
MOSI(主设备输出从设备输入):主设备将数据发送给从设备的数据线。
MISO(主设备输入从设备输出):从设备将数据发送给主设备的数据线。
SS/CS(片选信号):由主设备控制,用于选择要进行通信的特定设备。

上图中,主机连接着多个从机,但在通信时,只能对一个从机进行SPI通信,会通过选定的从机的片选信号SS从高电平置于低电平(其他没有选中的保持高电平)让主机与其通信。

移位过程

在这里插入图片描述
由于有两条传输数据线,所以SPI通信能做到同时进行发送数据和接收数据的特点。

主机和从机都由主机的波特率发生器控制着时钟信号,实现同步的传输。

首先主机会将移位寄存器的高位通过MOSI数据线传送到从机的移位寄存器的最低位;同时,从机的移位寄存器的最高位会通过MISO数据线传送到主机移位寄存器的最低位。两个移位寄存器将最高位的数据传出之后,移位寄存器就会进行向右移位,因此最低位也会腾出空间,让主机的最高位数据放到从机的最低位,从机的最低位数据放到主机的最低位。以此循环八次,就能将一个字节的数据进行转换了
在这里插入图片描述

SPI时序

起始与终止条件

起始条件:SS从高电平切换到低电平
终止条件:SS从低电平切换到高电平
在这里插入图片描述
这是片选信号,高低电平的切换代表SPI时序的开始和结束。

交换一个字节

交换一个字节(模式0)
CPOL=0:空闲状态时,SCK为低电平
CPHA=0:SCK第一个边沿移入数据,第二个边沿移出数据
在这里插入图片描述
对于SPI通信,由于是同时进行数据传输,所以称之为字节的交换。
交换字节有4个模式,不同之处就在于空闲状态SCK是高电平还是低电平;还有一个从SCK的第一个边沿还是第二个边沿移入数据,这里将介绍模式0的交换,其他同理。

首先这里说的移入数据和移出数据,是指数据的移出会先放在MOSI数据线或者是MISO数据线上,通过一定的时间再把数据放入对方的最低位。所以,只有先移出数据,才能移入数据。
而这里的却从SCK的第一个边沿就移入数据,是因为主机和从机在SS的低边沿就进行将数据移出到MOSI和MISO上,所以会在SCK的高边沿就进行数据的移入,到了SCK的低边沿就将数据移出,依次重复八次,就将一个字节交换成功了

其他模式
交换一个字节(模式1)
CPOL=0:空闲状态时,SCK为低电平
CPHA=1:SCK第一个边沿移出数据,第二个边沿移入数据
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
这是主机向选定的从机发送一个0x06的信号,由于对于从机发送的内容不关心,所以默认为0xFF。所以一般情况下,只有我们选择读取从机的数据,MISO的数据线才会有波形变化。

W25Q64

W25Q64是一款由华邦公司推出的大容量SPI FLASH产品,其容量为64Mb(8MB)。它属于W25Q系列器件,相比普通的串行闪存硬件,在灵活性和性能方面也有更出色的表现。
W25Q64可以用于存储图片数据,字库数据、音频数据以及保存设备运行日志文件等。
该芯片将8M字节的容量分为128块,每个块包含16个扇区,每个扇区有4K字节。支持双路和四路SPI接口,具有较高的数据传输速率。
在这里插入图片描述
存储介质:Nor Flash(闪存)
时钟频率:80MHz / 160MHz (Dual SPI) / 320MHz (Quad SPI)

硬件电路

在这里插入图片描述

引脚功能
VCC、GND电源(2.7~3.6V)
CS(SS)SPI片选
CLK(SCK)SPI时钟
DI(MOSI)SPI主机输出从机输入
DO(MISO)SPI主机输入从机输出
WP写保护
HOLD数据保持

看黄色部分即可,左边是外部引脚接口,右边是芯片电路;

在引脚名上加上一横线表示接通时默认为低电平,VCC与GND连接时会有一个滤波电容进行滤波,还并联一个指示灯表示是否已经通电

HOLD数据保持:相当一个暂停键;当你写入数据一半时,要在别的设备使用SPI通信,那么在当前设备你就可以触发HOLD,当前设备的SPI时序就会保持静止,你就可以使用SPI对别的设备进行使用,当回到当前设备时,HOLD解除,会从禁止的SPI时序进行恢复。

WP写保护:可以通过设置特殊的写保护位来防止数据被修改。有助于保护重要数据免受意外的写操作。

框图

在这里插入图片描述
上面一大部分就是存储区间,将8M字节的容量分为128块,每个块包含16个扇区,每个扇区有4K字节。每个扇区还包括16个的页区,每个页区有256字节,页是最小单位。

而写入和读取都由左下角的SPI命令与控制逻辑的黑盒进行控制;
接着看到上面,是写逻辑和状态寄存器,可以通过状态寄存器来判断是否已经写入数据;
通过高压发电机来对数据进行擦除;
下面是页地址锁存器和字节地址锁存器,会对块区间通过行解码和列解码,可以判定你在哪个页区进行写入和读出;
块区域的下面是一个256字节页缓冲区,数据写入需要一定的时间,会通过缓冲区来进行缓冲。

FLASH操作注意事项

写入操作时
写入操作前,必须先进行写使能
每个数据位只能由1改写为0,不能由0改写为1
写入数据前必须先擦除,擦除后,所有数据位变为1
擦除必须按最小擦除单元进行(扇区)
连续写入多字节时,最多写入一页的数据,超过页尾位置的数据,会回到页首覆盖写入
写入操作结束后,芯片进入忙状态,不响应新的读写操作
读取操作时
直接调用读取时序,无需使能,无需额外操作,没有页的限制,读取操作结束后不会进入忙状态,但不能在忙状态时读取

软件SPI读写W25Q64

OLED代码链接入口

连接方式:
在这里插入图片描述
将数据存储在W25Q64中,通过断电测试它的存储功能;

大体思路:实现SPI通信的时序条件,接着利用SPI通信实现W25Q64时序,最后在主程序实现对FLASH的测试

MySPI.c

#include "stm32f10x.h"                  // Device header//片选电平
void MySPI_W_SS(uint8_t Byte)
{GPIO_WriteBit(GPIOA,GPIO_Pin_4,(BitAction)Byte);
}
//时钟电平
void MySPI_W_SCK(uint8_t Byte)
{GPIO_WriteBit(GPIOA,GPIO_Pin_5,(BitAction)Byte);
}
//主机发送到从机
void MySPI_W_MOSI(uint8_t Byte)
{GPIO_WriteBit(GPIOA,GPIO_Pin_7,(BitAction)Byte);
}
//从机发送到主机
uint8_t MySPI_R_MISO()
{return GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6);
}//初始化
void MySPI_Init()
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //推挽输出GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_7;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; //上拉输入GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);MySPI_W_SS(1);MySPI_W_SCK(0);
}
//开始
void MySPI_Start()
{MySPI_W_SS(0);
}
//结束
void MySPI_Stop()
{MySPI_W_SS(1);
}
//交换字节
uint8_t MySPI_SwapByte(uint8_t SendByte)
{uint8_t ReceiveByte=0x00,i;for(i=0;i<8;i++){MySPI_W_MOSI(SendByte&(0x80>>i)); //主发送字节MySPI_W_SCK(1);if(MySPI_R_MISO()==1)ReceiveByte|=(0x80>>i); //主接收字节MySPI_W_SCK(0);}return ReceiveByte;
}

MySPI.h

#ifndef __MYSPI_H__
#define __MYSPI_H__void MySPI_Init();
void MySPI_Start();
void MySPI_Stop();
uint8_t MySPI_SwapByte(uint8_t SendByte);#endif

W25Q64_Ins.h

#ifndef __W25Q64_INS_H
#define __W25Q64_INS_H#define W25Q64_WRITE_ENABLE							0x06
#define W25Q64_WRITE_DISABLE						0x04
#define W25Q64_READ_STATUS_REGISTER_1				0x05
#define W25Q64_READ_STATUS_REGISTER_2				0x35
#define W25Q64_WRITE_STATUS_REGISTER				0x01
#define W25Q64_PAGE_PROGRAM							0x02
#define W25Q64_QUAD_PAGE_PROGRAM					0x32
#define W25Q64_BLOCK_ERASE_64KB						0xD8
#define W25Q64_BLOCK_ERASE_32KB						0x52
#define W25Q64_SECTOR_ERASE_4KB						0x20
#define W25Q64_CHIP_ERASE							0xC7
#define W25Q64_ERASE_SUSPEND						0x75
#define W25Q64_ERASE_RESUME							0x7A
#define W25Q64_POWER_DOWN							0xB9
#define W25Q64_HIGH_PERFORMANCE_MODE				0xA3
#define W25Q64_CONTINUOUS_READ_MODE_RESET			0xFF
#define W25Q64_RELEASE_POWER_DOWN_HPM_DEVICE_ID		0xAB
#define W25Q64_MANUFACTURER_DEVICE_ID				0x90
#define W25Q64_READ_UNIQUE_ID						0x4B
#define W25Q64_JEDEC_ID								0x9F
#define W25Q64_READ_DATA							0x03
#define W25Q64_FAST_READ							0x0B
#define W25Q64_FAST_READ_DUAL_OUTPUT				0x3B
#define W25Q64_FAST_READ_DUAL_IO					0xBB
#define W25Q64_FAST_READ_QUAD_OUTPUT				0x6B
#define W25Q64_FAST_READ_QUAD_IO					0xEB
#define W25Q64_OCTAL_WORD_READ_QUAD_IO				0xE3#define W25Q64_DUMMY_BYTE							0xFF#endif

W25Q64.h

#ifndef __W25Q64_H__
#define __W25Q64_H__void W25Q64_Init();
void W25Q64_ReadID(uint8_t* HID,uint16_t* SID);
void W25Q64_ReadData(uint32_t Address,uint8_t* DataArray,uint16_t Count);
void W25Q64_SectorErase(uint32_t Address);
void W25Q64_PageProgram(uint32_t Address,uint8_t* DataArray,uint16_t Count);#endif

W25Q64.c

#include "stm32f10x.h"                  // Device header
#include "W25Q64_Ins.h"
#include "MySPI.h"//初始化
void W25Q64_Init()
{MySPI_Init();
}
//读ID
void W25Q64_ReadID(uint8_t* HID,uint16_t* SID)
{MySPI_Start();MySPI_SwapByte(W25Q64_JEDEC_ID);*HID=MySPI_SwapByte(W25Q64_DUMMY_BYTE);*SID=MySPI_SwapByte(W25Q64_DUMMY_BYTE);*SID<<=8;*SID|=MySPI_SwapByte(W25Q64_DUMMY_BYTE);MySPI_Stop();
}
//写使能
void W25Q64_WriteEnable()
{MySPI_Start();MySPI_SwapByte(W25Q64_WRITE_ENABLE);MySPI_Stop();
}
//等待忙状态
void W25Q64_WaitBusy()
{MySPI_Start();MySPI_SwapByte(W25Q64_READ_STATUS_REGISTER_1);uint32_t count=10000;while((MySPI_SwapByte(W25Q64_DUMMY_BYTE)&0x01)==0x01||count){count--;}MySPI_Stop();
}
//页编程
void W25Q64_PageProgram(uint32_t Address,uint8_t* DataArray,uint16_t Count)
{W25Q64_WriteEnable();uint16_t i;MySPI_Start();MySPI_SwapByte(W25Q64_PAGE_PROGRAM);MySPI_SwapByte(Address<<16);MySPI_SwapByte(Address<<8);MySPI_SwapByte(Address);for(i=0;i<Count;i++){MySPI_SwapByte(DataArray[i]);}MySPI_Stop();W25Q64_WaitBusy();
}
//扇区擦除
void W25Q64_SectorErase(uint32_t Address)
{W25Q64_WriteEnable();MySPI_Start();MySPI_SwapByte(W25Q64_SECTOR_ERASE_4KB);MySPI_SwapByte(Address<<16);MySPI_SwapByte(Address>>8);MySPI_SwapByte(Address);MySPI_Stop();W25Q64_WaitBusy();
}
//读数据
void W25Q64_ReadData(uint32_t Address,uint8_t* DataArray,uint16_t Count)
{uint16_t i;MySPI_Start();MySPI_SwapByte(W25Q64_READ_DATA);MySPI_SwapByte(Address<<16);MySPI_SwapByte(Address>>8);MySPI_SwapByte(Address);for(i=0;i<Count;i++){DataArray[i]=MySPI_SwapByte(W25Q64_DUMMY_BYTE);}MySPI_Stop();
}

对于W25Q64来说,需要先对不同的操作先写入对应的地址,
在这里插入图片描述
在这里插入图片描述

然后根据手册,写入地址和内容;

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "Buzzer.h"
#include "W25Q64.h"
#include "OLED.h"uint8_t HID;
uint16_t SID;uint8_t ArrayWrite[]={0xAA,0xBB,0xCC,0xDD};
uint8_t ArrayRead[4];
int main()
{OLED_Init();W25Q64_Init();OLED_ShowString(1, 1, "MID:   DID:");OLED_ShowString(2, 1, "W:");OLED_ShowString(3, 1, "R:");W25Q64_ReadID(&HID,&SID);OLED_ShowHexNum(1,5,HID,2);OLED_ShowHexNum(1,12,SID,4);W25Q64_SectorErase(0x000100);W25Q64_PageProgram(0x000000,ArrayWrite,4);W25Q64_ReadData(0x000000,ArrayRead,4);OLED_ShowHexNum(2, 3, ArrayWrite[0], 2);OLED_ShowHexNum(2, 6, ArrayWrite[1], 2);OLED_ShowHexNum(2, 9, ArrayWrite[2], 2);OLED_ShowHexNum(2, 12, ArrayWrite[3], 2);OLED_ShowHexNum(3, 3, ArrayRead[0], 2);OLED_ShowHexNum(3, 6, ArrayRead[1], 2);OLED_ShowHexNum(3, 9, ArrayRead[2], 2);OLED_ShowHexNum(3, 12, ArrayRead[3], 2);while(1){}
}

可以通过改变擦除的地址和页编程的地址,以及存储的内容;来进行验证FLASH的注意事项。

相关文章:

STM32--SPI通信与W25Q64(1)

文章目录 前言SPI通信硬件电路移位过程 SPI时序起始与终止条件交换一个字节 W25Q64硬件电路框图 FLASH操作注意事项软件SPI读写W25Q64 前言 USART串口链接入口 I2C通信链接入口 SPI通信 SPI&#xff08;Serial Peripheral Interface&#xff09;是一种高速的、全双工、同步的串…...

版本控制工具Git常见用法

Git 是一个非常强大和灵活的版本控制工具&#xff0c;提供了许多命令和功能来管理代码的版本、分支、合并等。以下是一些 Git 的详细用法&#xff1a; 配置相关命令&#xff1a; 设置用户名和邮箱&#xff1a; git config --global user.name "Your Name" git conf…...

Multisim软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 Multisim软件是一款电路仿真和设计软件&#xff0c;由美国国家仪器公司&#xff08;National Instruments&#xff09;开发。它提供了一个交互式的图形界面&#xff0c;使用户能够轻松地构建和仿真电路。以下是Multisim软件的详…...

【android12-linux-5.1】【ST芯片】HAL移植后开机卡死

按照ST的官方readme移植HAL后开机一直卡在android界面&#xff0c;看logcat提示写文件时errorcode&#xff1a;-13。查下资料大致明白13错误码是权限不足&#xff0c;浏览代码在写文件的接口加日志后&#xff0c;发现是需要写iio:device*/buffer/enable这类文件的时候报错的。千…...

线程池也就那么一回事嘛!

线程池详讲 一、线程池的概述二、线程池三、自定义线程池四、线程池工作流程图五、线程池应用场景 一、线程池的概述 线程池其实就是一种多线程处理形式&#xff0c;处理过程中可以将任务添加到队列中&#xff0c;然后在创建线程后自动启动这些任务。这里的线程就是我们前面学过…...

设计模式(11)观察者模式

一、概述&#xff1a; 1、定义&#xff1a;观察者模式定义了一种一对多的依赖关系&#xff0c;让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象&#xff0c;使它们能够自动更新自己。 2、结构图&#xff1a; public interface S…...

开源的安全性:挑战与机会

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…...

wireshark 流量抓包例题重现

[TOC](这里写目录标题 wireshark抓包方法wireshark组成 wireshark例题 wireshark抓包方法 wireshark组成 wireshark的抓包组成为&#xff1a;分组列表、分组详情以及分组字节流。 上面这一栏想要显示&#xff0c;使用&#xff1a;CtrlF 我们先看一下最上侧的搜索栏可以使用的…...

Smartbi电子表格软件版本更新,首次推出Excel轻应用和语音播放

Smartbi电子表格软件又又又更新啦&#xff01; 此次更新&#xff0c;首次推出了新特性——Excel轻应用和语音播报。另外&#xff0c;还对产品功能、Demo示例、配套文档进行了完善和迭代。 低代码开发Excel轻应用 可实现迅速发布web应用 业务用户的需求往往都处于“解决问题”…...

ElasticSearch简介、安装、使用

一、什么是ElasticSearch&#xff1f; Elasticsearch 是 Elastic Stack 核心的分布式搜索和分析引擎。 Logstash 和 Beats 有助于收集、聚合和丰富您的数据并将其存储在 Elasticsearch 中。 Kibana 使您能够以交互方式探索、可视化和分享对数据的见解&#xff0c;并管理和监…...

Navicat 连接 mysql 问题

需要将mysql配置文件设置为远程任意ip可登陆&#xff0c;注释掉一下两行配置 # bind-address>->--- 127.0.0.1 # mysqlx-bind-address>-- 127.0.0.1Cant connect to MySQL server on "192.168.137.139 (10013 "Unknown error") 检查Navicat是否联网H…...

Adobe Media Encoder软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 Adobe Media Encoder是一款由Adobe公司开发的视频和音频后期制作软件&#xff0c;它集成了多种编码格式和输出选项&#xff0c;可以帮助用户将视频和音频文件转换成适合各种用途的格式。该软件可以与Adobe Premiere Pro、After …...

[C#][原创]操作注册表一些注意点

C#注册表只需要引入 using Microsoft.Win32; C#注册表操作都是通过2个类Registry和RegistryKey进行所有操作。但是有些基本注意事项经常忘记&#xff0c;不常用就很容易忘记。 第一&#xff0c;打开注册表&#xff0c;第2个bool参数问题&#xff1a; RegistryKey key Regi…...

“华为杯”研究生数学建模竞赛2016年-【华为杯】C题:基于无线通信基站的室内三维定位问题

目录 摘 要: 一、问题的重述 1.1 问题背景 1.2 具体要求 1.3 数据分析...

双目视觉之-棋盘格标定板制作

棋盘格设计地址&#xff1a; https://markhedleyjones.com/projects/calibration-checkerboard-collection 包括A0&#xff0c;A1&#xff0c;A2&#xff0c;A3和A4多种规格的棋盘格标定板&#xff0c;支持自定义设置棋盘格grid宽度和高度。 基于Matlab的双目视觉标定流程和O…...

自然对数底e的一些事

自然对数底e的一些事 走的人多了就成了路 中国清代数学家李善兰&#xff08;1811—1882&#xff09; 凡此变数中函彼变数者&#xff0c;则此为彼之函数 自然对数底也是使用习惯 &#x1f349; 李善兰把function翻译为函数&#xff0c;函就是包含&#xff0c;含有变量&#xff…...

React Hooks 全解:零基础入门

Hooks 的由来 你还在为该使用无状态组件&#xff08;Function&#xff09;还是有状态组件&#xff08;Class&#xff09;而烦恼吗&#xff1f; ——拥有了hooks&#xff0c;你再也不需要写Class了&#xff0c;你的所有组件都将是Function。 你还在为搞不清使用哪个生命周期钩…...

webrtc在js里的实现

WebRTC&#xff08;Web Real-Time Communication&#xff09;是一项开放的浏览器技术&#xff0c;它允许浏览器之间建立点对点&#xff08;peer-to-peer&#xff09;连接&#xff0c;实现音频、视频、文件的传输和通信。它的实现一般需要使用JavaScript语言。 在JavaScript中&…...

熊猫:完整的初学者指南

pandas&#xff1a;完整的初学者指南 一、说明 在你的Python开发人员或数据科学之旅中&#xff0c;你可能已经多次遇到“熊猫”这个词&#xff0c;但仍然需要弄清楚它的作用。以及数据和熊猫之间的关系。所以让我向你解释一下。 根据最新估计&#xff0c;每天创建 328.77 亿 TB…...

【Go】Go语言并发编程:原理、实践与优化

在当今的计算机世界&#xff0c;多核处理器和并发编程已经成为提高程序执行效率的关键。Go语言作为一门极富创新性的编程语言&#xff0c;凭借其强大的并发能力&#xff0c;在这方面表现出色。本文将深入探讨Go语言并发编程的原理&#xff0c;通过实际代码示例展示其应用&#…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

PHP 8.5 即将发布:管道操作符、强力调试

前不久&#xff0c;PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5&#xff01;作为 PHP 语言的又一次重要迭代&#xff0c;PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是&#xff0c;借助强大的本地开发环境 ServBay&am…...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋

随着工业以太网的发展&#xff0c;其高效、便捷、协议开放、易于冗余等诸多优点&#xff0c;被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口&#xff0c;具有实时性、开放性&#xff0c;使用TCP/IP和IT标准&#xff0c;符合基于工业以太网的…...

归并排序:分治思想的高效排序

目录 基本原理 流程图解 实现方法 递归实现 非递归实现 演示过程 时间复杂度 基本原理 归并排序(Merge Sort)是一种基于分治思想的排序算法&#xff0c;由约翰冯诺伊曼在1945年提出。其核心思想包括&#xff1a; 分割(Divide)&#xff1a;将待排序数组递归地分成两个子…...

渗透实战PortSwigger Labs指南:自定义标签XSS和SVG XSS利用

阻止除自定义标签之外的所有标签 先输入一些标签测试&#xff0c;说是全部标签都被禁了 除了自定义的 自定义<my-tag onmouseoveralert(xss)> <my-tag idx onfocusalert(document.cookie) tabindex1> onfocus 当元素获得焦点时&#xff08;如通过点击或键盘导航&…...

SQL注入篇-sqlmap的配置和使用

在之前的皮卡丘靶场第五期SQL注入的内容中我们谈到了sqlmap&#xff0c;但是由于很多朋友看不了解命令行格式&#xff0c;所以是纯手动获取数据库信息的 接下来我们就用sqlmap来进行皮卡丘靶场的sql注入学习&#xff0c;链接&#xff1a;https://wwhc.lanzoue.com/ifJY32ybh6vc…...

高保真组件库:开关

一:制作关状态 拖入一个矩形作为关闭的底色:44 x 22,填充灰色CCCCCC,圆角23,边框宽度0,文本为”关“,右对齐,边距2,2,6,2,文本颜色白色FFFFFF。 拖拽一个椭圆,尺寸18 x 18,边框为0。3. 全选转为动态面板状态1命名为”关“。 二:制作开状态 复制关状态并命名为”开…...