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

唯一设备序列号(UID)、唯一产品识别码(UPI)和备份寄存器BKP

文章目录

  • 一、唯一设备序列号UID
  • 二、唯一产品识别码UPI
  • 三、备份寄存器BKP


一、唯一设备序列号UID

MCU 系列产品内置两个不同长度的唯一设备序列号,分别为 96 位的 UID(Unique device ID)和 128 位的UCID(Unique Customer ID),这两个设备序列号存放在闪存存储器的系统配置块中,它们所包含的信息在出厂时编写,并保证对任意一个 MCU 微控制器在任何情况下都是唯一的,用户应用程序或外部设备可以通过CPU 或 JTAG/SWD 接口读取,不可被修改。

UID 为 96 位,通常用来做为序列号或作为密码,在编写闪存时,将此唯一标识与软件加解密算法相结合,进一步提高代码在闪存存储器内的安全性,也可用于激活带安全功能的自举程序(Secure Bootloader)。
UCID 为 128 位,具体根据芯片厂商序列号定义,它包含芯片生产及版本相关信息。

那么 如何获取一个芯片的UID即UCID呢,可以根据芯片生产商去官网下载软件开发包,获取给出的例程,一般情况下厂商都会给出接口,直接调用即可,在指定地址处读出序列号数据,可参考如下示例:

void GetUID(uint8_t *UIDbuf)
{uint8_t num = 0;uint32_t* uid_addr = (void*)0;uint32_t temp = 0;if (0xFFFFFFFF == *(uint32_t*)(0x1FFFF270)){uid_addr = (uint32_t*)UID_BASE;}else{uid_addr = (uint32_t*)(0x1FFFF270);}for (num = 0; num < UID_LENGTH;){temp = *(__IO uint32_t*)(uid_addr++);UIDbuf[num++] = (temp & 0xFF);UIDbuf[num++] = (temp & 0xFF00) >> 8;UIDbuf[num++] = (temp & 0xFF0000) >> 16;UIDbuf[num++] = (temp & 0xFF000000) >> 24;}
}void GetUCID(uint8_t *UCIDbuf)
{uint8_t num = 0;uint32_t* ucid_addr = (void*)0;uint32_t temp = 0;if (0xFFFFFFFF == *(uint32_t*)(0x1FFFF260)){ucid_addr = (uint32_t*)UCID_BASE;}else{ucid_addr = (uint32_t*)(0x1FFFF260);}for (num = 0; num < UCID_LENGTH;){temp = *(__IO uint32_t*)(ucid_addr++); UCIDbuf[num++] = (temp & 0xFF);UCIDbuf[num++] = (temp & 0xFF00) >> 8;UCIDbuf[num++] = (temp & 0xFF0000) >> 16;UCIDbuf[num++] = (temp & 0xFF000000) >> 24;}
}

二、唯一产品识别码UPI

产品在量产出售时都会贴一个产品识别码用于标注出货和售后,具体结构可参考如下:在这里插入图片描述
其中MFC表示制造商代码,PMC表示产品型号代码,SN表示序列号,可以通过第一章说到的UID 96位压缩而成。
其中,

三、备份寄存器BKP

在实际软件开发中,有一些数据你希望保存在mcu中,不被轻易擦除更改,可能你第一想到的是内部Flash,但当系统重新烧录时flash里面的数据会被覆盖或者擦除,这是你不愿看到的,所以这里我给大家介绍一个寄存器来存储少量数据,不易丢失。

BKP 寄存器是 16 位的可寻址寄存器。备份存储器位于备份域里,电源 VDD 关闭后由 VBAT 供电维持。BKP 共有 42 个 16 位的寄存器,可用来存储并保护用户应用数据。这 84 个字节不受系统待机模式唤醒或系统复位的影响。

此外,BKP 控制寄存器具有入侵检测功能。当系统发生复位,为保护备份域防止意外操作,所有的写操作都被禁止。如需使能,首先设置寄存器RCC_APB1PCLKEN.PWREN 和 RCC_APB1PCLKEN.BKPEN 位打开电源和后备接口时钟,然后设置PWR_CTRL.DBKP 位使能对备份寄存器的写操作。

