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

23:SPI二:W25Q64存储器模块的使用

W25Q64存储器模块的使用

  • 1、W25Q64的简介
  • 2、模块内部结构
    • 2.1:引脚结构
    • 2.2:内部存储结构
    • 2.3:此模块的注意事项
  • 3、程序模拟SPI读写W25Q64
  • 4、片上外设SPI读写W25Q64

1、W25Q64的简介

其中最主要的特点就是掉电不丢失
在这里插入图片描述
由上图所示:W25Qxx的地址是24位的,则代表地址总线是24根地址总线。一个地址则代表一个门牌号,一个门牌号的存储空间是一个字节,那么24位的地址一共有多少个字节?
在这里插入图片描述

有上图所示:地址0x000 000(24位)~0xFFF FFF这之间一共有2^24(16777216)个地址数。则一共有16777216个字节。我们换算一下:16777216B = 16384KB = 16MB。所以24位地址总线的存储空间是16MB,有上面可知W25Q40~W25Q128的存储空间 ≤ 16MB,而W25Q256的存储空间是32MB,所以这个模块比较特殊。

2、模块内部结构

2.1:引脚结构

在这里插入图片描述
WP:输入低电平,保护住,不能写;输入高电平,可以写。
HOLD:低电平有效

2.2:内部存储结构

在这里插入图片描述

W25Q64的存储空间是8MB(8388608B),则寻址地址由0x000 000~0x7FF FFF。由上图所示:此模块中将8MB划分出了以64KB大小的若干块Block(128个)。而每1块中划分为以4KB大小的扇区(16个)

在这里插入图片描述
而1个扇区中划分以256B大小的页Page(16页)。所以W25Q64一共有32768个Page。所以地址的前2个字节用于选择哪一页,最后一个字节用于选择哪一个存储空间

在这里插入图片描述
由上图所示:页缓存区大小只有256个字节,所以一次性写入的数据不能超过256字节的大小。给缓存区里面写入数据后,状态寄存器Busy位会置1。

2.3:此模块的注意事项

在这里插入图片描述

3、程序模拟SPI读写W25Q64

在这里插入图片描述①MySPI.c文件的代码如下:

/*使用代码程序模拟SPI模式0的传输方式*/
#include "stm32f10x.h"                 /** PA4引脚选择从机*/
void MySPI_NSS(uint8_t BitValue)
{GPIO_WriteBit(GPIOA, GPIO_Pin_4, (BitAction)BitValue);
}/** PA5引脚模拟时钟信号*/
void MySPI_SCK(uint8_t BitValue)
{GPIO_WriteBit(GPIOA, GPIO_Pin_5, (BitAction)BitValue);		
}/** PA7引脚主机发送从机接收*/
void MySPI_Write(uint8_t BitValue)
{GPIO_WriteBit(GPIOA, GPIO_Pin_7, (BitAction)BitValue);
}/** PA6引脚主机接收从机发送*/
uint8_t MySPI_Receive(void)
{return GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6);
}/** 对引脚的初始化,PA4为从机选择引脚,PA5时钟信号引脚,PA6为数据接收引脚* PA7为数据发送引脚。所以PA4,PA5,PA7配置为通用推挽输出,PA6配置为上拉输入*/
void MySPI_Init(void)
{/*开启时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	//开启GPIOA的时钟/*GPIO初始化*/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_NSS(1);				//NSS高电平,还没有选择从机MySPI_SCK(0);				//SCK极性为低电平
}/** 起始信号*/
void MySPI_Start(void)
{MySPI_NSS(0);				//拉低NSS,开始时序
}/** 停止信号*/
void MySPI_Stop(void)
{MySPI_NSS(1);				//拉高SS,终止时序
}/** 发送数据和读取数据函数*/
uint8_t MySPI_SengRec_Byte(uint8_t SendByte)
{uint8_t i, Byte = 0x00;//定义接收的数据,并赋初值0x00,for (i = 0; i < 8; i ++)//循环8次,依次交换每一位数据{MySPI_Write(SendByte & (0x80 >> i));//给传输线上写入数据	MySPI_SCK(1);//拉高SCK,上升沿从机读取数据if (MySPI_Receive() == 1)//读取MISO数据,并存储到Byte变量{Byte |= (0x80 >> i);}											MySPI_SCK(0);//拉低SCK,为下一位数据放入传输线做准备}return Byte;//返回接收到的一个字节数据
}

