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

stm32之FLASH

目录

  • 1.简介
  • 2.闪存模块组织
  • 3.基本结构
    • 3.1 FPEC
    • 3.2 程序存储器
      • 3.2.1 标准编程
      • 3.2.2 页擦除
      • 3.2.3 全擦除
    • 3.3 选项字节
      • 3.3.1 编程
      • 3.3.2 擦除
  • 4.器件电子签名
  • 5.实验-读取内部FLASH

img

1.简介

STM32F1系列的FLASH内存是一个非常重要的存储区域,它主要由三个部分组成:程序存储器系统存储器选项字节

1. 程序存储器(Program Memory)

程序存储器用于存放固化在微控制器中的程序代码。它是一个非易失性存储器,也就是说,当电源断开时,存储在其中的数据不会丢失。

  • 程序存储器通常是STM32系列微控制器中最大的存储区域,存储着应用程序的代码。
  • 在开发过程中,程序存储器的主要作用是存储用户编写的程序代码,程序代码的加载和执行都依赖于这个区域。

2. 系统存储器(System Memory)

系统存储器是由微控制器厂商预先配置的存储区域,通常用于存储引导程序(Bootloader)和启动代码。

  • 引导程序是用来初始化硬件、加载应用程序或者通过特定方式进行程序下载的代码。
  • 它也可以在没有外部存储设备的情况下启动系统。

3. 选项字节(Option Bytes)

选项字节存储了一些控制和配置微控制器的参数,比如读写保护启动模式上电复位配置等。

  • 选项字节的设置通常在开发初期完成,并且修改后,通常不需要再更改。它们为系统提供了基本的启动和保护功能。

4. FLASH存储的功能

STM32F1系列的FLASH不仅可以用于存储程序代码,还具有一些额外的功能,主要用于支持用户数据的存储和系统自我更新。

用户数据存储

  • 利用程序存储器的剩余空间保存用户数据
    在程序中,你可以利用程序存储器中未使用的部分来保存一些掉电不丢失的用户数据。例如,存储设备的配置、历史记录或者其他需要持久保存的数据。

    • 这样,程序在启动时可以读取这些数据,并根据存储的内容执行相应的操作。

程序自我更新

  • 通过IAP实现程序的自我更新
    STM32F1系列支持In-Application Programming(IAP),这是一种可以在应用程序运行时更新程序存储器内容的方式。

    • IAP允许在不依赖外部工具或设备的情况下,通过通信接口将新的程序代码写入FLASH。
    • 例如,当微控制器运行时,可以通过串口、SPI或I2C等通信接口接收新的固件,并将其写入FLASH,从而实现固件更新。

5. 在线编程与在应用中编程

在线编程(ICP)

在线编程(In-Circuit Programming, ICP)是一种更新程序存储器的方式,它通常通过JTAGSWD协议或者Bootloader(系统引导加载程序)进行。使用这些工具,可以:

  • 更新程序存储器的全部内容(包括程序代码、配置等)。
  • JTAG和SWD协议通常需要外部编程工具来与微控制器通信,而Bootloader则可以通过串口或其他接口直接进行固件更新。

在应用中编程(IAP)

在应用中编程(In-Application Programming, IAP)则是在程序代码已经加载并运行时,通过程序内嵌的通信接口(例如串口、CAN总线、USB等)来更新固件。

  • IAP的优势是:设备可以在运行时实现固件的更新,无需外部编程工具,用户通过串口或者其他通信接口即可直接上传新的程序,系统会将新的程序写入FLASH。

2.闪存模块组织

img

这里只展示中容量产品的:

img

闪存主要分为三个部分:主存储器(程序存储器)启动程序代码(系统存储器)用户选项字节

对于闪存存储器接口寄存器实际上并不属于闪存,地址是40开头的,实际上就是一个普通的外设。可以看作是上面闪存的管理员,控制编程和擦除的过程。(为什么没有读?? – 直接通过指针就可以对闪存进行读操作)

对于闪存的操作都是以页为单位的,和之前讲解的W25Q64模块原理是差不多的(SPI那一章节),只不过会更简单一点,但是针对特性是相同的:写入前必须擦除、擦除必须以最小单位为基础、擦除后数据后全变为1、数据只能1写0而不能0写成1、擦除后写入后得需要等待忙

3.基本结构

img

3.1 FPEC

img

FPEC(Flash Memory Program/Erase Controller)负责控制FLASH存储器的读写、擦除操作。为了防止未经授权的访问或修改,FPEC和与相关的寄存器(如FLASH_CR)默认处于加锁状态,需要通过特定的解锁步骤才能对其进行操作 。