功能描述:掉电备份、入侵检测
入侵检测事件会清除所有备份数据寄存器内容。配置 BKP_CTRL.TP_EN 位可使能TAMPER 管脚的检测功能。需要注意的是,入侵检测信号是电平检测信号与BKP_CTRL.TP_EN 位的逻辑与,因此入侵检测应该在TAMPER 管脚使能前配置。当检测到入侵事件时,BKP_CTRLSTS .TEF 位被置‘1’。如果入侵检测中断使能(BKP_CTRLSTS.TPINT_EN位置’1’),会产生一个中断。为避免软件在入侵检测管脚上仍然有入侵事件时对备份数据寄存器进行写操作,当清除入侵事件后,应关闭入侵检测引脚TAMPER 的检测功能。备份数据寄存器操作结束后再对 BKP_CTRL.TP_EN 位置‘1’。BKP_CTRL.TP_ALEV位用于设定入侵检测事件的有效电平。当BKP_CTRL.TP_ALEV=0或1,如果TAMPER引脚在使能之前已经为高或低,尽管 TAMPER 引脚上没有上升或下降沿信号,仍会发生一个额外的入侵事件。因此,TAMPER 引脚应该在片外连接到正确的电平。
在这里插入图片描述
在这里插入图片描述在这里插入图片描述注: 同时设置 BKP_CTRL.TP_ALEV 和 BKP_CTRL.TP_EN 位总是安全的。然而,同时清除两者会产生一个假的入侵事件。因此,推荐只在 BKP_CTRL.TP_EN 为 0 时才改变BKP_CTRL.TP_ALEV 位的状态。
在这里插入图片描述

相关文章:

唯一设备序列号(UID)、唯一产品识别码(UPI)和备份寄存器BKP

文章目录 一、唯一设备序列号UID二、唯一产品识别码UPI三、备份寄存器BKP 一、唯一设备序列号UID MCU 系列产品内置两个不同长度的唯一设备序列号&#xff0c;分别为 96 位的 UID(Unique device ID)和 128 位的UCID(Unique Customer ID)&#xff0c;这两个设备序列号存放在闪存…...

Kafka - 消费者程序仅消费一半分区消息的问题

1. 问题描述 修改安全服务状态有时逻辑正常有时候逻辑不正常&#xff0c;排查incident服务的日志发现消息可以正常发送到 kafka topic &#xff0c;但是incident-cron 服务有时候有拉取消息的日志有时候没有日志。 kafka 生产者可以将消息正常发送到 kafka topic &#xff0c…...

养老院管理系统+小程序项目需求分析文档

智慧综合养老服务平台是以业务为牵引、场景为驱动&#xff0c;围绕“老人”业务域&#xff0c;持续沉淀和打磨形成适应不同养老业务发展需要的业务能力&#xff0c;推动业务模式升级&#xff0c;为养老服务提供数字化解决方案&#xff0c;并依托实体站点与养老机构实现线上线下…...

K8s 下通过prometheus监控 nginx

k8s 下有两个版本的nginx ingress 分别是 ingress nginx 以及 nginx ingress Ingress-nginx 与 Nginx-ingress - LeoZhanggg - 博客园 这里我讨论的是 nginx ingress Nginx Ingress 使用Prometheus 导出数据 nginx ingress 本身支持通过支持这个提供prometheus 格式的…...

基于SpringBoot的京东绿谷旅游信息服务平台设计与实现(源码+定制+开发)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…...

使用Redis生成全局唯一id

为了生成一个符合要求的分布式全局ID&#xff0c;我们可以使用 StringRedisTemplate 来实现。这个ID由三部分组成&#xff1a; 符号位&#xff08;1 bit&#xff09;&#xff1a;始终为0&#xff0c;表示正数。时间戳&#xff08;31 bit&#xff09;&#xff1a;表示从某个起始…...

pytorch自定义算子导出onnx

文章目录 1、为什么要自定义算子&#xff1f;2、如何自定义算子3、自定义算子导出onnx4、example1、重写一个pytorch 自定义算子&#xff08;实现自定义激活函数&#xff09;2、现有算子上封装pytorch 自定义算子&#xff08;实现动态放大超分辨率模型&#xff09; 1、为什么要…...

从搭建uni-app+vue3工程开始

技术栈 uni-app、vue3、typescript、vite、sass、uview-plus、pinia、axios 一、项目搭建 1、创建以 typescript 开发的工程 npx degit dcloudio/uni-preset-vue#vite-ts my-vue3-project2、安装sass npm install -D sass// 安装sass-loader&#xff0c;注意需要版本10&…...