②W25Q64.c文件的代码如下:

#include "stm32f10x.h"                  
#include "MySPI.h"                  
#include "W25Q64Reg.h"
#include "W25Q64.h"/**  SPI初始化*/
void W25Q64_Init(void)
{MySPI_Init();
}/**  读取模块ID号*/
void W25Q64_ReadID(uint8_t *MID,uint16_t *DID)
{W25Q64_WriteEnable();//写使能MySPI_Start();MySPI_SengRec_Byte(W25Q64_JEDEC_ID);//发送指令0X9F,指令:获取产品的ID*MID = MySPI_SengRec_Byte(W25Q64_DUMMY_BYTE);//接收数据*DID = MySPI_SengRec_Byte(W25Q64_DUMMY_BYTE);//接收高8位数据*DID <<= 8;*DID |= MySPI_SengRec_Byte(W25Q64_DUMMY_BYTE);//接收低8位数据MySPI_Stop();	
}/**  使能函数*/
void W25Q64_WriteEnable(void)
{MySPI_Start();MySPI_SengRec_Byte(W25Q64_WRITE_ENABLE);//发送指令0x06,指令:写使能MySPI_Stop();	
}/**  检测Busy是否忙*/
void W25Q64_WaitBusy(void)
{uint32_t TimeOut = 1000;MySPI_Start();MySPI_SengRec_Byte(W25Q64_READ_STATUS_REGISTER_1);//发送指令0x05,指令:读状态寄存器1while((MySPI_SengRec_Byte(W25Q64_DUMMY_BYTE) & 0x01) == 0x01)//读取Busy位,如果BUSY为1则进入循环{TimeOut--;if(TimeOut == 0){break;}}MySPI_Stop();	
}/**  写入指定地址的数据函数*/
void W25Q64_PageProgram(uint32_t Address,uint8_t* DataArray,uint16_t Length)//向Pgae写入数据
{W25Q64_WriteEnable();MySPI_Start();MySPI_SengRec_Byte(W25Q64_QUAD_PAGE_PROGRAM);//指令:写入数据MySPI_SengRec_Byte(Address >> 16);//发送地址的最高8位,地址是24位MySPI_SengRec_Byte(Address >> 8);//发送地址的次高8位MySPI_SengRec_Byte(Address);//发送地址的低8位for(uint16_t i = 0;i < Length; i++){MySPI_SengRec_Byte(DataArray[i]);//向模块写入数据,从指定地址开始写入,然后地址自动自增}MySPI_Stop();	W25Q64_WaitBusy();
}/**  擦除指定地址的数据函数*/
void W25Q64_SectorErase(uint32_t Address)//擦除
{W25Q64_WriteEnable();MySPI_Start();W25Q64_WriteEnable();MySPI_SengRec_Byte(W25Q64_SECTOR_ERASE_4KB);//指令:擦除扇区MySPI_SengRec_Byte(Address >> 16);//发送地址的最高8位,地址是24位MySPI_SengRec_Byte(Address >> 8);//发送地址的次高8位MySPI_SengRec_Byte(Address);//发送地址的低8位MySPI_Stop();	W25Q64_WaitBusy();
}/**  读取指定地址的数据函数*/
void W25Q64_ReceiveData(uint32_t Address,uint8_t* DataArray,uint32_t Length)
{MySPI_Start();MySPI_SengRec_Byte(W25Q64_READ_DATA);//指令:读取数据MySPI_SengRec_Byte(Address >> 16);//发送地址的最高8位,地址是24位MySPI_SengRec_Byte(Address >> 8);//发送地址的次高8位MySPI_SengRec_Byte(Address);//发送地址的低8位for(uint32_t i = 0;i<Length;i++){DataArray[i] = MySPI_SengRec_Byte(W25Q64_DUMMY_BYTE);//读取数据,从指定地址开始读取,然后地址自动自增}MySPI_Stop();	
}	