解锁FPEC的核心在于向寄存器FLASH_KEYR写入一组预定义的键值。这些键值为:

  • RDPRT键(0x000000A5)
    用于读取保护相关操作。
  • KEY1(0x45670123)
    解锁FPEC的第一步键值。
  • KEY2(0xCDEF89AB)
    解锁FPEC的第二步键值。

解锁FPEC:

默认状态:

  • 在系统复位后,FPEC默认处于锁定状态,此时任何对FLASH_CR寄存器的写操作都会被禁止。
  • 必须执行解锁操作,才能使FPEC进入解锁状态,以允许对FLASH存储器进行编程或擦除。

读取FLASH_CR寄存器的LOCK位。如果LOCK位为1,说明FPEC处于锁定状态,需要解锁。

解锁过程需要向寄存器FLASH_KEYR按顺序写入两个键值:

  • 先写入KEY1(0x45670123)
  • 再写入KEY2(0xCDEF89AB)
  • 如果序列正确,FPEC将被解锁;如果序列错误,FPEC会锁死,直到下次复位才能再次尝试解锁。

解锁成功后,FLASH_CR寄存器的LOCK位会自动清零,表示FPEC已解锁。

如果解锁过程中,写入的键值序列不正确,FPEC将被锁死。在锁死状态下,任何操作都会被拒绝,直到系统复位重新初始化FPEC。因此,必须确保写入的键值顺序和内容完全正确。

提醒:FLASH_CR位于闪存存储器接口寄存器当中,其实也就是位于FPEC当中。

加锁:

设置FLASH_CR中的LOCK位锁住FPEC和FLASH_CR

解锁后,应尽快完成所需的FLASH操作,并及时加锁以确保存储器安全。如果在解锁后发生异常(如掉电),可能会导致FLASH操作失败,需要处理错误或重启系统。解锁和加锁操作应在对数据完整性和系统安全性有明确考虑的前提下进行。


使用指针访问存储器:

img

3.2 程序存储器

3.2.1 标准编程

img

在STM32F1系列的FLASH编程过程中,标准编程模式是一种通过逐个半字(16位)写入数据到FLASH存储器的方式。

  • FLASH存储器的最小可编程单位是半字(16位)

  • 编程时,CPU会将一个半字写入到指定的FLASH地址。此操作需要在FLASH_CR寄存器中启用PG(Programming)位。

  • 在写入过程中,FPEC会执行以下检查:

    1. 目标地址是否已被擦除:如果目标地址未被擦除(值不是0xFFFF),编程不会执行,并在FLASH_SR寄存器的PGERR位标记错误。
    2. 地址是否写保护:如果地址被写保护,编程不会执行,并在FLASH_SR寄存器的WRPRTERR位标记错误。
    3. 如果要写入的数值是0x0000,即使目标地址未被擦除,也可以正确写入,不会触发PGERR错误。

示例:

#include "stm32f10x.h"  // 根据使用的库选择合适的头文件void FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data) {// 检查FLASH是否空闲while (FLASH->SR & FLASH_SR_BSY) {// 等待FLASH空闲}// 启用编程模式FLASH->CR |= FLASH_CR_PG;// 写入目标地址和数据*(volatile uint16_t*)Address = Data;// 等待操作完成while (FLASH->SR & FLASH_SR_BSY) {// 等待编程完成}// 检查写入结果if (*(volatile uint16_t*)Address != Data) {// 编程失败,可以处理错误}// 清除编程模式FLASH->CR &= ~FLASH_CR_PG;
}int main(void) {uint32_t TargetAddress = 0x08004000;  // 目标地址uint16_t DataToWrite = 0x1234;        // 要写入的数据// 解锁FLASH(前置操作,需确保解锁代码已正确实现)Unlock_FPEC();// 编程FLASHFLASH_ProgramHalfWord(TargetAddress, DataToWrite);// 加锁FLASHLock_FPEC();while (1) {// 主循环}
}

注意事项

  1. 擦除前的检查
    编程前目标地址必须被擦除(值为0xFFFF)。如果未擦除,编程将失败并设置PGERR错误标志。
  2. 写保护检查
    如果目标地址被写保护,编程操作会被阻止,并设置WRPRTERR错误标志。
  3. 不能操作寄存器时机
    BSY位为1时,不能对任何FLASH相关寄存器(如FLASH_CRFLASH_KEYR)执行写操作,否则可能导致操作失败或FLASH状态不一致。
  4. EOP标志
    在编程成功后,FLASH_SR寄存器中的EOP(End of Programming)位会被设置为1,表示编程操作完成。
  5. 关闭编程模式
    在完成编程后,建议清除PG位,以关闭编程模式,避免误操作。
FLASH->CR &= ~FLASH_CR_PG;  // 清除PG位

3.2.2 页擦除