波点音乐自动点击

波点音乐 import uiautomator2 as u2 import time import sys import os# 动态点击时间&#xff0c;打印剩余时间 def dynamic_sleep(seconds):wait_time secondsfor i in range(wait_time):print(f"Waiting... {wait_time - i} seconds remaining")sys.stdout.flu…...

【一篇搞定配置】wget 下载与安装(Window)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;各种软件安装与配置_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1.…...

2025年春招修订版《C/C++笔面试系列》(1) C语言经典笔面试题(上)

C语言是嵌入式开发的常用语言&#xff0c;也是主要语言&#xff0c;很多企业在招聘嵌入式软件工程师时&#xff0c;C语言的熟练程度是一个重要考察点。笔试也是以C语言为主&#xff0c;所以想要拿到面试机会&#xff0c;还得通过C语言笔试&#xff0c;本专题总结了各大企业C语言…...

【042C】基于51RFID门禁系统(LCD12864显示)【Proteus仿真+Keil程序+报告+原理图】

☆、设计硬件组成&#xff1a;51单片机最小系统RFID读卡器4*4矩阵键盘AT24C02存储芯片LCD12864液晶显示继电器蜂鸣器LED灯。 1、设计采用STC89C52、AT89C52、AT89S52作为主控芯片&#xff0c;采用LCD12864液晶显示屏实时显示门禁系统&#xff1b; 2、系统集成两种解锁方式&am…...

scratch二次开发:blockly工作区垃圾桶和进度条的隐藏和显示

大家好&#xff0c;我是小黄。 本期给大家介绍的内容是实现blockly工作区的垃圾桶和进度条的显示和隐藏实现。 本次基于的项目源码大家可以关注小黄回复垃圾桶自行获取。 一.垃圾桶的显示和实现。 在blockly中&#xff0c;我们进行块的删除的时候最常用的两种方法是&#xf…...

【STM32】MPU6050初始化常用寄存器说明及示例代码

一、MPU6050常用配置寄存器 1、电源管理寄存器1&#xff08; PWR_MGMT_1 &#xff09; 此寄存器允许用户配置电源模式和时钟源。 DEVICE_RESET &#xff1a;用于控制复位的比特位。设置为1时复位 MPU6050&#xff0c;内部寄存器恢复为默认值&#xff0c;复位结束…...

LDR6020驱动的Type-C接口显示器解决方案

一、引言 随着科技的飞速发展&#xff0c;Type-C接口凭借其高速数据传输、强大的电力传输能力以及便捷的正反可插设计&#xff0c;正逐渐成为现代电子设备的主流接口标准。在显示器领域&#xff0c;Type-C接口的引入不仅简化了线缆连接&#xff0c;还为用户带来了更丰富的功能…...

Spring Boot + Android 实现登录功能

在移动互联网的今天&#xff0c;许多应用需要通过移动端实现与服务器的交互功能&#xff0c;其中登录是最常见且基础的一种功能。通过登录&#xff0c;用户可以获得独特的身份标识&#xff0c;从而访问特定的资源或服务。本篇博客将详细介绍如何使用 Spring Boot 和 Android 实…...

【通俗理解】边际化技巧在概率论中的应用——从公式到实例

【通俗理解】边际化技巧在概率论中的应用——从公式到实例 关键词提炼 #边际化技巧 #概率论 #联合概率 #条件概率 #积分计算 #概率分布 #贝叶斯推断 第一节&#xff1a;边际化技巧的类比与核心概念【尽可能通俗】 边际化技巧&#xff0c;就像是你在一个复杂的概率迷宫中&am…...

Chen_AdaMV-MoE_Adaptive_Multi-Task_Vision_Mixture-of-Experts 译文

摘要 稀疏激活的专家混合&#xff08;MoE&#xff09;正在成为多任务学习&#xff08;MTL&#xff09;的一个有前途的范例。 MoE 不是将多个任务的知识压缩到单个模型中&#xff0c;而是分离参数空间&#xff0c;仅利用给定任务类型及其输入的相关模型片段&#xff0c;从而提供…...

多线程下使用数据库 - 20241124