③W255Q64Reg.h指令集文件代码如下:

#ifndef __W25Q64Reg_H
#define __W25Q64Reg_H
#include "stm32f10x.h"                  // Device header
/*模块的指令集
*/#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

④主函数文件代码如下:

/*程序模拟SPI读写W25Q64
*/#include "stm32f10x.h"                 
#include "OLED.h"
#include "W25Q64.h"uint8_t MID;
uint16_t DID;
uint8_t ArrayWrite[] = {0x01,0x02,0x03,0x04};//需要写入的数据
uint8_t ArrayRead[4];int main(void)
{OLED_Init();OLED_Clear();W25Q64_Init();//SPI初始化OLED_ShowString(1,1,"MID:   DID:");OLED_ShowString(2,1,"W:");OLED_ShowString(3,1,"R:");W25Q64_ReadID(&MID,&DID);//读取IDOLED_ShowHexNum(1,5,MID,2);OLED_ShowHexNum(1,12,DID,4);W25Q64_SectorErase(0x000000);//擦除扇区W25Q64_PageProgram(0x000000,ArrayWrite,4);//写入数据W25Q64_ReceiveData(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){}
}

在这里插入图片描述

4、片上外设SPI读写W25Q64

使用片上外设读写时,只需要将SPI的读写改为使用片上外设的函数即可,其他代码不用改变。
①MySPI.c文件的代码如下:

#include "stm32f10x.h"                  // Device header/** PA4引脚选择从机*/
void MySPI_NSS(uint8_t BitValue)
{GPIO_WriteBit(GPIOA, GPIO_Pin_4, (BitAction)BitValue);//设置NSS引脚的电平
}/** 对引脚的初始化,PA4为从机选择引脚,PA5时钟信号引脚,PA6为数据接收引脚* PA7为数据发送引脚。所以PA4配置为通用推挽输出,PA5,PA7配置为复用推挽输出,PA6配置为上拉输入*/
void MySPI_Init(void)
{/*开启时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	//开启GPIOA的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);	//开启SPI1的时钟/*GPIO初始化*/GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        //将PA4引脚初始化为推挽输出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);					GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7;  //将PA5和PA7引脚初始化为复用推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);					GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;           //将PA6引脚初始化为上拉输入GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);					/*SPI初始化*/SPI_InitTypeDef SPI_InitStructure;						//定义结构体变量SPI_InitStructure.SPI_Mode = SPI_Mode_Master;			//主机/从机模式,选择为SPI主模式SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;	//方向,选择2线全双工SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;		//数据宽度,选择为8位SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;		//先行位,选择高位先行SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128;	//波特率分频,选择128分频SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;				//SPI极性,选择空闲为低极性SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;			//SPI相位,选择第一个边沿采样,极性和相位决定选择SPI模式0SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;				//NSS,选择由软件控制SPI_InitStructure.SPI_CRCPolynomial = 7;				//CRC多项式,暂时用不到,给默认值7SPI_Init(SPI1, &SPI_InitStructure);						//将结构体变量交给SPI_Init,配置SPI1SPI_Cmd(SPI1, ENABLE);									//使能SPI1,开始运行MySPI_NSS(1);											//SS默认高电平
}/** 起始信号*/
void MySPI_Start(void)
{MySPI_NSS(0);				//拉低NSS,开始时序
}/** 停止信号*/
void MySPI_Stop(void)
{MySPI_NSS(1);				//拉高SS,终止时序
}/** 发送数据和读取数据函数*/
uint8_t MySPI_SengRec_Byte(uint8_t SendByte)
{while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) != SET);	//等待发送数据寄存器空,写入数据自动清除SPI_I2S_SendData(SPI1, SendByte);								//写入数据到发送数据寄存器,开始产生时序while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) != SET);	//等待接收数据寄存器非空,读取数据自动清除return SPI_I2S_ReceiveData(SPI1);								//读取接收到的数据并返回
}