img

检查FLASH的状态:读取FLASH_SR寄存器的BSY位。如果BSY位为1,说明当前有其他操作正在进行(如编程或擦除)。在BSY位清零(0)之前,不能执行擦除操作。

启用页擦除模式:设置FLASH_CR寄存器的PER位为1,启用页擦除功能。

选择目标页:在FLASH_AR寄存器中写入目标页的起始地址。目标页的起始地址必须对齐到页边界。

启动擦除:设置FLASH_CR寄存器的STRT位为1,触发擦除操作。

等待擦除完成:监视BSY位,当其由1变为0时,表示擦除操作完成。

验证擦除结果:读取目标页的所有地址,确保每个字的值均为0xFFFF

关闭页擦除模式:清除FLASH_CR寄存器的PER位。

示例:

void FLASH_ErasePage(uint32_t PageAddress) {// 检查FLASH是否空闲while (FLASH->SR & FLASH_SR_BSY) {// 等待FLASH空闲}// 启用页擦除模式FLASH->CR |= FLASH_CR_PER;// 设置目标页地址FLASH->AR = PageAddress;// 启动擦除FLASH->CR |= FLASH_CR_STRT;// 等待擦除完成while (FLASH->SR & FLASH_SR_BSY) {// 等待擦除完成}// 验证擦除结果for (int i = 0; i < PageSize / 2; i++) {if (*(volatile uint16_t*)(PageAddress + i * 2) != 0xFFFF) {// 擦除失败}}// 关闭页擦除模式FLASH->CR &= ~FLASH_CR_PER;
}

页擦除适用于清空指定页的数据,操作范围小,效率较高。

3.2.3 全擦除

img

检查FLASH的状态:与页擦除相同,先检查BSY位,确保当前没有其他操作正在进行。

启用整片擦除模式:设置FLASH_CR寄存器的MER位为1,启用整片擦除功能。

启动擦除:设置FLASH_CR寄存器的STRT位为1,触发擦除操作。

等待擦除完成:监视BSY位,当其由1变为0时,表示擦除操作完成。

验证擦除结果:遍历所有用户区的FLASH地址,确保每个字的值均为0xFFFF

关闭整片擦除模式:清除FLASH_CR寄存器的MER位。

示例:

void FLASH_EraseAll(void) {// 检查FLASH是否空闲while (FLASH->SR & FLASH_SR_BSY) {// 等待FLASH空闲}// 启用整片擦除模式FLASH->CR |= FLASH_CR_MER;// 启动擦除FLASH->CR |= FLASH_CR_STRT;// 等待擦除完成while (FLASH->SR & FLASH_SR_BSY) {// 等待擦除完成}// 验证擦除结果for (uint32_t Address = FLASH_BASE; Address < FLASH_END; Address += 2) {if (*(volatile uint16_t*)Address != 0xFFFF) {// 擦除失败}}// 关闭整片擦除模式FLASH->CR &= ~FLASH_CR_MER;
}

整片擦除适用于清空整个用户区,操作范围大,但需要更长时间。

3.3 选项字节

选择字节共有8个字节,由用户根据应用的需要配置;例如:可以选择使用硬件模式的看门狗或软件的看门狗。

  • 前4个字节:写保护配置(Write Protection)
  • 1个字节:读保护配置(Read Protection)
  • 1个字节:通用配置选项
  • 2个字节:用户数据(可用于存储自定义信息)

注意: 每个选项字节对应一个反码(Complement Byte),确保数据的一致性和可靠性。

在选择字节中每个32位的字被划分为下述格式:

img

RDP:写入RDPRT键(0x000000A5)后解除读保护

USER:配置硬件看门狗和进入停机/待机模式是否产生复位

Data0/1:用户可自定义使用

WRP0/1/2/3:配置写保护,每一个位对应保护4个存储页(中容量)

具体的去看闪存编程参考手册

3.3.1 编程

前置要求:

解锁FPEC控制器:

  • 向FLASH_OPTKEYR寄存器依次写入两个解锁密钥:

    • KEY1 = 0x45670123
    • KEY2 = 0xCDEF89AB
  • 成功解锁后,FLASH_CR寄存器中的OPTWRE位会自动置1,允许对选项字节进行操作。

检查FLASH状态:

  • 在进行编程操作前,必须检查FLASH_SR寄存器的BSY位,确保没有正在进行的编程或擦除操作

编程流程:

设置FLASH_CR寄存器的OPTPG位为1,进入选项字节编程模式。

将要写入的半字(16位数据)写入指定的选项字节地址。FPEC会自动计算反码,并将数据写入对应的反码地址。

监视FLASH_SR寄存器的BSY位,当其变为0时,表示编程操作完成。检查FLASH_SR寄存器的EOP位是否为1,以确认操作结束。

