【STM32】STM32学习笔记-硬件SPI读写W25Q64(40)
00. 目录
文章目录
- 00. 目录
- 01. SPI简介
- 02. W25Q64简介
- 03. SPI相关API
- 3.1 SPI_Init
- 3.2 SPI_Cmd
- 3.3 SPI_I2S_SendData
- 3.4 SPI_I2S_ReceiveData
- 3.5 SPI_I2S_GetFlagStatus
- 3.6 SPI_I2S_ClearFlag
- 3.7 SPI_InitTypeDef
- 04. 硬件SPI读写W25Q64接线图
- 05. 硬件SPI读写W25Q64示例
- 06. 程序下载
- 07. 附录
01. SPI简介
在大容量产品和互联型产品上,SPI接口可以配置为支持SPI协议或者支持I2S音频协议。SPI接口默认工作在SPI方式,可以通过软件把功能从SPI模式切换到I2S模式。
在小容量和中容量产品上,不支持I2S音频协议。
串行外设接口(SPI)允许芯片与外部设备以半/全双工、同步、串行方式通信。此接口可以被配置成主模式,并为外部从设备提供通信时钟(SCK)。接口还能以多主配置方式工作。
它可用于多种用途,包括使用一条双向数据线的双线单工同步传输,还可使用CRC校验的可靠通信。
I2S也是一种3引脚的同步串行接口通讯协议。它支持四种音频标准,包括飞利浦I2S标准,MSB和LSB对齐标准,以及PCM标准。它在半双工通讯中,可以工作在主和从2种模式下。当它作为主设备时,通过接口向外部的从设备提供时钟信号。
02. W25Q64简介
•W25Qxx系列是一种低成本、小型化、使用简单的非易失性存储器,常应用于数据存储、字库存储、固件程序存储等场景
•存储介质:Nor Flash(闪存)
•时钟频率:80MHz / 160MHz (Dual SPI) / 320MHz (Quad SPI)
•存储容量(24位地址)
03. SPI相关API
3.1 SPI_Init
/*** @brief Initializes the SPIx peripheral according to the specified * parameters in the SPI_InitStruct.* @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral.* @param SPI_InitStruct: pointer to a SPI_InitTypeDef structure that* contains the configuration information for the specified SPI peripheral.* @retval None*/
void SPI_Init(SPI_TypeDef* SPIx, SPI_InitTypeDef* SPI_InitStruct)
功能:根据 SPI_InitStruct 中指定的参数初始化外设 SPIx 寄存器
参数:SPIx:x 可以是 1 或者 2,来选择 SPI 外设SPI_InitStruct:指向结构 SPI_InitTypeDef 的指针,包含了外设 SPI 的配置信息
返回值:无
3.2 SPI_Cmd
/*** @brief Enables or disables the specified SPI peripheral.* @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral.* @param NewState: new state of the SPIx peripheral. * This parameter can be: ENABLE or DISABLE.* @retval None*/
void SPI_Cmd(SPI_TypeDef* SPIx, FunctionalState NewState)
功能:使能或者失能SPI外设
参数:SPIx:x 可以是 1 或者 2,来选择 SPI 外设NewState: 外设 SPIx 的新状态这个参数可以取:ENABLE 或者 DISABLE
返回值:无
3.3 SPI_I2S_SendData
/*** @brief Transmits a Data through the SPIx/I2Sx peripheral.* @param SPIx: where x can be* - 1, 2 or 3 in SPI mode * - 2 or 3 in I2S mode* @param Data : Data to be transmitted.* @retval None*/
void SPI_I2S_SendData(SPI_TypeDef* SPIx, uint16_t Data)
功能:通过外设 SPIx 发送一个数据
参数:SPIx:x 可以是 1 或者 2,来选择 SPI 外设Data: 待发送的数据
返回值:无
3.4 SPI_I2S_ReceiveData
/*** @brief Returns the most recent received data by the SPIx/I2Sx peripheral. * @param SPIx: where x can be* - 1, 2 or 3 in SPI mode * - 2 or 3 in I2S mode* @retval The value of the received data.*/
uint16_t SPI_I2S_ReceiveData(SPI_TypeDef* SPIx)
功能:返回通过 SPIx 最近接收的数据
参数:SPIx:x 可以是 1 或者 2,来选择 SPI 外设
返回值:接收到的字
3.5 SPI_I2S_GetFlagStatus
/*** @brief Checks whether the specified SPI/I2S flag is set or not.* @param SPIx: where x can be* - 1, 2 or 3 in SPI mode * - 2 or 3 in I2S mode* @param SPI_I2S_FLAG: specifies the SPI/I2S flag to check. * This parameter can be one of the following values:* @arg SPI_I2S_FLAG_TXE: Transmit buffer empty flag.* @arg SPI_I2S_FLAG_RXNE: Receive buffer not empty flag.* @arg SPI_I2S_FLAG_BSY: Busy flag.* @arg SPI_I2S_FLAG_OVR: Overrun flag.* @arg SPI_FLAG_MODF: Mode Fault flag.* @arg SPI_FLAG_CRCERR: CRC Error flag.* @arg I2S_FLAG_UDR: Underrun Error flag.* @arg I2S_FLAG_CHSIDE: Channel Side flag.* @retval The new state of SPI_I2S_FLAG (SET or RESET).*/
FlagStatus SPI_I2S_GetFlagStatus(SPI_TypeDef* SPIx, uint16_t SPI_I2S_FLAG)
功能:检查指定的 SPI 标志位设置与否
参数:SPIx:x 可以是 1 或者 2,来选择 SPI 外设SPI_I2S_FLAG:待检查的 SPI 标志位
返回值:SPI_FLAG 的新状态(SET 或者 RESET)
3.6 SPI_I2S_ClearFlag
/*** @brief Clears the SPIx CRC Error (CRCERR) flag.* @param SPIx: where x can be* - 1, 2 or 3 in SPI mode * @param SPI_I2S_FLAG: specifies the SPI flag to clear. * This function clears only CRCERR flag.* @note* - OVR (OverRun error) flag is cleared by software sequence: a read * operation to SPI_DR register (SPI_I2S_ReceiveData()) followed by a read * operation to SPI_SR register (SPI_I2S_GetFlagStatus()).* - UDR (UnderRun error) flag is cleared by a read operation to * SPI_SR register (SPI_I2S_GetFlagStatus()).* - MODF (Mode Fault) flag is cleared by software sequence: a read/write * operation to SPI_SR register (SPI_I2S_GetFlagStatus()) followed by a * write operation to SPI_CR1 register (SPI_Cmd() to enable the SPI).* @retval None*/
void SPI_I2S_ClearFlag(SPI_TypeDef* SPIx, uint16_t SPI_I2S_FLAG)
功能:清除 SPIx 的待处理标志位
参数:SPIx:x 可以是 1 或者 2,来选择 SPI 外设SPI_I2S_FLAG:待清除的 SPI 标志位
返回值:无
3.7 SPI_InitTypeDef
typedef struct
{uint16_t SPI_Direction; /*!< Specifies the SPI unidirectional or bidirectional data mode.This parameter can be a value of @ref SPI_data_direction */uint16_t SPI_Mode; /*!< Specifies the SPI operating mode.This parameter can be a value of @ref SPI_mode */uint16_t SPI_DataSize; /*!< Specifies the SPI data size.This parameter can be a value of @ref SPI_data_size */uint16_t SPI_CPOL; /*!< Specifies the serial clock steady state.This parameter can be a value of @ref SPI_Clock_Polarity */uint16_t SPI_CPHA; /*!< Specifies the clock active edge for the bit capture.This parameter can be a value of @ref SPI_Clock_Phase */uint16_t SPI_NSS; /*!< Specifies whether the NSS signal is managed byhardware (NSS pin) or by software using the SSI bit.This parameter can be a value of @ref SPI_Slave_Select_management */uint16_t SPI_BaudRatePrescaler; /*!< Specifies the Baud Rate prescaler value which will beused to configure the transmit and receive SCK clock.This parameter can be a value of @ref SPI_BaudRate_Prescaler.@note The communication clock is derived from the masterclock. The slave clock does not need to be set. */uint16_t SPI_FirstBit; /*!< Specifies whether data transfers start from MSB or LSB bit.This parameter can be a value of @ref SPI_MSB_LSB_transmission */uint16_t SPI_CRCPolynomial; /*!< Specifies the polynomial used for the CRC calculation. */
}SPI_InitTypeDef;
SPI_Direction
/** @defgroup SPI_data_direction * @{*/#define SPI_Direction_2Lines_FullDuplex ((uint16_t)0x0000)
#define SPI_Direction_2Lines_RxOnly ((uint16_t)0x0400)
#define SPI_Direction_1Line_Rx ((uint16_t)0x8000)
#define SPI_Direction_1Line_Tx ((uint16_t)0xC000)
SPI_Mode
/** @defgroup SPI_mode * @{*/#define SPI_Mode_Master ((uint16_t)0x0104)
#define SPI_Mode_Slave ((uint16_t)0x0000)
#define IS_SPI_MODE(MODE) (((MODE) == SPI_Mode_Master) || \((MODE) == SPI_Mode_Slave))
SPI_DataSize
/** @defgroup SPI_data_size * @{*/#define SPI_DataSize_16b ((uint16_t)0x0800)
#define SPI_DataSize_8b ((uint16_t)0x0000)
SPI_CPOL
/** @defgroup SPI_Clock_Polarity * @{*/#define SPI_CPOL_Low ((uint16_t)0x0000)
#define SPI_CPOL_High ((uint16_t)0x0002)
SPI_CPHA
/** @defgroup SPI_Clock_Phase * @{*/#define SPI_CPHA_1Edge ((uint16_t)0x0000)
#define SPI_CPHA_2Edge ((uint16_t)0x0001)
SPI_NSS
/** @defgroup SPI_Slave_Select_management * @{*/#define SPI_NSS_Soft ((uint16_t)0x0200)
#define SPI_NSS_Hard ((uint16_t)0x0000)
SPI_BaudRatePrescaler
/** @defgroup SPI_BaudRate_Prescaler * @{*/#define SPI_BaudRatePrescaler_2 ((uint16_t)0x0000)
#define SPI_BaudRatePrescaler_4 ((uint16_t)0x0008)
#define SPI_BaudRatePrescaler_8 ((uint16_t)0x0010)
#define SPI_BaudRatePrescaler_16 ((uint16_t)0x0018)
#define SPI_BaudRatePrescaler_32 ((uint16_t)0x0020)
#define SPI_BaudRatePrescaler_64 ((uint16_t)0x0028)
#define SPI_BaudRatePrescaler_128 ((uint16_t)0x0030)
#define SPI_BaudRatePrescaler_256 ((uint16_t)0x0038)
SPI_FirstBit
/** @defgroup SPI_MSB_LSB_transmission * @{*/#define SPI_FirstBit_MSB ((uint16_t)0x0000)
#define SPI_FirstBit_LSB ((uint16_t)0x0080)
SPI_CRCPolynomial
CRC校验值
04. 硬件SPI读写W25Q64接线图