W25Q64.c文件和W25Q64Reg.h文件和主函数文件的代码都不用改变。

相关文章:

23:SPI二:W25Q64存储器模块的使用

W25Q64存储器模块的使用 1、W25Q64的简介2、模块内部结构2.1&#xff1a;引脚结构2.2&#xff1a;内部存储结构2.3&#xff1a;此模块的注意事项 3、程序模拟SPI读写W25Q644、片上外设SPI读写W25Q64 1、W25Q64的简介 其中最主要的特点就是掉电不丢失。 由上图所示&#xff1a…...

论文解读《COMMA: Co-articulated Multi-Modal Learning》

系列文章目录 文章目录 系列文章目录论文细节理解1. 研究背景2. 论文贡献3. 方法框架4. 研究思路5. 实验6. 限制结论 论文细节理解 这段话中&#xff0c;the vision branch is uni-directionally influenced by the text branch only 什么意思&#xff1f;具体举例一下 以下是…...

10款电脑加密软件超好用推荐|2024年常用电脑加密软件排行榜

随着数据隐私和信息安全意识的增强&#xff0c;电脑加密软件已成为日常工作和个人生活中不可或缺的工具之一。无论是保护公司机密文件&#xff0c;还是保障个人数据的安全&#xff0c;合适的加密软件都能提供强有力的保护。本文将推荐2024年超好用的10款电脑加密软件&#xff0…...

用户态缓存:环形缓冲区(Ring Buffer)

目录 环形缓冲区&#xff08;Ring Buffer&#xff09;简介 为什么选择环形缓冲区&#xff1f; 代码解析 1. 头文件与类型定义 1.1 头文件保护符 1.2 包含必要的标准库 1.3 类型定义 2. 环形缓冲区结构体 2.1 结构体成员解释 3. 辅助宏与内联函数 3.1 min 宏 3.2 is…...

Harmony应用 ArkTs AES 加密方法之GCM对称加密

加解密介绍 在数据存储或传输场景中&#xff0c;可以使用加解密操作用于保证数据的机密性&#xff0c;防止敏感数据泄露。 使用加解密操作中&#xff0c;典型的场景有&#xff1a; 使用对称密钥的加解密操作。 使用非对称密钥的加解密操作。 使用RSA&#xff08;PKCS1_OAEP…...

热成像在战场上的具体作用!!!

1. 探测和跟踪敌人 原理&#xff1a;人体和许多类型的军事设备都会发热&#xff0c;热成像技术通过探测这些红外辐射&#xff0c;能够在远距离探测和跟踪敌人的位置。 应用场景&#xff1a;这一功能在夜间或有覆盖物&#xff08;如草丛、树林&#xff09;的情况下尤为有效&am…...

2024年09月20日《每日一练》

1、 根据我国“十三五”规划纲要&#xff0c;&#xff08;&#xff09;不属于新一代信息技术产业创新发展的重点。 A 人工智能 B 移动智能终端 C 先进传感器 D 4G D P13 此题考察的是新一代信息技术&#xff0c;必须掌握&#xff0c;高频考点 国在“十三五“规划纲要中&#x…...

使用 SSCB 保护现代高压直流系统的优势

在各种应用中&#xff0c;系统效率和功率密度不断提高&#xff0c;这导致了更高的直流系统电压。然而&#xff0c;传统的电路保护解决方案不足以在保持高可靠性和安全性的同时有效保护这些高压配电系统。 固态断路器 &#xff08;SSCB&#xff09; 和电熔断器具有众多优点&…...

Linux基础命令——文件系统的日常管理

目录 一.如何查看当前工作目录?&#xff08;你现在所处的位置路径&#xff09; 二.命令touch的用途是什么?还有别的方法新建文件吗? &#xff08;1&#xff09;创建空文件 &#xff08;2&#xff09;如果已经存在这个文件&#xff0c;就会更新创建时间。 &#xff08;3…...