读取目标地址,验证写入的数据是否正确。验证时注意同时检查反码是否正确。

清除FLASH_CR寄存器的OPTPG位,退出选项字节编程模式。

特殊情况:

当将读保护选项从“未保护”更改为“保护”时,编程完成后目标设备会立即进入读保护模式。

如果将读保护选项从“保护”改为“未保护”,FPEC会自动执行整片擦除操作(用户区的所有数据将被清空)。这是为了防止非法访问FLASH存储器中的数据。

如果只修改其他选项字节(如写保护或用户数据),则不会触发整片擦除操作。

示例:

#include "stm32f10x.h"void FLASH_ProgramOptionByte(uint32_t OptionByteAddress, uint16_t DataToProgram) {// 解锁选项字节控制FLASH->OPTKEYR = 0x45670123;  // 写入KEY1FLASH->OPTKEYR = 0xCDEF89AB;  // 写入KEY2// 检查FLASH是否空闲while (FLASH->SR & FLASH_SR_BSY) {// 等待FLASH空闲}// 启用选项字节编程模式FLASH->CR |= FLASH_CR_OPTPG;// 写入选项字节数据*(volatile uint16_t*)OptionByteAddress = DataToProgram;// 等待编程完成while (FLASH->SR & FLASH_SR_BSY) {// 等待FLASH空闲}// 检查编程是否成功if (*(volatile uint16_t*)OptionByteAddress != DataToProgram) {// 验证失败,执行错误处理}// 关闭选项字节编程模式FLASH->CR &= ~FLASH_CR_OPTPG;
}

3.3.2 擦除

在任何擦除或编程操作前,必须检查FLASH_SR寄存器的BSY位,确认没有其他正在进行的闪存操作。

擦除操作需要先解锁选项字节操作功能:

  1. FLASH_OPTKEYR寄存器依次写入两个解锁密钥:
    • KEY1 = 0x45670123
    • KEY2 = 0xCDEF89AB
  1. 解锁成功后,FLASH_CR寄存器中的OPTWRE位会被置为1,允许对选项字节区域进行操作。

设置FLASH_CR寄存器的OPTER位为1,进入选项字节擦除模式。

设置FLASH_CR寄存器的STRT位为1,启动擦除操作。

监视FLASH_SR寄存器的BSY位,等待其变为0,表示擦除操作完成。

读取目标地址,验证擦除操作是否成功(应读取到默认擦除值0xFFFF)。

示例:

#include "stm32f10x.h"void FLASH_EraseOptionBytes(void) {// 检查闪存是否空闲while (FLASH->SR & FLASH_SR_BSY) {// 等待闪存空闲}// 解锁选项字节控制FLASH->OPTKEYR = 0x45670123;  // 写入KEY1FLASH->OPTKEYR = 0xCDEF89AB;  // 写入KEY2// 设置选项字节擦除模式FLASH->CR |= FLASH_CR_OPTER;// 启动擦除操作FLASH->CR |= FLASH_CR_STRT;// 等待擦除完成while (FLASH->SR & FLASH_SR_BSY) {// 等待操作完成}// 验证擦除结果if (*(volatile uint16_t*)OptionByteAddress != 0xFFFF) {// 验证失败,处理错误}// 关闭选项字节擦除模式FLASH->CR &= ~FLASH_CR_OPTER;
}

4.器件电子签名

电子签名存放在闪存存储器模块的系统存储区域,包含的芯片识别信息在出厂时编写,不可更改,使用指针读指定地址下的存储器可获取电子签名

闪存容量寄存器:

  • 基地址:0x1FFF F7E0
  • 大小:16位

产品唯一身份标识寄存器:

  • 基地址: 0x1FFF F7E8
  • 大小:96位

5.实验-读取内部FLASH

📎15-1 读写内部FLASH.zip

img

System:

  • 📎MyFLASH.h📎Store.c📎Store.h📎MyFLASH.c

User:

  • 📎main.c

相关文章:

stm32之FLASH

目录 1.简介2.闪存模块组织3.基本结构3.1 FPEC3.2 程序存储器3.2.1 标准编程3.2.2 页擦除3.2.3 全擦除 3.3 选项字节3.3.1 编程3.3.2 擦除 4.器件电子签名5.实验-读取内部FLASH 1.简介 STM32F1系列的FLASH内存是一个非常重要的存储区域&#xff0c;它主要由三个部分组成&#…...

第3.4节 调用链路分析服务开发

3.4.1 什么是Code Call Graph&#xff08;CCG&#xff09; Code Call Graph&#xff08;CCG&#xff09;即业务代码中的调用关系图&#xff0c;是通过静态分析手段分析并构建出的一种描述代码间关系的图。根据精度不同&#xff0c;一般分为类级别、方法级别、控制流级别&#x…...