05. 硬件SPI读写W25Q64示例
spi.h
#ifndef __SPI_H__
#define __SPI_H__#include "stm32f10x.h" void spi_init(void);void spi_start(void);void spi_stop(void);uint8_t spi_swap_byte(uint8_t val);#endif /*__SPI_H__*/
spi.c
#include "spi.h"
#include "stm32f10x_spi.h"/*
CS: PA4
CLK: PA5
DO: PA6
DI: PA7
*///SS写 PA4
void spi_W_SS(uint8_t bitval)
{GPIO_WriteBit(GPIOA, GPIO_Pin_4, (BitAction)bitval);
}void spi_init(void)
{GPIO_InitTypeDef GPIO_InitStruct;SPI_InitTypeDef SPI_InitStruct;//使能时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); //A4 CSGPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStruct);//A5 A7 CLK DIGPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStruct);//A6 DOGPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStruct);SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128;SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;SPI_InitStruct.SPI_CRCPolynomial = 7;SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex;SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;SPI_InitStruct.SPI_Mode = SPI_Mode_Master;SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;SPI_Init(SPI1, &SPI_InitStruct);SPI_Cmd(SPI1, ENABLE);spi_W_SS(1);
}void spi_start(void)
{spi_W_SS(0);
}void spi_stop(void)
{spi_W_SS(1);
}uint8_t spi_swap_byte(uint8_t val)
{while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) != SET);SPI_I2S_SendData(SPI1, val);while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) != SET);return SPI_I2S_ReceiveData(SPI1);
}
w25q64.h
#ifndef __W25Q64_H__#define __W25Q64_H__#include "stm32f10x.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 0xFFvoid W25Q64_init(void);void W25Q64_read_id(uint8_t *mid, uint16_t *did);//写使能
void W25Q64_write_enable(void);//等待 直到空闲
void W25Q64_wait_busy(void);void W25Q64_sector_erase(uint32_t addr);void W25Q64_page_program(uint32_t addr, uint8_t *arr, uint16_t len);void W25Q64_read_data(uint32_t addr, uint8_t *arr, uint16_t len);#endif /*__W25Q64_H__*/
w25q64.c
#include "w25q64.h"
#include "spi.h"void W25Q64_init(void)
{spi_init();
}void W25Q64_read_id(uint8_t *mid, uint16_t *did)
{spi_start();spi_swap_byte(W25Q64_JEDEC_ID);*mid = spi_swap_byte(W25Q64_DUMMY_BYTE);*did = spi_swap_byte(W25Q64_DUMMY_BYTE);*did <<= 8;*did |= spi_swap_byte(W25Q64_DUMMY_BYTE);spi_stop();
}void W25Q64_write_enable(void)
{spi_start();spi_swap_byte(W25Q64_WRITE_ENABLE);spi_stop();
}void W25Q64_wait_busy(void)
{uint32_t timeout;spi_start();spi_swap_byte(W25Q64_READ_STATUS_REGISTER_1); timeout = 100000;while((spi_swap_byte(W25Q64_DUMMY_BYTE) & 0x1) == 0x01){timeout--;if (0 == timeout){break;}}spi_stop();
}void W25Q64_page_program(uint32_t addr, uint8_t *arr, uint16_t len)
{uint8_t i;W25Q64_write_enable();spi_start();spi_swap_byte(W25Q64_PAGE_PROGRAM); spi_swap_byte(addr >> 16);spi_swap_byte(addr >> 8);spi_swap_byte(addr); for (i = 0; i < len; i++){spi_swap_byte(arr[i]);}spi_stop();W25Q64_wait_busy();
}void W25Q64_sector_erase(uint32_t addr)
{W25Q64_write_enable();spi_start();spi_swap_byte(W25Q64_SECTOR_ERASE_4KB); spi_swap_byte(addr >> 16);spi_swap_byte(addr >> 8);spi_swap_byte(addr);spi_stop();W25Q64_wait_busy();}void W25Q64_read_data(uint32_t addr, uint8_t *arr, uint16_t len)
{uint8_t i = 0;spi_start();spi_swap_byte(W25Q64_READ_DATA); spi_swap_byte(addr >> 16);spi_swap_byte(addr >> 8);spi_swap_byte(addr);for (i = 0; i < len; i++){arr[i] = spi_swap_byte(W25Q64_DUMMY_BYTE);}spi_stop();
}
main.c
#include "stm32f10x.h"#include "delay.h"
#include "oled.h"
#include "w25q64.h"int main(void){ uint8_t mid;uint16_t did;uint8_t array_w[4] = {0x11, 0x22, 0x33, 0x44};uint8_t array_r[4];//初始化OLED_Init();W25Q64_init();//显示一个字符//OLED_ShowChar(1, 1, 'A');//显示字符串//OLED_ShowString(1, 3, "SPI Test");OLED_ShowString(1, 1, "MID: DID:");OLED_ShowString(2, 1, "W:");OLED_ShowString(3, 1, "R:");W25Q64_read_id(&mid, &did);OLED_ShowHexNum(1, 5, mid, 2);OLED_ShowHexNum(1, 12, did, 4);//擦除扇区W25Q64_sector_erase(0x0);//写扇区W25Q64_page_program(0x0, array_w, 4);//读数据W25Q64_read_data(0x0, array_r, 4);OLED_ShowHexNum(2, 3, array_w[0], 2);OLED_ShowHexNum(2, 6, array_w[1], 2);OLED_ShowHexNum(2, 9, array_w[2], 2);OLED_ShowHexNum(2, 12, array_w[3], 2); OLED_ShowHexNum(3, 3, array_r[0], 2);OLED_ShowHexNum(3, 6, array_r[1], 2);OLED_ShowHexNum(3, 9, array_r[2], 2);OLED_ShowHexNum(3, 12, array_r[3], 2); while(1){}return 0;}
06. 程序下载
31-硬件SPI.rar
07. 附录
参考: 【STM32】江科大STM32学习笔记汇总
相关文章:
【STM32】STM32学习笔记-硬件SPI读写W25Q64(40)
00. 目录 文章目录 00. 目录01. SPI简介02. W25Q64简介03. SPI相关API3.1 SPI_Init3.2 SPI_Cmd3.3 SPI_I2S_SendData3.4 SPI_I2S_ReceiveData3.5 SPI_I2S_GetFlagStatus3.6 SPI_I2S_ClearFlag3.7 SPI_InitTypeDef 04. 硬件SPI读写W25Q64接线图05. 硬件SPI读写W25Q64示例06. 程序…...
防御保护---安全策略
文章目录 目录 一.安全策略概述 概述: 安全策略的作用: 安全策略与传统防火墙的区别 二.案例分析 练习 一.安全策略概述 概述: 防火墙安全策略的作用在于加强网络系统的安全性,保护网络免受恶意攻击、非法访问和数据泄露的威胁。…...
RustDesk私有化部署,自建远程桌面搭建教程
以linux操作系统为例: 解压安装 # 使用wget进行下载1.1.8-2版本(最新版本可以看上述发布地址) wget https://github.com/rustdesk/rustdesk-server/releases/download/1.1.8-2/rustdesk-server-linux-amd64.zip # 使用unzip解压 unzip rust…...
Flutter环境搭建【win10虚拟机】+夜神模拟器【主机】
Flutter环境搭建 0 Android Studio 与 VS Code 资源消耗对比1 系统配置要求2 Flutter SDK2.1 获取 Flutter SDK2.2 解压2.3 更新 path 环境变量Dart SDK 要兼容 Flutter SDK双击 flutter_console.bat 输入 flutter doctor 检测环境 3 VS code 与插件3.1 安装 VS code3.2 安装 f…...
【数据结构和算法】种花问题
其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、题目描述 二、题解 2.1 方法一:贪心 2.2 贪心算法一般思路 三、代码 3.1 方法一…...
Vite+Electron快速构建一个VUE3桌面应用(一)
一. 简介 首先,介绍下vite和Electron。 Vite是一种新型前端构建工具,能够显著提升前端开发体验。Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入Chromium和Node.js到二进制的 Electron 允许您保持一个 JavaScript 代码代码…...
第二百八十九回
文章目录 1. 概念介绍2. 方法与细节2.1 实现方法2.2 具体细节 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何混合选择多个图片和视频文件"相关的内容,本章回中将介绍如何通过相机获取视频文件.闲话休提,让我们一起Talk Flutter吧。 1. …...
Likeshop多商户商城源码系统,支持二开
在电商行业高速发展的当下,拥有一套功能强大、易于操作的开源商城系统至关重要。Likeshop多商户商城系统正是这样一款集H5、小程序、独立APP于一体的开源电商解决方案,助力商家实现智能营销。 一、产品简介 Likeshop多商户商城系统为商家提供了丰富的营…...
Excel:将截面数据转换成面板数据
原始截面数据如下: 步骤:数据——自表格/区域 点击确定,出现下图: 然后,在这个界面选择:“转换”——“逆透视列”下选择逆透视其他列。会出现面板数据形式。 然后,点击“主页”——关闭并上载即…...
209.长度最小的子数组(力扣LeetCode)
文章目录 209.长度最小的子数组题目描述暴力滑动窗口 209.长度最小的子数组 题目描述 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl1, …, numsr-1, numsr] ,并返回其长度…...
Docker容器部署OpenCV,打造高效可移植的计算机视觉开发环境
推荐 海鲸AI-ChatGPT4.0国内站点:https://www.atalk-ai.com 前言 在计算机视觉领域,快速部署和测试算法是研究和开发的关键。OpenCV作为一个强大的开源计算机视觉库,广泛应用于各种图像处理和视频分析任务。然而,配置OpenCV环境可…...
【Linux】Linux系统编程——pwd命令
文章目录 1.命令概述2.命令格式3.常用选项4.相关描述5.参考示例 1.命令概述 pwd(Print Working Directory)命令用于显示用户当前工作目录的完整路径。这是一个常用的命令,帮助用户确定他们目前所在的目录位置。 2.命令格式 基本的 pwd 命令…...
暴力破解
暴力破解工具使用汇总 1.查看密码加密方式 在线网站:https://cmd5.com/ http://www.158566.com/ https://encode.chahuo.com/kali:hash-identifier2.hydra 用于各种服务的账号密码爆破:FTP/Mysql/SSH/RDP...常用参数 -l name 指定破解登录…...
VirtualBox安装Ubuntu22.04
目录 1、新建虚拟机 1.1、设置内存大小 1.2、创建虚拟硬盘 2、虚拟机设置 2.1、设置启动顺序编辑 2.2、选择iso镜像文件 2.3、设置网络(桥接网卡) 3、启动 3.1、设置语言环境 3.2、系统更新安装(不更新) 3.3、选择键盘布局(默认即可) 3.4、选择安装类型 3.5、网…...
85 总结一下最近遇到的一些 jar发布 相关的知识
前言 呵呵 最近有一些构建服务, 发布服务的一些需求 我们这里的服务 一般来说是 java application, spring boot application 针对发布, 当然最好是 增量发布, 尽量的减少需要传递给 发布服务器 的资源的大小 比如 我的这个 java application, 可能会存在很多依赖, 常规…...
Vue组件之间的通信方式都有哪些
Vue组件之间的通信方式 组件间通信的概念组件间通信解决了什么组件间通信的分类 父子组件之间的通信兄弟组件之间的通信祖孙与后代组件之间的通信非关系组件间之间的通信 组件间通信的方案 props传递数据$emit 触发自定义事件refEventBusparent、rootattrs与listenersprovide …...
C# 只读文件删除提示失败,给文件修改属性
需求背景:处理文件后,删除源文件信息,但不能确保源文件是只读文件,因此需要修改文件属性 //设置文件属性 string path "文件路径"; File.SetAttributes(path, FileAttributes.Normal); //删除文件 File.Delete(path);参…...
Redis 实际项目中的整合,记录各种用法
Redis缓存餐厅数据 我们来看主要的流程 很简单,就是在数据库和接口之间加了一层缓冲,在redis之前其实还可以加其他的缓存 例如 nginx的缓存 接下来,就是结合我的业务,来做缓存 我这里的业务逻辑是,按了分类的按钮,分别以不同的 分类为一组缓存数据 所以,这里的缓存粒度是分类…...
iOS推送通知
文章目录 一、推送通知的介绍1. 简介2. 通知的分类 二、本地通知1. 本地通知的介绍2. 实现本地通知3. 监听本地通知的点击 三、远程通知1. 什么是远程通知2. 为什么需要远程通知3. 远程通知的原理4. 如何做远程通知5. 远程通知证书配置6. 获取远程推送要用的 DeviceToken7. 测试…...
安全产品与等级保护:匹配与选择指南
基本要求项测评项基本措施对应产品网络架构应保证网络各个部分的带宽满足业务高峰期需要;带宽管理流量控制系统应避免将重要网络区域部署在边界处,重要网络区域与其他网络区域之间应采取可靠的技术隔离手段;网络及安全设备配置访问控制策略防…...
JiYuTrainer:如何一键解除极域电子教室的全屏控制限制?
JiYuTrainer:如何一键解除极域电子教室的全屏控制限制? 【免费下载链接】JiYuTrainer 极域电子教室防控制软件, StudenMain.exe 破解 项目地址: https://gitcode.com/gh_mirrors/ji/JiYuTrainer 你是否曾在机房上课时,被极域电子教室的…...
Cadence导出Gerber文件保姆级教程:从Database Check到嘉立创预览,一步不落
Cadence导出Gerber文件全流程实战:从设计验证到生产准备的深度指南 第一次在Cadence Allegro中导出Gerber文件时,那种面对几十个参数选项的手足无措感我至今记忆犹新。作为电子设计自动化(EDA)领域的工业标准工具,Cadence的强大功能背后是复杂…...
npm install 背后的依赖管理机制:为什么你的node_modules这么大?
npm install 背后的依赖管理机制:为什么你的node_modules这么大? 每次运行 npm install 后,看着飞速增长的 node_modules 文件夹,你是否曾好奇过这个"黑洞"究竟是如何形成的?今天我们就来揭开Node.js依赖管理…...
2025新算法TOC优化VMD实战:六种熵值评估信号分解,一键Matlab出图
1. 为什么需要优化VMD参数? 第一次接触VMD(Variational Mode Decomposition)时,我和很多初学者一样被它的参数调优问题困扰。记得当时处理一组轴承振动信号,手动试了十几组K值和α值,结果要么模态分解不彻底…...
英雄联盟智能工具集:3个颠覆性功能重塑你的游戏体验
英雄联盟智能工具集:3个颠覆性功能重塑你的游戏体验 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 作为英雄联盟玩家…...
Fillinger:设计自动化时代的效率提升工具
Fillinger:设计自动化时代的效率提升工具 【免费下载链接】illustrator-scripts Adobe Illustrator scripts 项目地址: https://gitcode.com/gh_mirrors/il/illustrator-scripts 核心价值:从机械操作到创意释放的设计革命 核心价值:让…...
保姆级教程:用Docker Compose一键部署ZLMediaKit流媒体服务器(含OBS推流配置)
从零搭建私有流媒体平台:Docker Compose ZLMediaKit OBS全流程指南 流媒体技术正在重塑内容传播的方式。无论是企业内部培训、游戏直播还是产品演示,一个稳定高效的私有流媒体平台都能显著提升沟通效率。本文将手把手教你如何用Docker Compose快速部署…...
Ubuntu20.04安全重启后WiFi图标消失?MT7922网卡驱动修复全攻略
Ubuntu 20.04安全重启后MT7922网卡驱动失效的深度修复指南 问题现象与初步诊断 当你使用REISUB组合键对Ubuntu 20.04进行安全重启后,可能会发现桌面右上角的WiFi图标神秘消失。这不是简单的界面显示问题,而是MT7922无线网卡驱动未能正常加载导致的深层…...
硕士论文AI率要求15%以下,用嘎嘎降AI一次过的经验
硕士论文AI率要求15%以下,用嘎嘎降AI一次过的经验 答辩前一周,导师突然甩来一句:“学校新规,硕士论文AI率15%以下才能送审。” 我当时心态直接崩了。我那篇三万字的研究生论文,从文献综述到实验方法,全是我…...
Java: 手动实现DeepSeek R1工具调用,基于ReAct与Spring AI的实践指南
1. DeepSeek R1工具调用的现状与挑战 DeepSeek R1作为当前热门的开源大模型,在实际应用中经常会遇到需要调用外部工具的场景。但很多开发者在使用过程中发现,当前版本的DeepSeek R1并不支持原生的工具调用功能。这意味着当我们想让模型执行诸如查询天气、…...