uniapp使用高德地图设置marker标记点,后续根据接口数据改变某个marker标记点,动态更新

最近写的一个功能属实把我难倒了,刚开始我请求一次数据获取所有标记点,然后设置到地图上,然后后面根据socket传来的数据对这些标记点实时更新,改变标记点的图片或者文字, 1:第一个想法是直接全量替换,事实证明这样不行,会很卡顿,有明显闪烁感,如果标记点比较少,就十几个可以用…...

坦白了,因为这个我直接爱上了 FreeBuds 6i

上个月&#xff0c;华为发布的 FreeBuds 6i 联名了泡泡玛特真的超级惊艳&#xff0c;不少宝子被这款耳机的颜值所吸引&#xff0c;而它的实力更是不容小觑的。FreeBuds 6i 是一款性能强大的降噪耳机&#xff0c;它一直在强调平均降噪深度&#xff0c;但是应该很多人对这个概念很…...

006.MySQL_查询数据

课 程 推 荐我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448;入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448;虚 拟 环 境 搭 建 &#xff1a;&#x1…...

【C#生态园】从图像到视觉:Emgu.CV、AForge.NET、OpenCvSharp 全面解析

C#图像处理库大比拼&#xff1a;功能对比、安装配置、API概览 前言 图像处理和计算机视觉在现代软件开发中扮演着重要角色&#xff0c;而C#作为一种流行的编程语言&#xff0c;拥有许多优秀的图像处理库。本文将介绍几个用于C#的图像处理和计算机视觉库&#xff0c;包括Image…...

1、无线通信的发展概况

无线通信是指双方至少一方使用无线方式进行信息的交换与传输&#xff0c;包括移动体&#xff08;行人、车辆、船舶以及飞机&#xff09;和移动体之间的通信&#xff0c;也包括移动体与固定点&#xff08;固定点的移动电台或有线通信&#xff09;之间的通信。 随着无线通信的范围…...

虚拟机安装xubuntu

新建一个新的虚拟机&#xff0c;选择自定义安装 默认下一步 选择稍后安装操作系统 选择所要创建的系统及版本 填写虚拟机的名称及创建的虚拟机保存的位置 选择处理器和内核的数量 处理器数量指的是&#xff1a;虚拟的CPU数量。 每个处理器的内核数量指的是&#xff1a;虚拟CPU…...

携手鲲鹏,长亮科技加速银行核心系统升级

新经济周期下&#xff0c;银行净息差持续收窄、盈利压力加大、市场竞争日趋加剧。同时&#xff0c;国家相关政策不断出台&#xff0c;对金融科技的自主创新与安全可控提出了更高要求。 在这样的大背景下&#xff0c;银行业的数字化转型已经步入深水区。其中&#xff0c;核心系统…...

新鲜的Win11/10镜像,全系列下载!

下载&#xff1a;新鲜的Win11/10镜像&#xff0c;全系列下载&#xff01; | 瑆箫博客 Windows每个月都来一次例行更新&#xff0c;大吉大利今晚装机&#xff01;2024年9月份ISO镜像&#xff0c;来咯~我们不生产系统&#xff0c;我们只是大自然微软的搬运工本文提供Windows11、…...

iPhone 16系列:摄影艺术的全新演绎,探索影像新境界

在科技的浪潮中&#xff0c;智能手机摄影功能的进化从未停歇。 苹果公司即将推出的iPhone 16系列&#xff0c;以其卓越的相机升级和创新特性&#xff0c;再次站在了手机摄影的前沿。 从硬件到软件&#xff0c;从拍照体验到图像处理&#xff0c;iPhone 16系列都展现了其在移动…...

移动应用开发中的技术选择:优缺点全面解析