超详细Docker教程

前言&#xff1a;大家在在Linux上部署mysql及其他软件时&#xff0c;大家想一想自己最大的感受是什么&#xff1f; 我相信&#xff0c;除了个别天赋异禀的人以外&#xff0c;大多数人都会有相同的感受&#xff0c;那就是麻烦。核心体现在三点&#xff1a; 命令太多了&#xff…...

探索AI新领域:生成式人工智能认证(GAI认证)助力职场发展

在数字化时代的大潮中&#xff0c;人工智能&#xff08;AI&#xff09;技术以其强大的影响力和广泛的应用前景&#xff0c;正逐步重塑我们的生活与工作方式。随着生成式AI技术的崛起&#xff0c;掌握这一前沿技能已成为职场竞争中的关键优势。那么&#xff0c;如何通过系统的学…...

sql sql复习

虽然之前学习过sql&#xff0c;但由于重在赶学习进度&#xff0c;没有学扎实&#xff0c;导致自己刷题的时候有的地方还是模模糊糊&#xff0c;现在主要是复习&#xff0c;补一补知识点。 今日靶场&#xff1a; NSSCTF 云曦历年考核题 在做题之前先回顾一下sql注入的原理&…...

初探 Skynet:轻量级分布式游戏服务器框架实战

在游戏服务器开发领域&#xff0c;高效、稳定且易于扩展的框架一直是开发者追求的目标。Skynet 作为一款轻量级、高性能的分布式游戏服务器框架&#xff0c;凭借其独特的设计理念和强大的功能&#xff0c;赢得了众多开发者的青睐 一.Skynet底层架构支持 1.Actor erlang 从语言…...

libarchive.so.19丢失

文章目录 绝对路径可以启动&#xff0c;相对路径不可以以绝对路径启动conda环境&#xff0c;运行python3.8(成功) 报错 Error while loading conda entry point: conda-libmamba-solver (libarchive.so.19: cannot open shared object file: No such file or directory) sudo a…...

vue-ganttastic甘特图label标签横向滚动固定方法

这个甘特图之前插件里&#xff0c;没有找到能固定label标签在屏幕上的办法&#xff0c;用css各种办法都没有实现&#xff0c;所以我我直接手写定位&#xff0c;用js监听滚动条滚动的距离&#xff0c;然后同步移动甘特图label标签&#xff0c;造成一种定位的错觉&#xff0c;以下…...

自动化 NuGet 包打包与上传:完整批处理脚本详解(含 SVN 支持)

在大型项目中&#xff0c;我们常常需要定期打包多个 .csproj 项目为 NuGet 包&#xff0c;并上传到私有 NuGet 服务。这篇文章分享一份实战脚本&#xff0c;支持以下自动化流程&#xff1a; 自动读取、更新 .csproj 文件中的 Version、PackageOutputPath 等节点&#xff1b; 自…...

Go语言空白导入的作用与用途

在 Go 语言中&#xff0c;导入包时前面加下划线 _ 是一种特殊的导入方式&#xff0c;称为 “空白导入” 或 “匿名导入”。 作用&#xff1a; 执行包的初始化&#xff08;init 函数&#xff09;但不直接使用包中的标识符 import _ "go.uber.org/automaxprocs" 表示你…...

实验六:按键模拟控制实现

FPGA序列检测器实验(远程实验系统) 文章目录 FPGA序列检测器实验(远程实验系统)一、数字电路基础知识1. 时钟与同步2. 按键消抖原理代码讲解:分频与消抖3. 有限状态机(FSM)设计代码讲解:状态机编码与转移4. 边沿检测与信号同步5. 模块化设计二、实验数字电路整体思想三…...

【愚公系列】《Manus极简入门》038-数字孪生设计师:“虚实映射师”

&#x1f31f;【技术大咖愚公搬代码&#xff1a;全栈专家的成长之路&#xff0c;你关注的宝藏博主在这里&#xff01;】&#x1f31f; &#x1f4e3;开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主&#xff01; &#x1f…...

Linux重定向与缓冲区

目录 文件描述符的分配规则 重定向 使用 dup2 系统调用 FILE 文件描述符的分配规则 #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>int main() {int fd open("myfile", O_RDONLY);if(fd < 0){per…...

经典还原反应解析:Wolff-Kishner机制与黄鸣龙改进法

在有机化学发展史上记载的万余种经典反应中&#xff0c;当论及以科学家命名的标志性转化反应时&#xff0c;Wolff-Kishner-黄鸣龙还原反应必然占据重要地位。在大学《有机化学》课程中&#xff0c;学习还原反应时肯定会提到Wolff-Kishner-黄鸣龙还原反应&#xff0c;这是第一个…...