问题 并发性较低&#xff0c;每秒千次但是较高一致性&#xff0c;比如利用数据库中的数据进行判断是否执行某个操作 存在的问题是&#xff0c;如何只锁定判断相关的数据&#xff0c;而不影响数据库操作无关数据。脏读/不可重复读/幻读 解决方案 利用数据InnoDB引擎的LBCC和…...

GMAN解读(论文+代码)

一、注意力机制 注意力机制与传统的卷积神经网络不同的是&#xff0c;前者擅长捕获全局依赖和长程关系&#xff0c;权重会动态调整。而后者对于所有特征都使用同一个卷积核。关于更多注意力机制内容&#xff0c;详见&#xff1a; 注意力机制、自注意力机制、多头注意力机制、通…...

《文件操作》

一 . 文本文件和二进制文件 根据数据的组织形式&#xff0c;数据文件被分为了二进制文件和文本文件 数据在内存中是以二进制的形式存储&#xff0c;如果不加转换的输出到外存的文件中&#xff0c;就是二进制文件。 如果要求在外存上以ASCII 码的形式存储&#xff0c;则需要再存…...

【君正T31开发记录】8.了解rtsp协议及设计模式

前边搞定了驱动&#xff0c;先不着急直接上手撸应用层的代码&#xff0c;先了解一下大致要用到的东西。 设计PC端先用vlc rtsp暂时H264编码&#xff08;vlc好像不支持h265,这个后边我试试&#xff09;的视频流&#xff0c;先需要支持上rtsp server&#xff0c;了解rtsp协议是必…...

C++菜鸟教程 - 从入门到精通 第三节

上节课的题 上节课的题,大家都做出来了吗? 看一下这道题: 题目描述 N!1*2*...*N; 例5!1*2*3*4*5120. 编程求1!2!3!...N!. 输入 输入一行&#xff0c;只有一个整数n (1<n<10) 输出 输出只有一行&#xff08;这意味着末尾有一个回车符号&#xff09;&#xff0c;包括1…...

原生JS和CSS,HTML实现开屏弹窗

开屏弹窗常应用于打开游戏&#xff0c;或者打开网站的时候&#xff0c;跳出来在正中间&#xff0c;来显示一些信息&#xff0c;并可以设置今日不再显示 CSS代码如下 <style>#box {width: 100vw;height: 100vh;background-color: rgba(0, 0, 0, 0.2);position: relative…...

微软发布Win11 24H2系统11月可选更新KB5046740!

系统之家11月22日报道&#xff0c;微软针对Win11 24H2系统推出2024年11月最新可选更新补丁KB5046740&#xff0c;更新后系统版本后升至26100.2454&#xff0c;此次更新后修复当应用程序以PDF和XLSX格式导出图表对象时停止响应、无法使用API查找旋转信息等问题。以下小编将给大家…...

【Rabbitmq篇】高级特性----TTL,死信队列,延迟队列

目录 一.TTL 1.设置消息的TTL 2.设置队列的TTL 3.俩者区别 二.死信队列 定义&#xff1a; 消息成为死信的原因&#xff1a; 1.消息被拒绝&#xff08;basic.reject 或 basic.nack&#xff09; 2.消息过期&#xff08;TTL&#xff09; 3.队列达到最大长度 ​编辑 …...

【Linux】gcc/g++使用

编译 我们知道&#xff0c;gcc只能编译C&#xff0c;g既能编译C&#xff0c;也能编译C。 由于两者的选项是相同的&#xff0c;这里我们使用gcc来说明。 这就是一个我们在linux中gcc编译一段代码后会自动生成一个a.out为名的可执行文件&#xff0c;然后我们./a.out&#xff0c…...

IDEA2023 SpringBoot整合MyBatis(三)