在移动应用开发领域&#xff0c;技术的快速演变和多样化使得开发者面临着多种选择。随着市场需求的不断变化&#xff0c;各种框架和工具应运而生。本文将分析当前主流应用开发技术的优势与劣势&#xff0c;帮助开发者选择最适合的技术栈。 一、原生开发 优势 性能卓越&#…...

宿舍管理系统的设计与实现 (含源码+sql+视频导入教程)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 宿舍管理系统拥有三个角色&#xff0c;分别为系统管理员、宿舍管理员以及学生。其功能如下&#xff1a; 管理员&#xff1a;宿舍管理员管理、学生管理、宿舍楼管理、缺勤记录管理、个人密…...

原生+jquery写自动消失的提示框

<!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>自动消失消息提示</title> <style>/…...

Android14 蓝牙 BluetoothService 启动和相关代码介绍

Android14 蓝牙 BluetoothService 启动和相关代码 文章目录 Android14 蓝牙 BluetoothService 启动和相关代码一、前言二、代码分析介绍1、蓝牙 BluetoothService 启动和相关代码&#xff08;1&#xff09;蓝牙服务相关的有几个类有&#xff1a;&#xff08;2&#xff09;几个蓝…...

【秋招笔试-支持在线评测】9.19小米秋招(已改编)-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 大厂实习经历 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收集…...

动态IP与静态IP:哪种更适合用户使用?

在现代网络环境中&#xff0c;IP地址的管理对于网络的运行和安全至关重要。IP地址是网络中每一个设备的唯一标识符&#xff0c;通常分为动态IP和静态IP两种类型。每种类型都有其独特的优缺点&#xff0c;适用于不同的使用场景。本文将探讨动态IP和静态IP的特点&#xff0c;并分…...

Flowable基础篇

Flowable基础篇 课程环境说明&#xff1a; JDK8Flowable6.7.2MySQL8 一、基础知识科普 1.工作流发展 BPM(BusinessProcessManagement)&#xff0c;业务流程管理是一种管理原则&#xff0c;通常也可以代指BPMS(BusinessProcessManagementSuite)&#xff0c;是一个实现整合不同…...

SQL Server数据库简单的事务日志备份恢复

模拟数据库备份恢复过程 1.基础操作 1.创建TestDB数据库&#xff0c;并添加数据 USE [master] GO CREATE DATABASE TestDB CONTAINMENT NONE ON PRIMARY ( NAME NTestDB, FILENAME ND:\TestDB.mdf , SIZE 8192KB , MAXSIZE UNLIMITED, FILEGROWTH 65536KB ) LOG ON ( …...

二级C语言2023-3易错题

1 下列叙述中正确的是 A. 循环队列是队列的链式存储结构 B. 能采用顺序存储的必定是线性结构 C. 所有的线性结构都可以采用顺序存储结构 D. 具有两个以上指针的链表必定是非线性结构 正确答案&#xff1a;C C的陈述是正确的。线性结构是一种基本的数据结构&#xff0c;它包括…...

【2024】前端学习笔记9-内部样式表-外部导入样式表-类选择器

学习笔记 内部样式表外部导入样式表类选择器&#xff1a;class 内部样式表 内部样式表是将 CSS 样式规则写在 HTML 文档内部。通过<style>标签在 HTML 文件的<head>部分定义样式。 简单示例&#xff1a; <!DOCTYPE html><html><head><style…...

回归传统,Domino拷贝式迁移!

大家好&#xff0c;才是真的好。 前面讲太多普及型的概念&#xff0c;今天我们来点实在的内容。 在Notes/Domino的黄金年代&#xff0c;有一件事情大家干得风生水起&#xff0c;那就是Domino服务器迁移。 要么迁移到另一台硬件服务器上&#xff0c;要么迁移到新换的磁盘当中…...

商品搜索API返回值解析:关键字搜索如何优化商品推荐

优化商品推荐 关键字搜索优化&#xff1a;分析用户搜索的关键字&#xff0c;并确定每个关键字的权重&#xff0c;使用这些权重来调整搜索结果和推荐结果的相关性。 taobao.item_search 公共参数 请求地址: 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接…...