DataX从Mysql导数据到Hive分区表案例

0、下载DataX并解压到对应目录 DataX安装包&#xff0c;开箱即用&#xff0c;无需配置。 https://datax-opensource.oss-cn-hangzhou.aliyuncs.com/202308/datax.tar.gz 相关参考文档 https://github.com/alibaba/DataX/blob/master/hdfswriter/doc/hdfswriter.md 1、Hive分区…...

npm 报错 gyp verb `which` failed Error: not found: python2 解决方案

一、背景 npm 安装依赖报如下错&#xff1a; gyp verb check python checking for Python executable "python2" in the PATH gyp verb which failed Error: not found: python2 一眼看过去都觉得是Python环境问题&#xff0c;其实并不是你python环境问题&#xf…...

安装npm:npm未随Node.js一起安装

文章目录 上传至linux服务器/usr/local/目录下 如果npm没有随Node.js一起安装&#xff0c;你可以尝试单独下载并安装npm。但通常情况下&#xff0c;这是不必要的&#xff0c;因为npm是Node.js的一部分。如果确实需要单独安装npm&#xff0c;你可以参考npm的官方安装指南。 npm…...

C++23 ranges::to:范围转换函数 (P1206R7)

文章目录 引言C23 Ranges 概述ranges::to 的定义与功能定义功能 使用场景范围转换为容器简化字符串解析映射转换为向量 ranges::to 的优势代码简洁性提高开发效率与C23的stl容器的范围版本构造函数配合良好 模板参数约束的思考总结 引言 在C的发展历程中&#xff0c;每一个新版…...

openfeign 拦截器实现微服务上下文打通

目录 openfeign 拦截器实现微服务上下文打通需求分析&#xff1a;代码实现&#xff1a;subject 服务&#xff1a;controllerFeign 拦截器&#xff1a;将 Feign 拦截器注册为一个Bean&#xff1a; auth 鉴权服务&#xff1a;全局配置类&#xff1a;登录拦截器&#xff1a;上下文…...

【MySQL】变更缓冲区:作用、主要配置以及如何查看

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客仓库&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &…...

TCP/IP-——C++编程详解

1. TCP/IP 编程基本概念 TCP&#xff08;传输控制协议&#xff09;&#xff1a;面向连接、可靠的传输层协议&#xff0c;保证数据顺序和完整性。IP&#xff08;网际协议&#xff09;&#xff1a;负责将数据包路由到目标地址。Socket&#xff08;套接字&#xff09;&#xff1a…...

微服务如何实现服务的高可用

背景&#xff1a;微服务分层需要考虑高可用和高并发的问题 微服务如何实现服务的高可用 先说结论&#xff1a;微服务实现高可用主要通过集群冗余故障自动转移来实现的具体可以从底下几种方案来实现。 “端”到“反向代理”的高可用“反向代理”到“站点应用”的高可用“站点…...

微服务调试问题总结

本地环境调试。 启动本地微服务&#xff0c;使用公共nacos配置。利用如apifox进行本地代码调试解决调试问题。除必要的业务微服务依赖包需要下载到本地。使用mvn clean install -DskipTests进行安装启动前选择好profile环境进行启动&#xff0c;启动前记得mvn clean清理项目。…...

egpo进行train_egpo训练时,keyvalueError:“replay_sequence_length“