一、数据库表 CREATE TABLE students (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(100) NOT NULL,age INT,gender ENUM(Male, Female, Other),email VARCHAR(100) UNIQUE,phone_number VARCHAR(20),address VARCHAR(255),date_of_birth DATE,enrollment_date DATE,cours…...

Java网络编程 - cookiesession

cookie 之前学习了 Okhttp3 库可以调用API、抓取网页、下载文件。但是这些操作都是不要求登录的&#xff0c;如果 API、网页、文件等内容要求登录才能访问&#xff0c;就需要学习新的 cookie 相关的知识。 下面以豆瓣为例&#xff0c;使用 Java 程序读取“我的豆瓣”页面内容…...

100.【C语言】数据结构之二叉树的堆实现(顺序结构) 1

目录 1.顺序结构 2.示意图 ​编辑 从物理结构还原为逻辑结构的方法 3.父子节点编号的规律 4.顺序存储的前提条件 5.堆的简介 堆的定义 堆的两个重要性质 小根堆和大根堆 6.堆的插入 7.堆的实现及操作堆的函数 堆的结构体定义 堆初始化函数HeapInit 堆插入元素函…...

《Python基础》之循环结构

目录 简介 一、for循环 1、基本语法与作用 2、使用 range() 函数配合 for 循环 3、嵌套的for循环 二、while循环 1、基本语法与作用 2、while 循环嵌套 &#xff08;1&#xff09;、while循环与while循环嵌套 &#xff08;2&#xff09;、while循环与for循环嵌套 简介 …...

使用JDBC操作数据库

文章目录 使用JDBC操作数据库1. JDBC访问数据库步骤2. Statement与PreparedStatement区别3. JDBC的内容4. JDBC封装4.1 为什么进行JDBC封装4.2 实现JDBC封装4.3 什么是DAO4.4 配置数据库访问参数4.5 配置数据库连接池使用之JNDI的方式 5. 单例模式5.1 懒汉模式5.2 饿汉模式 使用…...

轻松解析 PDF 文档:深入了解 Python 的 pdfplumber 库

轻松解析 PDF 文档&#xff1a;深入了解 Python 的 pdfplumber 库 PDF 是一种常见的文件格式&#xff0c;广泛用于报告、文档、表单等领域。然而&#xff0c;如何高效解析 PDF 内容&#xff08;尤其是文本和表格&#xff09;&#xff0c;一直是开发者面临的挑战。pdfplumber 是…...

实验五 时域采样与频域采样

时域采样理论的验证 【实例3-1】近似绘制x (n) R4n 在(0,2 π \pi π ) 上的幅频响应曲线( F T [ x ( n ) ] FT[x(n)] FT[x(n)] )。 x [1, 1, 1, 1]; N 64; xk fft(x, N); figure; subplot(2, 1, 1); stem(0:3, x, .); subplot(2, 1, 2); k 0:N-1; plot(2*k/N, abs(x…...

爬虫cookie反爬------加速乐(jsl)

加速乐 反爬虫技术&#xff1a;加速乐采用了包括OB混淆、动态加密算法和多层Cookie获取等高级反爬虫技术&#xff0c;确保整体校验的严密性。关键校验字段位于Cookie中的 __jsl_clearance_s&#xff0c;其验证过程通常涉及三次关键的请求&#xff0c;有效抵御恶意爬虫的侵扰。…...

设计模式——解释器模式

定义&#xff1a; 解释器模式是一种行为设计模式&#xff0c;它给定一个语言&#xff0c;定义它的文法的一种表示&#xff0c;并定义一个解释器&#xff0c;这个解释器使用该表示来解释语言中的句子。在这种模式中&#xff0c;通常会将一个复杂的表达式&#xff08;如数学表达…...

sorted()函数

sorted(iterable, keyNone, reverseFalse)iterable: 需要排序的可迭代对象&#xff08;如列表、元组、字符串等&#xff09;。 key: 一个函数&#xff0c;用于从每个元素中提取排序的依据。如果未指定&#xff0c;默认直接比较元素本身。 reverse: 一个布尔值&#xff0c;Tru…...

动静态分析

静态分析 获取哈希值&#xff1a; 查壳&#xff1a; 导出函数&#xff1a; 获取资源信息&#xff1a; 通过发现dos头和pe头&#xff0c;来确定它是个可执行程序。 动态分析...

2024年信号处理与神经网络应用国际学术会议(SPNNA 2024)

重要信息 会议时间&#xff1a;2024年12月13-15日 会议地点&#xff1a;中国武汉 会议官网&#xff1a;www.spnna.org 会议简介 2024年信号处理与神经网络应用国际学术会议&#xff08;SPNNA 2024&#xff09;将于2024年12月13日至15日在中国武汉召开。本次会议旨在为全球研…...

winfrom快速自适应

在软件界面设计中&#xff0c;我们通常需要添加各种布局器和规则来实现界面布局&#xff0c;但对于不太熟练的工程师来说&#xff0c;这可能存在一定难度。这里要分享一种自适应布局的方法&#xff0c;它可以根据界面比例自动缩放内容控件&#xff0c;在较短时间内完成软件布局…...

VMware16安装macOS12【详细教程】

因为在应用上线IOS应用商店时&#xff0c;需要用到mac系统进行&#xff0c;于是就在VMware16pro虚拟机进行安装macOS12系统&#xff0c;安装的过程做了一个记录&#xff0c;希望对你有所帮助&#xff01; 前言 首先需要下载好下面工具&#xff1a; VMware workstation pro 16…...

【设计模式】【创建型模式(Creational Patterns)】之单例模式

单例模式是一种常用的创建型设计模式&#xff0c;其目的是确保一个类只有一个实例&#xff0c;并提供一个全局访问点。 单例模式的原理 单例模式的核心在于控制类的实例化过程&#xff0c;通常通过以下方式实现&#xff1a; 私有化构造函数&#xff0c;防止外部直接实例化。…...

【1.2 Getting Started--->Installation Guide】

NVIDIA TensorRT DOCS 此 NVIDIA TensorRT 10.6.0 安装指南提供安装要求、TensorRT 包中包含的内容列表以及安装 TensorRT 的分步说明。 安装指南 摘要&#xff1a; 本 NVIDIA TensorRT 10.3.0 安装指南提供了安装要求、TensorRT 软件包中包含的内容列表以及安装 TensorRT 的…...

Vue 中 data 属性为函数的深度剖析:原理、区别与实践

在 Vue.js 中,data 属性通常是一个 函数 而不是一个对象,这背后有一系列设计上的原因和原理,尤其是与 Vue 的组件系统、实例化机制、以及响应式数据的管理有关。下面我将详细解答这个问题,并结合实际项目示例和代码分析,进行全面讲解。 1. Vue 中 data 为什么是一个函数而…...

【漏洞复现】H3C 用户自助服务平台 dynamiccontent.properties.xhtml 远程命令执行

免责声明: 本文旨在提供有关特定漏洞的信息,以帮助用户了解潜在风险。发布此信息旨在促进网络安全意识和技术进步,并非出于恶意。读者应理解,利用本文提到的漏洞或进行相关测试可能违反法律或服务协议。未经授权访问系统、网络或应用程序可能导致法律责任或严重后果…...

【技术支持】vscode不使用插件,两种方式重命名html标签对

1. 使用 VS Code 内置功能 VS Code 内置支持 HTML/XML 标签对的重命名功能。步骤如下&#xff1a; 将光标放置在标签名上&#xff08;如 <div> 或</div>&#xff09;。按下快捷键 F2&#xff08;重命名符号&#xff09;。输入新的标签名&#xff0c;按 Enter&…...

【Seed-Labs 2.0】The Kaminsky Attack Lab

说在前面 本实验属为Seed-Labs 的DNS LAB 中的第二个实验&#xff0c;是第一个实验的延伸&#xff0c;从攻击者和受害者同一个LAN中变成不在同一个LAN中&#xff0c;该系列一共有五个实验: Local DNS Attack LabThe Kaminsky Attack LabDNS Rebinding Attack LabDNS Infrastr…...

node.js中使用express.static()托管静态资源

express.static()定义 express.static(root, [options])是一个中间件函数&#xff0c;负责为Express应用提供静态资源服务。它允许你指定一个或多个目录作为静态资源的根目录&#xff0c;当客户端请求这些资源时&#xff0c;Express会查找并返回对应的文件。 安装express npm i…...

SQL MAX() 函数深入解析

SQL MAX() 函数深入解析 概述 SQL&#xff08;Structured Query Language&#xff09;是一种广泛使用的数据库查询语言&#xff0c;它允许用户从数据库中检索、更新和管理数据。在SQL中&#xff0c;MAX() 函数是一个常用的聚合函数&#xff0c;用于从数据集中找出某一列的最大…...

WPF——自定义ToolTip

问题 前一天制作的图标按钮&#xff0c;在测试的过程中发现一个问题&#xff1a;为图标按钮添加的提示如下图所示&#xff0c;它的显示效果非常差&#xff0c;甚至不能看清文本内容&#xff0c;并且其字体与颜色也不是愚所希望的。 产生原因 此是由于tooltip有一个默认的样式…...