【STM32单片机】#12 SPI通信(软件读写)
主要参考学习资料:
B站@江协科技
STM32入门教程-2023版 细致讲解 中文字幕
开发资料下载链接:https://pan.baidu.com/s/1h_UjuQKDX9IpP-U1Effbsw?pwd=dspb
单片机套装:STM32F103C8T6开发板单片机C6T6核心板 实验板最小系统板套件科协
目录
- SPI通信
- 硬件电路
- 移位示意图
- SPI时序基本单元
- SPI时序(W25Q64芯片)
- W25Q64简介
- 硬件电路
- W25Q64框图
- Flash操作注意事项
- 状态寄存器
- 指令集
- 实验26 软件SPI读写W25Q64
- 接线图
- SPI协议层
- W25Q64驱动层
- 主程序
SPI通信
- SPI(Serial Periheral Interface)是由Motorrola公司开发的一种通用数据总线。
- 四根通信线:SCK(Serial Clock)、MOSI(Master Output Slave Input)、MISO(Master Input Slave Output)、SS(Slave Select)
- 同步全双工
- 支持总线挂载多设备(一主多从)
硬件电路
- 所有SPI设备的SCK、MOSI、MISO分别连在一起。
- 主机另外引出多条SS控制线,分别接到各从机的SS引脚。SS线低电平有效,要指定从机则将相应的SS线置低电平,同一时间只能指定一个从机以防冲突。
- 输出引脚配置为推挽输出,强高低电平驱动,上升沿下降沿均迅速,传输速度远高于I2C。但从机输出仍可能存在冲突,因此SPI规定从机未被选中时需输出高阻态。
- 输入引脚配置为浮空或上拉输入。
移位示意图
SPI高位先行,时钟驱动移位寄存器左移,时钟源由主机的波特率发生器提供。主机移位寄存器移出的数据通过MOSI输入到从机移位寄存器的右端,从机移位寄存器移出的数据通过MISO输入到主机移位寄存器的右端。波特率发生器的上升沿(下降沿)驱动移位寄存器向左移出一位放在引脚上;下降沿(上升沿)驱动引脚上的位采样移入到移位寄存器空出的最低位。八个时钟之后,主机和从机交换一个字节的数据,交换字节是SPI通信的基础。只发不收则不读取从机输入的数据,只收不发则可向从机发送0x00或0xFF置换从机的数据。
SPI时序基本单元
- 起始条件:SS高→低
- 终止条件:SS低→高
SPI在移位时序上提供了CPOL(时钟极性)和CPHA(时钟相位)两个可配置的位以兼容更多芯片,不同的配置组合构成了四种模式,其中模式0应用最多。
- 交换一个字节(模式0)
- CPOL=0:空闲状态时,SCK为低电平
- CPHA=0:SCK第一个边沿移入数据(第一个边沿指SCK跳出空闲状态产生的边沿,此处为上升沿),第二个边沿移出数据(第二个边沿与第一个边沿相反)
- 交换一个字节(模式1)
- CPOL=0:空闲状态时,SCK为低电平
- CPHA=1:SCK第一个边沿移出数据,第二个边沿移入数据
- 交换一个字节(模式2)
- CPOL=1:空闲状态时,SCK为高电平
- CPHA=0:SCK第一个边沿移入数据,第二个边沿移出数据
- 交换一个字节(模式3)
- CPOL=1:空闲状态时,SCK为高电平
- CPHA=1:SCK第一个边沿移出数据,第二个边沿移入数据
SPI时序(W25Q64芯片)
SPI通常采用指令码+读写数据的流程,从机中会定义一个指令集。SPI起始后,第一个发送给从机的数据一般为指令码指导从机完成相应的功能,随后根据指令要求继续收发数据。
- 发送指令
- 向SS指定的设备发送指令(0x06,对应W25Q64芯片写使能指令)
- 指定地址写
- 向SS指定的设备,发送写指令(0x02),随后在指定地址(包含24位地址的三个字节Address[23:0],高位先行)下,写入指定数据(Data,图中为0x55)。SPI也有地址指针,可随地址自增连续写入多个字节。
- 指定地址读
- 向SS指定的设备,发送读指令(0x03),随后在指定地址(Address[23:0])下,读取从机数据(Data,主机发送0xFF置换从机的0x55)。可随地址自增连续读取多个字节。
W25Q64简介
- W25Qxx系列是一种小成本、小型化、使用简单的非易失性存储器,常应用于数据存储、字库存储、固件程序存储等场景。
- 存储介质:Nor Flash(闪存)
- 时钟频率:80MHz/160MHz(Dual SPI,二重SPI)/320MHz(Quad SPI,四重SPI),后两种类似使用多个SPI数据线并行传输,了解即可。
- W25Qxx的存储容量(24位地址)为xxMbit
硬件电路
引脚 | 功能 |
---|---|
VCC、GND | 电源(2.7~3.6V) |
CS(SS) | SPI片选 |
CLK(SCK) | SPI时钟 |
DI(MOSI) | SPI主机输出从机输入 |
DO(MISO) | SPI主机输入从机输出 |
WP | 写保护 |
HOLD | 数据保持 |
中途需要释放总线时,可以将HOLD引脚置低电平,芯片会记住当前时序,需要继续之前的时序时再将HOLD置回高电平。
括号内的IO x _x x为使用双重SPI和四重SPI时用于充当SPI数据线的引脚,了解即可。
上图为W25Qxx模块原理图,J1为引出的排针,D1为电源指示灯。
W25Q64框图
红色方框为存储器规划示意图,存储器分为128×64KB块,每个块分为16×4KB扇区,每个扇区分为16×256Byte页。每个块和扇区的左下角和右上角为对应的起始和终止地址,块和扇区同一行的左端和右端为页的起始和终止地址。
左下角为SPI控制逻辑(SPI Command & Control Logic),自动完成地址锁存、数据读写操作。控制逻辑左侧为与主控芯片相连的通信引脚,主控芯片通过SPI协议将指令和数据发给控制逻辑,控制逻辑自动操作内部电路完成相应功能。控制逻辑上方为状态寄存器(Status Register),与忙状态、写使能/保护有关,后文详细介绍。再上方为配合WP引脚实现写保护的写控制逻辑(Write Control Logic)。SPI控制逻辑往右有高电压生成器(High Voltage Generator),配合Flash进行编程,通过高电压刺激实现掉电不丢失;页/字节地址锁存/计数器(Page/Byte Address Latch/Counter)用于指定地址,三字节地址的前两个字节进入页地址锁存/计数器,最后一个字节进入字节地址锁存/计数器。页地址通过写保护和行解码(Write Protect Logic & Row Decode)选择操作哪一页,字节地址通过列解码和256字节页缓存(Column Decode & 256-Byte Page Buffer)进行指定地址读写操作,写入数据先存储在页缓存区以跟上SPI传输速度,等数据写完(连续写入不超过256字节),芯片再将数据从缓存区转移到Flash存储器,此时芯片进入忙状态,将状态寄存器BUSY位置一,不会响应新的读写时序。计数器使地址指针在读写后自动加一。
Flash操作注意事项
Flash存储器为了实现掉电不丢失,同时保证存储容量足够大、成本足够低,在操作的便捷性上做出了妥协。
写入操作
- 写入操作前,必须先进行写使能。
- 每个数据位只能由1改写为0,不能由0改写为1。
- 为弥补上一条限制,写入数据前必须先擦除,擦除后,所有数据位变为1
- 擦除必须按最小擦除单元(一个扇区)进行,若想保留部分字节必须先读取作为备份
- 由于页缓存区存在,连续写入多字节时,最多(从起始位置)写入一页256Byte的数据,超过页尾位置的数据,会回到页首覆盖写入
- 写入操作结束后,芯片进入忙状态,不响应新的读写操作,读取到状态寄存器BUSY位为0时再进行
读取操作
- 直接调用读取时序,无需使能,无需额外操作,没有页的限制,读取操作结束后不会进入忙状态,但不能在忙状态时读取。
状态寄存器
W25Q64有两个状态寄存器,我们只关注重要的状态寄存器1的前两位。第一个位为前文介绍过的BUSY位,第二个位为写使能锁存位WEL。执行写使能指令后,WEL置一,代表芯片可以进行写入操作。写失能则使WEL清零,芯片刚上电、执行写失能、页编程、擦除指令都会触发写失能,因此任何写入操作前都需要写使能。
指令集
本实验涉及以下指令:
功能 | 指令 | 数据 |
---|---|---|
写使能 | 0x06 | |
写失能 | 0x04 | |
读状态寄存器1 | 0x05 | 交换读取一字节状态寄存器1配置 |
页编程(写数据) | 0x02 | 写入三字节地址和一字节数据 后续字节随地址自增依次存储 |
扇区擦除 | 0x20 | 写入三字节地址 |
读JEDEC ID | 0x9F | 交换三字节ID(一字节厂商ID+两字节设备ID) |
读取数据 | 0x03 | 写入三字节地址,交换读取一字节数据 后续字节随地址自增依次读取 |
实验26 软件SPI读写W25Q64
接线图
SPI协议层
MySPI.h
#ifndef __MYSPI_H
#define __MYSPI_Hvoid MySPI_Init(void);
void MySPI_Start(void);
void MySPI_Stop(void);
uint8_t MySPI_SwapByte(uint8_t ByteSend);#endif
MySPI.c
#include "stm32f10x.h"//封装输出引脚写
void MySPI_W_SS(uint8_t BitValue)
{GPIO_WriteBit(GPIOA, GPIO_Pin_4, (BitAction)BitValue);
}void MySPI_W_SCK(uint8_t BitValue)
{GPIO_WriteBit(GPIOA, GPIO_Pin_5, (BitAction)BitValue);
}void MySPI_W_MOSI(uint8_t BitValue)
{GPIO_WriteBit(GPIOA, GPIO_Pin_7, (BitAction)BitValue);
}//封装输入引脚读
uint8_t MySPI_R_MISO(void)
{return GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6);
}void MySPI_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//除MISO为上拉输入,其余为推挽输出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_SetBits(GPIOA, GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_7);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);GPIO_SetBits(GPIOA, GPIO_Pin_6);//初始化引脚默认电平//不选中从机MySPI_W_SS(1);//模式0时钟空闲低电平MySPI_W_SCK(0);
}//起始信号
void MySPI_Start(void)
{MySPI_W_SS(0);
}//终止信号
void MySPI_Stop(void)
{MySPI_W_SS(1);
}//交换字节(模式0)
uint8_t MySPI_SwapByte(uint8_t ByteSend)
{uint8_t i, ByteReceive = 0x00;for(i = 0;i < 8;i++){//软件无法同时执行两条语句,因此先产生边沿再操作数据MySPI_W_MOSI(ByteSend & (0x80 >> i));MySPI_W_SCK(1);//上升沿移入字节if(MySPI_R_MISO())ByteReceive |= (0x80 >> i);MySPI_W_SCK(0);//下降沿移出字节(接循环开头)}//若使用其他模式//改变极性则交换时钟写1和写0语句//改变相位则将时钟提前到读写操作之前return ByteReceive;
}
W25Q64驱动层
W25Q64.h
#ifndef __W25Q64_H
#define __W25Q64_Hvoid W25Q64_Init(void);
void W25Q64_ReadID(uint8_t *MID, uint16_t *DID);
void W25Q64_PageProgram(uint32_t Address, uint8_t *DataArray, uint16_t Count);
void W25Q64_SectorErase(uint32_t Address);
void W25Q64_ReadData(uint32_t Address, uint8_t *DataArray, uint32_t Count);#endif
W25Q64.c
#include "stm32f10x.h"
#include "MySPI.h"
#include "W25Q64_Ins.h"void W25Q64_Init(void)
{MySPI_Init();
}//读JEDEC ID,指针实现多参数返回,MID厂商ID,DID设备ID
void W25Q64_ReadID(uint8_t *MID, uint16_t *DID)
{MySPI_Start();//指令MySPI_SwapByte(W25Q64_JEDEC_ID);//置换ID数据*MID = MySPI_SwapByte(W25Q64_DUMMY_BYTE);//DID先高八位后低八位*DID = MySPI_SwapByte(W25Q64_DUMMY_BYTE);*DID <<= 8;*DID |= MySPI_SwapByte(W25Q64_DUMMY_BYTE); MySPI_Stop();
}//写使能,在页编程和扇区擦除开头使用
void W25Q64_WriteEnable(void)
{MySPI_Start();MySPI_SwapByte(W25Q64_WRITE_ENABLE);MySPI_Stop();
}//等待BUSY,在页编程和扇区擦除末尾使用
void W25Q64_WaitBusy(void)
{MySPI_Start();MySPI_SwapByte(W25Q64_READ_STATUS_REGISTER_1);//等待状态寄存器1最低位BUSY清零while((MySPI_SwapByte(W25Q64_DUMMY_BYTE) & 0x01) == 0x01);MySPI_Stop();
}//页编程
//参数为地址(C语音无24位使用32位)、字节数组、写入字节个数(0-256使用16位)
void W25Q64_PageProgram(uint32_t Address, uint8_t *DataArray, uint16_t Count)
{uint16_t i;W25Q64_WriteEnable();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();
}//读取数据
//Count无限制,给最大类型
void W25Q64_ReadData(uint32_t Address, uint8_t *DataArray, uint32_t Count)
{uint32_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();
}
主程序
#include "stm32f10x.h"
#include "Delay.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();W25Q64_Init();OLED_ShowString(1, 1, "MID: DID:");OLED_ShowString(2, 1, "W:");OLED_ShowString(3, 1, "R:");W25Q64_ReadID(&MID, &DID);OLED_ShowHexNum(1, 5, MID, 2);OLED_ShowHexNum(1, 12, DID, 4); //写入前擦除,地址尽量对齐扇区起始地址(低三位为000)W25Q64_SectorErase(0x000000);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){}
}
相关文章:
【STM32单片机】#12 SPI通信(软件读写)
主要参考学习资料: B站江协科技 STM32入门教程-2023版 细致讲解 中文字幕 开发资料下载链接:https://pan.baidu.com/s/1h_UjuQKDX9IpP-U1Effbsw?pwddspb 单片机套装:STM32F103C8T6开发板单片机C6T6核心板 实验板最小系统板套件科协 目录 SPI…...
从请求到响应:初探spring web
引入: 首先小编想分享下一些开发小知识 2000年——手写servlet/JSP时代 在这个阶段中,那时候写后端代码,可谓是个麻烦事。 毕竟什么都要自己干 发来的请求都要写extends HttpServlet的类,手动在web.xml配置 <servlet>…...
【中间件】bthread_基础_TaskControl
TaskControl 1 Definition2 Introduce**核心职责** 3 成员解析**3.1 数据结构与线程管理****3.2 任务调度与负载均衡****3.3 线程停放与唤醒(ParkingLot)****3.4 统计与监控** 4 **工作流程**5 **设计亮点**6 **使用场景示例**7 **总结**8 学习过程中的疑…...
systemd和OpenSSH
1 systemd 1.1 配置文件 /etc/systemd/system /lib/systemd/system /run/systemd/system /usr/lib/systemd/user 1.2 commands systemctl list-unit-files | grep enable systemctl cat dlt-daemon.service systemctl cat dlt-system.service systemctl show dlt-daemon.ser…...
08 Python集合:数据 “去重神器” 和运算魔法
文章目录 一、Python 中的集合概述1. 集合的特性 二、集合的创建三、元素的遍历四、集合的运算1. 成员运算2. 二元运算3. 比较运算 五、集合的方法六、不可变集合 一、Python 中的集合概述 在 Python 里,集合(Set)是一种无序且元素唯一的数据…...
配置和使用基本存储
配置和使用基本存储 文章目录 配置和使用基本存储[toc]一、什么是卷?二、卷的类型三、使用EmptyDir卷存储数据1.了解EmptyDir卷2.测试EmptyDir卷的使用 四、使用HostPath卷挂载宿主机文件1.了解HostPath卷2.测试HostPath卷的使用 五、使用NFS卷挂载NFS共享目录1.准备…...
win11 终端 安装ffmpeg 使用终端Scoop
1、安装scoop (Windows 包管理器) Set-ExecutionPolicy RemoteSigned -Scope CurrentUser iwr -useb get.scoop.sh | iex 2、使用scoop来安装ffmpeg scoop install ffmpeg 3、测试一下ffmpeg,将Mp3文件转为Wav文件 ffmpeg -i A.mp3 A.wav 然后我们就看到A.wav生成…...
navicat中导出数据表结构并在word更改为三线表(适用于navicat导不出doc)
SELECTCOLUMN_NAME 列名,COLUMN_TYPE 数据类型,DATA_TYPE 字段类型,IS_NULLABLE 是否为空,COLUMN_DEFAULT 默认值,COLUMN_COMMENT 备注 FROMINFORMATION_SCHEMA.COLUMNS WHEREtable_schema db_animal(数据库名) AND table_name activity(…...
Azure Monitor 实战指南:全方位监控应用与基础设施
Azure Monitor 是 Azure 云原生的统一监控解决方案,能够实时追踪应用性能、基础设施健康状态及日志数据。本文将通过 实战步骤 演示如何利用 Azure Monitor 监控 GPT-4 服务、虚拟机、存储等资源,并结合自动化告警和日志分析,构建企业级监控体系。 1. Azure Monitor 核心功能…...
【人工智能】释放本地AI潜能:LM Studio用户脚本自动化DeepSeek的实战指南
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着大型语言模型(LLM)的快速发展,DeepSeek以其高效的性能和开源特性成为开发者关注的焦点。LM Studio作为一款强大的本地AI模型管理工具…...
智能体-CyberTask Orchestrator设计概要(V4.1超长版)
智能体-CyberTask Orchestrator设计概要(V4.0超长版) 一、深度演进背景与战略定位(核心篇幅拓展至2187字) (本段新增行业趋势与技术必要性论证) 1.1 全球网络安全威胁态势分析(2023-2025&…...
C# 面向对象实例演示
C# 面向对象编程实例演示 一、基础概念回顾 面向对象编程(OOP)的四大基本特性: 封装 - 将数据和操作数据的方法绑定在一起继承 - 创建新类时重用现有类的属性和方法多态 - 同一操作作用于不同对象产生不同结果抽象 - 简化复杂系…...
软件产品测试报告:如何全面评估及保障软件质量?
软件产品测试报告可以对软件产品质量做全面评估,还能够把评估结果展示出来,它依靠一系列测试手段和数据分析,能为产品的完善以及决策提供重要依据。下面从不同方面展开说明。 测试目的 开展本次软件产品测试,主要目的有三个。一…...
leetcode42-接雨水
leetcode 42 思路 本题使用 单调栈 来计算每个位置能够接住的雨水量 理解问题 题目要求计算一系列柱子之间可以接住的雨水量。输入是一个数组,每个元素代表柱子的高度。输出是一个整数,表示能够接住的水量。 找到边界条件 什么情况下可以接住雨水…...
普通IT的股票交易成长史--20250430晚
声明:本文章的内容只是自己学习的总结,不构成投资建议。文中观点基本来自yt站Andylee,美股Alpha姐,综合自己的观点得出。感谢他们的无私分享。 送给自己的话: 仓位就是生命,绝对不能满仓!&…...
Elastic Security 8.18 和 9.0 中的新功能
作者:来自 Elastic Mark Settle, Tamarian Del Conte, James Spiteri, Tinsae Erkailo, Charles Davison, Raquel Tabuyo, Kseniia Ignatovych, Paul Ewing, Smriti 检测规则的自动迁移、用于 ES|QL 的 Lookup Join、AI 功能增强,以及更多功能。 Elasti…...
使用 Vue 开发 VS Code 插件前端页面(上)
本文的方案主要参考了这篇博客: Vscode 的 extension webview 开发示例: Vue 和 React 实现 https://juejin.cn/post/7325132202970136585样例项目地址: github | vscode-webview-with-vuehttps://github.com/HiMeditator/vscode-webview-w…...
Vue Router路由原理
Vue Router 是 Vue.js 官方的路由管理器,它与 Vue.js 核心深度集成,使得构建单页应用(SPA)变得非常容易。Vue Router 的主要功能包括动态路由匹配、嵌套路由、编程式导航、命名路由、路由守卫等 Vue Router 原理 单页应用&#x…...
Tauri v1 与 v2 配置对比
本文档对比 Tauri v1 和 v2 版本的配置结构和内容差异,帮助开发者了解版本变更并进行迁移。 配置结构变化 v1 配置结构 {"package": { ... },"tauri": { "allowlist": { ... },"bundle": { ... },"security":…...
详解 MyBatis-Plus 框架中 QueryWrapper 类
QueryWrapper 一、 QueryWrapper 的概念为什么需要 QueryWrapper? 二、 QueryWrapper 的基本使用1. 创建 QueryWrapper 实例2. 添加查询条件3. 执行查询 三、 QueryWrapper 的常见方法1. 基本条件方法1.1 eq - 等于1.2 ne - 不等于1.3 gt - 大于1.4 ge - 大于等于1.…...
小米MiMo-7B大模型:解锁推理潜力的新传奇!
在大语言模型(LLMs)蓬勃发展的时代,推理能力成为衡量模型优劣的关键指标。今天为大家解读的这篇论文,介绍了小米的MiMo-7B模型,它通过独特的预训练和后训练优化,展现出强大的推理实力,快来一探究…...
联邦学习的收敛性分析(全设备参与,不同本地训练轮次)
联邦学习的收敛性分析 在联邦学习中,我们的目标是分析全局模型的收敛性,考虑设备异构性(不同用户的本地训练轮次不同)和数据异质性(用户数据分布不均匀)。以下推导从全局模型更新开始,逐步引入假设并推导期望损失的递减关系,最终给出收敛性结论。 1. 全局模型更新与泰…...
硬件工程师面试常见问题(10)
第四十六问:锁存器,触发器,寄存器三者的区别 触发器:能够存储一位二值信号的基本单元电路统称为 "触发器"。(单位) 锁存器:一位触发器只能传送或存储一位数据,而在实际工…...
1295. 统计位数为偶数的数字
题目 解法一 遍历数组挨个判断元素位数并统计(我的第一想法) class Solution { public:int findNumbers(vector<int>& nums) {int result 0;for(int n: nums){if(judge(n)) result;}return result;}bool judge(int a){int sum 1;a a / 10…...
3.1/Q1,Charls最新文章解读
文章题目:Social participation patterns and associations with subsequent cognitive function in older adults with cognitive impairment: a latent class analysis DOI:10.3389/fmed.2025.1493359 中文标题:认知障碍老年人的社会参与模…...
楼宇智能化四章【期末复习】
四、火灾自动报警系统 结构组成:火灾探测器、区域报警器、集中报警器 形式:1. 多线制系统 2.总线制系统 3.集中智能系统 4.分布智能系统 5.网络通信系统 工作原理: 以下是关于火灾自动报警系统及相关灭火系统的详细解答: 1. 火灾自动报警系统有哪几种形式? 区…...
Splunk 使用Role 实现数据隔离
很多人知道 Splunk 有很多自带的Role, 今天我就要说说定制化的Role: 1: 在创建新role 的界面: 2: 在如下的界面,可以定制allow index name: 3: 创建好新Role 后,在SAML 添加新的group 的时候,就可以看到Role 给某个group: 4: 这样一个特定组的人来申请Splunk 权限,就可…...
Learning vtkjs之ImplicitBoolean
隐式函数布尔操作 介绍 vtkImplicitBoolean 允许对隐式函数(如平面、球体、圆柱体和盒子)进行布尔组合。操作包括并集、交集和差集。可以指定多个隐式函数(所有函数都使用相同的操作进行组合)。 支持的操作:‘UNION…...
LabelVision - yolo可视化标注工具
LabelVision是一款可视化图像标注工具,主要用于计算机视觉研究中的各种标注任务。 支持多边形、矩形、圆形等多种标注方式,并且可以输出JSON、COCO等多种数据格式,方便与其他软件和框架进行集成和互操作。 通过它可以很轻易的对图像进行标注,适合Y…...
系统分析师-第十五章
学习目标 通过参加考试,训练学习能力,而非单纯以拿证为目的。 1.在复习过程中,训练快速阅读能力、掌握三遍读书法、运用番茄工作法。 2.从底层逻辑角度理解知识点,避免死记硬背。 3.通过考试验证学习效果。 学习阶段 快速阅读 …...
大连理工大学选修课——机器学习笔记(3):KNN原理及应用
KNN原理及应用 机器学习方法的分类 基于概率统计的方法 K-近邻(KNN)贝叶斯模型最小均值距离最大熵模型条件随机场(CRF)隐马尔可夫模型(HMM) 基于判别式的方法 决策树(DT)感知机…...
09 Python字典揭秘:数据的高效存储
文章目录 一.字典是什么1.字典的特点 二.字典的创建和使用三.字典的操作1.访问元素2.修改元素3.删除元素4.遍历字典5.成员运算 四.字典方法1.获取字典中的指定元素2.获取字典中的元素3.字典合并4.删除元素 一.字典是什么 在 Python 中,字典(dict&#x…...
20250430在ubuntu14.04.6系统上完成编译NanoPi NEO开发板的FriendlyCore系统【严重不推荐,属于没苦硬吃】
【开始编译SDK之前需要更新源】 rootrootubuntu:~/friendlywrt-h3$ sudo apt update 【这两个目录你在ubuntu14.04.6系统上貌似git clone异常了】 Y:\friendlywrt-h3\out\wireguard Y:\friendlywrt-h3\kernel\exfat-nofuse 【需要单线程编译文件系统,原因不明】 Y:…...
第五部分:进阶项目实战
在前面的学习中,我们已经掌握了图像和视频的基础操作、增强滤波、特征提取以及一些基础的目标检测方法。现在,我们将综合运用这些知识来构建一些更复杂、更实用的应用项目。 这一部分的项目将结合前面学到的技术,并介绍一些新的概念和工具&a…...
【Linux】记录一个有用PS1
PS1 是用来定义shell提示符的环境变量 下面是一个带有颜色和丰富信息的 Linux PS1 配置示例,包含用户名、主机名、路径、时间、Git 分支和退出状态提示: # 添加到 ~/.bashrc 文件末尾 PS1\[\e[1;32m\]\u\[\e[m\] # 绿色粗体用户名 PS…...
【SpringBoot】基于mybatisPlus的博客管理系统(2)
目录 1.实现用户登录 Jwt令牌 1.引入依赖 2.生成令牌(token) Controller Service Mapper 2.实现强制登录 定义拦截器: 配置拦截器: 1.实现用户登录 在之前的项目登录中,我使用的是Session传递用户信息实现校验…...
免费在Colab运行Qwen3-0.6B——轻量高性能实战
Qwen一直在默默地接连推出新模型。 每个模型都配备了如此强大的功能和高度量化的规模,让人无法忽视。 继今年的QvQ、Qwen2.5-VL和Qwen2.5-Omni之后,Qwen团队现在发布了他们最新的模型系列——Qwen3。 这次他们不是发布一个而是发布了八个不同的模型——参数范围从6亿到235…...
精益数据分析(35/26):SaaS商业模式关键指标解析
精益数据分析(35/26):SaaS商业模式关键指标解析 在创业与数据分析的征程中,我们持续探索不同商业模式的运营奥秘。今天,我们带着共同进步的期望,深入研读《精益数据分析》,聚焦SaaS商业模式&am…...
【论文速读】《Scaling Scaling Laws with Board Games》
论文链接:https://arxiv.org/pdf/2104.03113 《Scaling Scaling Laws with Board Games》:探索棋盘游戏中的扩展规律 摘要 如今,机器学习领域中规模最大的实验所需的资源,超出了仅有几家机构的预算。幸运的是,最近的…...
C++ 与多技术融合的深度实践:从 AI 到硬件的全栈协同
在数字化技术高速发展的今天,C 凭借其卓越的性能优势和底层控制能力,成为连接上层应用与底层硬件的核心纽带。这种独特定位使其在与 AI 深度学习、Python 生态及硬件加速技术的融合中展现出不可替代的价值,构建起从算法实现到硬件优化的全栈技…...
AdaBoost算法的原理及Python实现
一、概述 AdaBoost(Adaptive Boosting,自适应提升)是一种迭代式的集成学习算法,通过不断调整样本权重,提升弱学习器性能,最终集成为一个强学习器。它继承了 Boosting 的基本思想和关键机制,但在…...
无刷马达驱动芯片算法逐步革新着风扇灯行业--其利天下
风扇灯市场热度持续攀升,根据行业数据,风扇灯市场规模从2010年的100亿元增长至2019年的200亿元,年均复合增长率超10%,预计2025年将达30%,借此其利天下有限公司进一步提升了无刷风扇灯驱动方案。 一、性能参数 电压&a…...
数据库系统综合应用与深度实践指南
前言 在当今数据驱动的时代,数据库技术已成为信息系统的核心支柱。从简单的数据存储到复杂的企业级应用,数据库系统支撑着现代社会的方方面面。本文作为一篇综合性的数据库科普文章,旨在为读者提供从基础到进阶的完整知识体系,涵…...
「Unity3D」TextMeshPro使用TMP_InputField实现,输入框高度自动扩展与收缩
先看实现效果: 要实现这个效果,有三个方面的问题需要解决: 第一,输入框的高度扩展,内部子元素会随着锚点,拉伸变形——要解决这个问题,需要将内部元素改变父类,然后增加父类高度&am…...
SAP-ABAP:在SAP系统中,COEP表(成本控制对象行项目表)详解
在SAP系统中,**COEP表(成本控制对象行项目表)**是成本控制(CO)模块的核心数据表之一,主要用于存储与成本核算相关的详细行项目数据。以下是对其作用的详细解析: 一、 COEP表的核心作用 存储成本…...
crashpad 编译
一环境配置 1.1设置系统UTF8编码 1.2vs2017语言环境设置英文包 二.获取depot_tools(此步骤可以跳过 最新工具包已上传下载使用即可) windows下载压缩包,然后放到系统PATH中 下载完以后,基本就是靠depot_tools这个工具集合了&am…...
Windows系统安装Docker(Win10系统升级,然后安装)
有时需要在自己笔记本跑下代码,所以安装Dockers,步骤如下: 1. 升级系统(Windows10专业版或者Windows11) Windows10家庭版装Docker较麻烦,所以我将Win10升级为Win11了(免费)&#x…...
【Fifty Project - D21】
今日完成记录 TimePlan完成情况9:00 - 10:00爬楼梯√12:00 - 14:00Leetcode√14:00 - 15:00《挪威的森林》√ Leetcode 每日一题 今天的每日一题是个easy:给定一个数组,要求统计…...
中央网信办部署开展“清朗·整治AI技术滥用”专项行动
为规范AI服务和应用,促进行业健康有序发展,保障公民合法权益,近日,中央网信办印发通知,在全国范围内部署开展为期3个月的“清朗整治AI技术滥用”专项行动。 中央网信办有关负责人表示,本次专项行动分两个阶…...
《Python实战进阶》 No46:CPython的GIL与多线程优化
Python实战进阶 No46:CPython的GIL与多线程优化 摘要 全局解释器锁(GIL)是CPython的核心机制,它保证了线程安全却限制了多核性能。本节通过concurrent.futures、C扩展优化和多进程架构,实战演示如何突破GIL限制&#…...