def execution_plan(workers: WorkerSet, config: TrainerConfigDict) -> LocalIterator[dict]: if config.get(“prioritized_replay”): prio_args { “prioritized_replay_alpha”: config[“prioritized_replay_alpha”], “prioritized_replay_beta”: config[“prior…...

Hadoop的组成

&#xff08;一&#xff09;Hadoop的组成 对普通用户来说&#xff0c; Hadoop就是一个东西&#xff0c;一个整体&#xff0c;它能给我们提供无限的磁盘用来保存文件&#xff0c;可以使用提供强大的计算能力。 在Hadoop3.X中&#xff0c;hadoop一共有三个组成部分&#…...

Android锁

引言 &#x1f512; 在 Android 应用的开发过程中&#xff0c;随着业务需求的复杂度不断提升&#xff0c;多线程并发场景层出不穷。为了保证数据一致性与线程安全&#xff0c;锁&#xff08;Lock&#xff09;成为了不可或缺的工具。本篇博客将深入剖析 Android 中常用的锁机制…...

XD08M3232接近感应单片机的接近感应模块的工作原理

XD08M3232接近感应单片机的接近感应模块基于电容式感应原理&#xff0c;通过硬件电路与软件配置实现对物体接近的检测。以下是其工作原理的详细解析&#xff1a; 一、硬件架构与核心组件 1. 核心电路组成 接近感应模块由三大关键部分构成&#xff1a; 两个轨到轨运算放大器&…...

编程日志5.6

串的习题 1.2236. 判断根结点是否等于子结点之和 - 力扣(LeetCode) /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * Tr…...

量子计算实用化突破:从云端平台到国际竞合,开启算力革命新纪元

在硅谷某生物医药实验室&#xff0c;研究员艾米丽正盯着量子计算模拟界面露出微笑 —— 搭载中电信 "天衍" 量子计算云平台的 880 比特超导量子处理器&#xff0c;用 17 分钟完成了传统超算需 3 个月才能跑完的新型抗生素分子键合模拟。这个场景标志着量子计算正从 &…...

Made with Unity | 拓展“双点”宇宙版图

双点工作室&#xff08;Two Point Studios&#xff09;团队成立于2016年&#xff0c;其创立初衷是打造一个完美的游戏IP&#xff1a;构建一个既能持续吸引玩家&#xff0c;又具备足够扩展空间&#xff0c;同时经得起时间考验的虚拟世界。2018年&#xff0c;团队以《双点医院&am…...

3D 数据可视化系统是什么?具体应用在哪方面?

目录 一、3D 数据可视化系统的定义与内涵 &#xff08;一&#xff09;基本概念 &#xff08;二&#xff09;核心要素 二、3D 数据可视化系统的优势 三、3D 数据可视化系统的应用领域 &#xff08;一&#xff09;城市规划与管理 &#xff08;二&#xff09;工业制造 &am…...

2025-5-14渗透测试:利用Printer Bug ,NTLMv2 Hash Relay(中继攻击),CVE-2019-1040漏洞复现

python3 printerbug.py test.com/test192.168.186.131 192.168.186.134 sudo python2 MultiRelay.py -t 192.168.186.132 -u ALLPrinter Bug 原理 PrinterBug&#xff08;CVE-2018-0886&#xff09;是Windows打印系统服务&#xff08;Spooler&#xff09;的一个设计缺陷&…...

OracleLinux7.9-ssh问题

有套rac环境&#xff0c;db1主机无法ssh db1和db1-priv&#xff0c;可以ssh登录 db2和db2-priv [rootdb1 ~]# ssh db1 ^C [rootdb1 ~]# ssh db2 Last login: Wed May 14 18:25:19 2025 from db2 [rootdb2 ~]# ssh db2 Last login: Wed May 14 18:25:35 2025 from db1 [rootdb2…...

《AI大模型应知应会100篇》第64篇:构建你的第一个大模型 Chatbot

第64篇&#xff1a;构建你的第一个大模型 Chatbot 手把手教你从零开始搭建一个基于大模型的聊天机器人 摘要 你是否想过&#xff0c;自己也能构建一个像 ChatGPT 一样能对话、能思考的聊天机器人&#xff08;Chatbot&#xff09;&#xff1f;别担心&#xff0c;这并不需要你是…...

鸿蒙OSUniApp 实现精美的用户登录和注册页面#三方框架 #Uniapp

UniApp 实现精美的用户登录和注册页面 前言 在开发鸿蒙APP时&#xff0c;登录注册页面作为用户与应用交互的第一道门槛&#xff0c;其体验与质量往往决定了用户的第一印象。去年我接手了一个电商小程序项目&#xff0c;产品经理特别强调要做一个既美观又实用的登录注册页面。…...

c#中equal方法与gethashcode方法之间有何关联?

文章目录 前言一、对hash运算的深入思考二、equal与gethashcode的关联三、 equal与gethashcode不同步的后果四、 规范的重写gethashcode 前言 大家有没有遇到过&#xff0c;当你重写了c#对象的equal方法之后&#xff0c;编译器会提示你对相应的gethashcode进行重写&#xff0c…...

查询公网IP地址的方法:查看自己是不是公网ip,附内网穿透外网域名访问方案

本地搭建服务并提供互联网连接时&#xff0c;较为传统的方法是使用公网IP地址。因此&#xff0c;如何查询本地自己是不是公网IP&#xff0c;是必须要掌握的一种技巧。当面对确实无公网IP时&#xff0c;则可以通过内网穿透方案&#xff0c;如nat123网络映射工具&#xff0c;将本…...

【轻松学 C:编程小白的大冒险】— 16 函数的定义与调用

在编程的艺术世界里&#xff0c;代码和灵感需要寻找到最佳的交融点&#xff0c;才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里&#xff0c;我们将共同追寻这种完美结合&#xff0c;为未来的世界留下属于我们的独特印记。 【轻松学 C&#xff1a;编程小白的大冒险…...

【Tools】CPU 分析

CPU 分析 Windows SDK 本指南提供了可用于调查影响评估指标的中央处理单元 (CPU) 相关问题的详细技术。 特定于评估的分析指南中的各个指标或问题部分确定了需要调查的常见问题。 本指南提供了可用于调查这些问题的技术和工具。 本指南中的技术使用 Windows Performance Too…...

进阶2_1:QT5多线程与定时器共生死

1、在widget.ui中使用 LCD Number控件 注意&#xff1a;若 LCD 控件不是多线程&#xff0c;LCD控件则会瞬间自增到最大的数值&#xff0c;如上图&#xff0c;说明两者都是多线程处理 2、实现方式 1、创建 LCD 控件并修改为 LCD1 2、创建任务类 mytask. h&#xff0c;对任务类…...

ECharts:数据可视化的强大引擎

在当今这个信息爆炸的时代&#xff0c;如何有效地展示和理解复杂的数据成为了每一个开发者和技术爱好者面临的挑战。Apache ECharts 作为一款基于 JavaScript 的开源可视化库&#xff0c;以其强大的功能、丰富的图表类型以及高度的可定制性&#xff0c;迅速成为了数据可视化领域…...

记录 QT 在liunx 下 QFileDialog 类调用问题 ()Linux下QFileDialog没反应)

1. 2025.05.14 踩坑记录 因为QT 在 liunx 文件系统不同导致的 Windows &#xff1a; QString filePath QFileDialog::getOpenFileName(nullptr, "选择文件", ".", "文本文件 (*.txt);所有文件 (*.*)"); 没问题 liunx 下 打不开&#xff…...

通用软件项目技术报告 - 导读III

现在,我们正式进入报告的第六个主要领域:6. 领域六:与第三方服务/API 集成 (含 LLM API)。 连接: 在现代软件开发中,很少有应用程序是完全孤立的。我们经常需要与各种外部的第三方服务或 API 进行集成,以利用它们提供的特定功能(如支付处理、地图服务、社交媒体登录、云…...

Kali Linux 桌面环境安装与配置指南

一、为什么选择 Kali Linux&#xff1f; Kali Linux 由 Offensive Security 维护&#xff0c;集成了数百种安全测试工具&#xff08;如 Metasploit、Nmap 和 Burp Suite&#xff09;&#xff0c;非常适合安全研究。但需要注意的是&#xff0c;Kali 默认以 root 用户运行&#…...

FFmpeg视频编码的完整操作指南

步骤如下&#xff1a; 安装和准备FFmpeg&#xff1a;确保包含所需编码器&#xff08;如libx264&#xff09;。基本命令行编码&#xff1a;使用ffmpeg命令进行转码&#xff0c;设置视频编码器、CRF、预设等。API编码流程&#xff08;针对开发者&#xff09;&#xff1a; a. 注册…...

【网络协议】TCP、HTTP、MQTT 和 WebSocket 对比

从协议本质、工作原理、特点、应用场景等方面详细对比 TCP、HTTP、MQTT 和 WebSocket。 1. TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09; 本质 协议类型&#xff1a;传输层协议&#xff08;OSI模型第4层&#xff09;。核心功能&#x…...

Leetcode数组day1

704 二分查找 注意点&#xff0c;左闭右闭 class Solution { public:int search(vector<int>& nums, int target) {//整数类型的动态数组的引用。int left0;int right nums.size()-1;while (left < right){int middle (rightleft)/2;if (nums[middle]>targ…...

leetcode2934. 最大化数组末位元素的最少操作次数-medium

1 题目&#xff1a;最大化数组末位元素的最少操作次数 官方标定难度&#xff1a;中 给你两个下标从 0 开始的整数数组 nums1 和 nums2 &#xff0c;这两个数组的长度都是 n 。 你可以执行一系列 操作&#xff08;可能不执行&#xff09;。 在每次操作中&#xff0c;你可以选…...

常见相机焦段的分类及其应用

相机焦段是指镜头的焦距范围&#xff0c;决定了拍摄时的视角、画面范围和透视效果。不同焦段适合不同的拍摄场景和主题&#xff0c;以下是常见焦段的分类及其应用&#xff1a; 一、焦段的核心概念 焦距&#xff1a;镜头光学中心到成像传感器的距离&#xff08;单位&#xff1a…...

FPGA在光谱相机中的核心作用

FPGA&#xff08;现场可编程门阵列&#xff09;作为光谱相机的核心控制与加速单元&#xff0c;通过硬件级并行处理能力和动态可编程特性&#xff0c;实现高速、高精度的光谱数据采集与处理。以下是其具体作用分类&#xff1a; 一、高速光电信号处理 ‌实时光谱复原‌ 通过硬…...