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

【STM32】知识点介绍二:GPIO引脚介绍

文章目录

    • 一、概述
    • 二、GPIO的工作模式
    • 三、寄存器编程

一、概述

  GPIO(英语:General-purpose input/output),即通用I/O(输入/输出)端口,是STM32可控制的引脚。STM32芯片的GPIO引脚与外部设备连接起来,可实现与外部通讯、控制外部硬件或者采集外部硬件数据的功能。

  STM32F407有8组IO。分别为GPIOA~GPIOH,除了GPIOH只有两个IO引脚,其余每组IO有16根引脚。

  GPIO的复用:引脚复用是指将单个引脚配置为多个功能的能力。在 STM32 中,每个引脚都可以配置为多个不同的功能,如GPIO、定时器、UART、SPI等。这样一来,通过配置引脚复用功能,可以实现多种硬件功能的连接和实现,提高了芯片的灵活性和可扩展性。引脚默认为IO口。

  GPIO的电平:引脚电平对芯片的某个引脚进行高低电平的输出,以及可以去检测某个引脚的电平状态。一般电平采用都是TTL电平信号,TTL电平信号规定:+5V等价于逻辑“1”,0V等价于逻辑“0”。电平其实有一个电平范围:>2V就表示高电平,<0.8V就表示低电平。


二、GPIO的工作模式

2.1 简述
四种输入模式:
(1)浮空输入(即不连接内部上下拉电阻)
(2)上拉输入(连接上拉电阻)
(3)下拉输入(连接下拉电阻)
(4)模拟输入(用于检测模拟信号的输入)

四种输出模式
(1)开漏输出(带上拉或者下拉)
(2)复用开漏输出(带上拉或者下拉)
(3)推挽输出(带上拉或者下拉)
(4)复用推挽输出(带上拉或者下拉)

四种最大输出速度
(1)2MHZ (低速)
(2)25MHZ (中速)
(3)50MHZ (快速)
(4)100MHZ (高速)

2.2引脚速度
  STM32微控制器的GPIO(General Purpose Input/Output)引脚速度设置是一个关键的配置参数,它影响着I/O口的性能,特别是当用于高速信号传输时。

(1)输出速度设置及其意义
  STM32的GPIO端口在设置为输出模式时,通常提供几种速度选项,这些选项代表了I/O口驱动电路的不同响应速度,旨在优化噪声控制和降低功耗。常见的速度设置包括:

  • 2MHz:适用于对噪声敏感的应用或者低速信号传输。这种设置下,输出驱动电路的响应较慢,但功耗较低,噪声也相对较小。
  • 25MHz:平衡了速度和噪声控制的需求,适用于中速信号传输。相比2MHz,它的响应更快,但仍能保持较好的信号完整性。
  • 50MHz:用于高速信号传输,如SPI或某些高速总线通信。虽然提供了最快的响应速度,但会增加噪声并消耗更多功耗。
  • 100MHz:这是最快的速度设置,用于超高速信号传输,如更高速SPI或某些高速总线通信。虽然提供了最快的响应速度,但会增加更多的噪声并消耗更多功耗。

(2)输出速度与驱动电路的关系
  每个GPIO引脚都有与其关联的输出驱动电路,这些电路的设计能够适应不同的速度要求。选择更高的输出速度意味着选择了响应更快的驱动电路,这能够更迅速地切换输出状态(即从高电平到低电平或反之),从而支持更高的数据传输速率。但是,更快的切换速度往往伴随更大的开关噪声和稍高的功耗。
在这里插入图片描述

  • 开关噪声:电子电路中的开关噪声通常是指由于开关操作引起的电磁干扰(Electromagnetic Interference, EMI)或瞬态电压现象。这种噪声可能对电路的正常运行产生负面影响,特别是在高频和高速数字电路中更为明显。
    定义与成因:
      开关噪声主要发生在电路中的快速切换元件上,比如晶体管、继电器等。
      当这些元件从一种状态迅速切换到另一种状态时(如从导通变为截止),会在电路中产生瞬间的电流变化或电压突变。
      这种突变会导致寄生电感和电容之间的能量交换,从而产生振荡或尖峰信号。
  • 寄生电容:寄生电容是电路设计中常见的非理想效应,它们并不是设计师特意加入的元件,而是由于电路物理结构自然形成的。这些“寄生”元件可以影响电路的行为,尤其是在高频应用中。
    定义:寄生电容是指在两个导体之间无意中形成的一种电容效应。它通常出现在集成电路内部、印刷电路板(PCB)上的走线间或与地平面之间等地方。
    影响:
      在高频电路中,寄生电容可以导致信号延迟增加。
      它可能造成不必要的耦合,使得一个信号路径中的变化影响到另一个不相关的路径。
      对于高速数字电路来说,寄生电容还会影响信号完整性,如引起过冲、下冲或者振铃现象。
  • 过冲 (Overshoot):当信号从低电平切换到高电平时,如果信号超过目标电压水平并达到更高的峰值,这种现象就称为过冲。
      原因:通常是由于信号路径上的寄生电感和电容相互作用造成的。当快速上升沿遇到寄生电感时,会产生一个反向电动势,这会导致电压超出预期值。
      影响:过冲可能导致器件承受高于其额定工作电压的压力,从而可能缩短器件寿命或直接造成损害。
  • 下冲 (Undershoot):与过冲相反,当下降沿信号低于目标低电平,并进一步跌落到更低的电压水平时,这种现象被称为下冲。
      原因:同样是由寄生元件引起的,尤其是当信号通过较长的走线或者具有较大电感的路径时。
      影响:下冲可能会使信号暂时达不到正确的逻辑电平,从而引起逻辑判断错误。
  • 振铃 (Ringing):振铃是指在信号边沿之后出现的一系列振荡现象。这些振荡可能围绕着最终稳定的目标电压上下波动。
      原因:振铃通常是由于信号路径上存在的寄生LC(电感-电容)谐振网络造成的。当信号经过这样的网络时,会激发起振荡模式。
      影响:振铃不仅会影响当前信号的质量,还可能干扰相邻线路的信号,尤其是在高密度布线的PCB上。

(3)配置建议
  应用需求导向:根据实际应用需求选择合适的速度。例如,如果使用I2C接口且波特率为400kHz,选择2MHz的速度可能已足够,但如果希望预留更多的余量,可以考虑使用10MHz。

  信号完整性和噪声考虑:高速信号传输时,应考虑信号的完整性,可能需要增加适当的终端电阻或其他抗干扰措施,以减少高速切换引起的反射和串扰。

  功耗考量:在低功耗应用中,应优先考虑低速设置以减少功耗。速度越高,需要电压就越高,对应功耗也越高。

  电路的驱动能力由负载电容决定的,当负载电容一定时,GPIO端口的驱动能力越大,充放电的电流也越大,上升时间就越短。另外速度越高,EMI电磁干扰就越高,因此必须平衡GPIO性能与噪声,特别是产品出口时要取得EMC(电磁兼容:Electro Magnetic Compatibility)认证。

2.3详细分析
(1)对 I/O 端口进行编程作为输出时:

  • 输出缓冲器被打开:
      开漏模式(常用于总线,典型特征是引脚外部有上拉电阻):输出寄存器中的“0”可激活 N-MOS,而输出寄存器中的“1”会使端口保持高阻态 (Hi-Z)(P-MOS 始终不激活)。
      推挽模式:输出寄存器中的“0”可激活 N-MOS,而输出寄存器中的“1”可激活P-MOS。
  • 施密特触发器输入被打开
  • 根据 GPIOx_PUPDR 寄存器中的值决定是否打开弱上拉电阻和下拉电阻
  • 输入数据寄存器每隔 1 个 AHB1 时钟周期对 I/O 引脚上的数据进行一次采样
  • 对输入数据寄存器的读访问可获取 I/O 状态
  • 对输出数据寄存器的读访问可获取最后的写入值
    在这里插入图片描述
  • 当输入信号为高电平的时候,上面的管子导通,下面的管子截止,输出信号为高电平。
  • 当输入信号为低电平的时候,上面的管子截止,下面的管子导通,输出信号为低电平。
    在这里插入图片描述
    推挽电路
      推挽电路(push-pull)就是两个不同极性晶体管间连接的输出电路。推挽电路采用两个参数相同的功率BJT管或MOSFET管,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小效率高。推挽输出既可以向负载灌电流,也可以从负载抽取电流,常见应用场景音频放大器,用于放大音频信号以驱动扬声器。
    在这里插入图片描述
    工作原理
  • 当输入信号为正半周时,NPN晶体管导通,PNP晶体管截止,输出电流流过负载。
  • 当输入信号为负半周时,NPN晶体管截止,PNP晶体管导通,输出电流反方向流过负载。
  • 这样,两个晶体管轮流工作,使得输出波形接近于输入波形,但具有更大的幅度。
  • 在电路设计中,推挽输出是一种很常用的输出模式。推挽输出有很多优点,比如更低的损耗,更安全的输出等。“推挽”之意,即为当一个管子推出去时,另一个管子拉回来。输入不同,交替导通。

钳位二极管
  钳位二极管是指用于在电路中将某点的电位进行限制的二极管,钳位是将某点的电位进行限制,使其不大于或者不小于参考端的值,该点的电位是可变的,是利用二极管的正向导通特性来进行钳位。IO引脚上下两边两个二极管用于防止引脚外部过高、过低的电压输入。当引脚电压高于VDD时,上方的二极管导通;当引脚电压低于VSS时,下方的二极管导通,防止不正常电压引入芯片导致芯片烧毁。但是尽管如此,还是不能直接外接大功率器件,须加大功率及隔离电路驱动,防止烧坏芯片或者外接器件无法正常工作。

  如上图所示,有两个保护二极管,用于保护内部电路,防止I/O引脚外部过高或者过低的电压输入时造成内部电路损坏。

  具体来讲:当引脚输入电压高于VDD时,上面的二极管导通,输入点电压被钳位到约VDD+0.7V;当引脚输入电压低于VSS时,下面的二极管导通,输入点电压被钳位到约VSS-0.7V,从而使输入芯片内部的电压出于比较稳定的值(钳位作用)。

  虽然有二极管的保护,但这样的保护很有限,大电压大电流的输入很容易烧坏芯片,在实际设计中要考虑设计引脚的保护电路。
在这里插入图片描述
  假设二极管D1和D2的正向导通压降都是uD,反向击穿电压大于VDD+uD,Pin点的电位记作Upin,则:

  1. 当Pin点的电位Upin ≥ (VDD+uD)时,此时D1会导通而将Pin点的电位限制在VDD+uD,D2截止;
  2. 当Pin点的电位在范围(GND-uD) < Upin < (VDD+uD)时,D1截止,D2截止;
  3. 当Pin点的电位Upin ≤ (GND-uD)时,D1截止,D2会导通而将Pin点的电位限制在GND-uD。

  综上所述,Pin点的电位范围会被限制在(GND-uD) ≤ Upin ≤ (VDD+uD)。若VDD=5V、GND=0V、uD=0.7V,则Pin点电位范围被限制在 -0.7V ≤ Upin ≤ 5.7V;若忽略D1和D2的正向导通压降,则可认为Pin点电位范围被限制为 0V ≤ Upin ≤ 5V。

钳位电路相关说明
  二极管具有单向导电性,可利用这一特性对电路进行整流或钳位。钳位的定义:将信号强行钳制到某一电位上,抬高或降低信号的基准电位,但不改变原信号的波形。钳位电路分为正向钳位和负向钳位电路。

  • 当二极管负极接地时,正极端电路的电位比地高,二极管导通,电位被拉下来,即正极端电压被钳位到零电位或零电位以下(忽略二极管压降)。
  • 当二极管正极接地时,负极端电路的电位比地高,二极管截止,电位将不会受二极管影响。

(2)对 I/O 端口进行编程作为输入时:

  • 输出缓冲器被关闭
  • 施密特触发器输入被打开
  • 根据 GPIOx_PUPDR 寄存器中的值决定是否打开上拉和下拉电阻
  • 输入数据寄存器每隔 1 个 AHB1 时钟周期对 I/O 引脚上的数据进行一次采样
  • 对输入数据寄存器的读访问可获取 I/O 状态在这里插入图片描述
    施密特触发器
      在电子学中,施密特触发器(英语:Schmitt trigger)是包含正反馈的比较器电路。
    在这里插入图片描述
      对于标准施密特触发器,当输入电压高于正向阈值电压,输出为高;当输入电压低于负向阈值电压,输出为低;当输入在正负向阈值电压之间,输出不改变,也就是说输出由高电准位翻转为低电准位,或是由低电准位翻转为高电准位时所对应的阈值电压是不同的。只有当输入电压发生足够的变化时,输出才会变化,因此将这种元件命名为触发器。

  施密特触发器可作为波形整形电路,能将模拟信号波形整形为数字电路能够处理的方波波形,而且由于施密特触发器具有滞回特性,所以可用于抗干扰,其应用包括在开回路配置中用于抗扰,以及在闭回路正回授/负回授配置中用于实现多谐振荡器。

(3)对 I/O 端口进行编程作为复用功能时:

  • 可将输出缓冲器配置为开漏或推挽
  • 输出缓冲器由来自外设的信号驱动(发送器使能和数据)
  • 施密特触发器输入被打开
  • 根据 GPIOx_PUPDR 寄存器中的值决定是否打开弱上拉电阻和下拉电阻
  • 输入数据寄存器每隔 1 个 AHB1 时钟周期对 I/O 引脚上的数据进行一次采样
  • 对输入数据寄存器的读访问可获取 I/O 状态
    在这里插入图片描述

(4)对 I/O 端口进行编程作为模拟配置时:

  • 输出缓冲器被禁止。
  • 施密特触发器输入停用,I/O 引脚的每个模拟输入的功耗变为零。施密特触发器的输出被 强制处理为恒定值 (0)。
  • 弱上拉和下拉电阻被关闭。
  • 对输入数据寄存器的读访问值为“0”。
  • 在模拟配置中,I/O 引脚不能为 5 V 容忍
    在这里插入图片描述

2.4上下拉电阻
  上下拉电阻(Pull-up 和 Pull-down Resistors)是电子电路中常用的一种组件,用于确保数字电路中的信号线在没有其他信号源驱动时处于一个确定的状态。它们对于防止信号线悬空(浮空)非常重要,因为在悬空状态下,信号线可能会受到噪声干扰,导致误操作。

(1)上拉电阻

  • 将一个不确定的信号,通过一个电阻与电源VCC相连,固定在高电平;
  • 上拉是对器件注入电流;灌电流;
  • 当一个接有上拉电阻的IO端口设置为输入状态时,它的常态为高电平;

(2)下拉电阻

  • 将一个不确定的信号,通过一个电阻与地GND相连,固定在低电平;
  • 下拉是从器件输出电流;拉电流;
  • 当一个接有下拉电阻的IO端口设置为输入状态时,它的常态为低电平;

三、寄存器编程

  寄存器是微处理器或微控制器内部的小型存储单元,用于临时存储数据、指令或控制信号。寄存器通常由硬件实现,并且可以直接通过CPU访问。寄存器的设计目的是为了提高处理器的性能,因为它们比内存访问更快。在微控制器如STM32F407中,寄存器用于配置和控制各种外设的功能。

3.1寄存器分类
寄存器可以根据它们的功能和位置分为几类:

  • 通用寄存器:用于存储数据或作为临时存储空间。
  • 状态寄存器:存储有关处理器状态的信息,如标志位。
  • 控制寄存器:用于控制处理器的行为。
  • 外设寄存器:用于配置和控制微控制器中的外设。

3.2stm32常见寄存器及用途
  STM32F407是一款高性能的ARM Cortex-M4微控制器,它拥有大量的寄存器用于配置和控制其功能。下面是一些STM32F407中常见的寄存器及其用途:

(1)GPIO寄存器
GPIO(General-Purpose Input/Output)寄存器用于配置和控制通用输入输出引脚。

  • GPIOx_MODER:配置GPIO引脚的工作模式(输入、输出、复用功能等)。
  • GPIOx_OTYPER:配置GPIO引脚的输出类型(推挽或开漏)。
  • GPIOx_OSPEEDR:配置GPIO引脚的输出速度。
  • GPIOx_PUPDR:配置GPIO引脚的上拉/下拉电阻。
  • GPIOx_IDR:读取GPIO引脚的输入值。
  • GPIOx_ODR:设置GPIO引脚的输出值。
  • GPIOx_BSRR:设置或清除GPIO引脚的输出值。
  • GPIOx_LCKR:锁定GPIO引脚的配置。

(2)时钟控制寄存器
这些寄存器用于控制和配置STM32F407的时钟系统。

  • RCC_CR:控制时钟源的选择和启动。
  • RCC_PLLCFGR:配置PLL(Phase-Locked Loop)时钟。
  • RCC_CFGR:配置时钟树,包括AHB/APB总线时钟。
  • RCC_CIR:时钟中断寄存器。

(3)中断寄存器
这些寄存器用于控制和配置中断。

  • NVIC_ISER:中断使能寄存器。
  • NVIC_ICER:中断清除使能寄存器。
  • NVIC_ISPR:中断挂起寄存器。
  • NVIC_ICPR:中断清除挂起寄存器。
  • NVIC_IPR:中断优先级寄存器。

3.3寄存器编程
  寄存器编程是指通过直接对寄存器进行读写操作来控制微控制器或微处理器的行为。这种编程方式通常用于底层硬件访问和控制,比如配置GPIO端口、控制外设、设置中断等。寄存器编程涉及到对寄存器的地址映射和位操作。

寄存器编程的一般步骤

  1. 确定寄存器地址:每个寄存器都有一个唯一的地址,该地址用于在内存映射中定位寄存器。
  2. 读取寄存器值:读取寄存器当前的状态,通常使用读取指令或直接访问内存地址。
  3. 修改寄存器值:根据需要改变寄存器中的某些位,这通常涉及位操作(如位移、按位或、按位与等)。
  4. 写入寄存器:将修改后的值写回寄存器。

(1)使能端口F的硬件时钟:

  • 使用RCC_AHB1ENR寄存器。
  • 地址:0x40023800 + 0x30。
  • 操作:使能端口F的硬件时钟。
// 使能端口F的硬件时钟
volatile uint32_t *RCC_AHB1ENR=(uint32_t *)(0x40023800+0x30);	
*RCC_AHB1ENR|=1<<5;

(2)配置GPIOF9为输出模式:

  • 使用GPIOx_MODER寄存器。
  • 地址:0x40021400 + 0x00。
  • 操作:设置第9个引脚为输出模式。
// 设置GPIOF9为输出模式
volatile uint32_t *GPIOF_MODER = (uint32_t *)(0x40021400 + 0x00);
*GPIOF_MODER |= (0x01 << (9 * 2));

(3)配置GPIOF9为推挽输出:

  • 使用GPIOx_OTYPER寄存器。
  • 地址:0x40021400 + 0x04。
  • 操作:设置第9个引脚为推挽输出。
// 设置GPIOF9为推挽输出
volatile uint32_t *GPIOF_OTYPER = (uint32_t *)(0x40021400 + 0x04);
*GPIOF_OTYPER &= ~(0x01 << 9);

(4)配置GPIOF9的输出速度:

  • 使用GPIOx_OTYPER寄存器。
  • 地址:0x40021400 + 0x08。
  • 操作:设置第9个引脚的输出速度。
// 设置GPIOF9的速度为高速
volatile uint32_t *GPIOF_OSPEEDR = (uint32_t *)(0x40021400 + 0x08);
*GPIOF_OSPEEDR |= (0x03 << (9 * 2));

(5)配置GPIOF9的上拉/下拉:

  • 使用GPIOx_PUPDR寄存器。
  • 地址:0x40021400 + 0x0C。
  • 操作:设置第9个引脚为无上拉/下拉。
// 设置GPIOF9为无上拉/下拉
volatile uint32_t *GPIOF_PUPDR = (uint32_t *)(0x40021400 + 0x0C);
*GPIOF_PUPDR &= ~(0x03 << (9 * 2));

(6)设置GPIOF9为低电平:

  • 使用GPIOx_ODR寄存器。
  • 地址:0x40021400 + 0x14。
  • 操作:设置第9个引脚为低电平。
// 设置GPIOF9为低电平
volatile uint32_t *GPIOF_ODR = (uint32_t *)(0x40021400 + 0x14);
*GPIOF_ODR &= ~(0x01 << 9);

相关文章:

【STM32】知识点介绍二:GPIO引脚介绍

文章目录 一、概述二、GPIO的工作模式三、寄存器编程 一、概述 GPIO&#xff08;英语&#xff1a;General-purpose input/output&#xff09;,即通用I/O(输入/输出)端口&#xff0c;是STM32可控制的引脚。STM32芯片的GPIO引脚与外部设备连接起来&#xff0c;可实现与外部通讯、…...

【STM32】GPIO

目录 1、什么是GPIO2、什么是GPIO组3、GPIO的基本结构4、GPIO位结构5、GPIO八种工作模式6、GPIO相关寄存器1. 端口配置低寄存器GPIO[x]_CRL和端口配置高寄存器GPIO[x]_CRH, Config Register High和Config Register Low)2. 端口输入数据寄存器(GPIO[x]_IDR)3. 端口输出数据寄存器…...

鸿蒙移动应用开发--UI组件布局

实验要求&#xff1a; 制作一个B站视频卡片界面&#xff0c;大致如下图所示&#xff0c;要求应用到线性布局、层叠布局等相关课堂知识。背景图、logo及文本内容不限。 实验环境 &#xff1a;DevEco Studio 实验过程&#xff1a; 步骤1&#xff1a;创建项目 1. 在您的开发环境…...

[MySQL]MySQL数据库基础知识与操作

MySQL基础知识 为什么要有数据库&#xff1f; 文件存储的缺点 1.没有以某种特定的数据格式存储数据&#xff0c;查找不方便&#xff0c;只能遍历2.安全性&#xff1a;数据误操作后不能回滚3.每次操作数据都要用户自己操作4.数据量大的时候&#xff0c;操作的成本很高 创建一…...

卡诺图化简法的原理

引子 若两个最小项只有一个因子不同&#xff0c;则称这两个最小项具有相邻性。 例如&#xff0c; A ′ B C ′ ABC A′BC′和 A B C ABC ABC两个最小项仅第一个因子不同&#xff0c;所以它们具有相邻性。这两个最小项相加时定能合并成一项并将一对不同的因子消去 A ′ B C ′…...

从零开始:使用Luatools工具高效烧录Air780EPM核心板项目的完整指南

本文将深入讲解如何使用Luatools工具烧录一个具体的项目到Air780EPM开发板中。如何使用官方推荐的Luatools工具&#xff08;一款跨平台、命令行驱动的烧录利器&#xff09;&#xff0c;通过“环境配置→硬件连接→参数设置→一键烧录”四大步骤&#xff0c;帮助用户实现Air780E…...

探秘Transformer系列之(18)--- FlashAttention

探秘Transformer系列之&#xff08;18&#xff09;— FlashAttention 文章目录 0x00 概述0.1 问题0.2 其它解决方案0.3 Flash Attention 0x01 背景知识1.1 GPU相关概念硬件概念运行单元内存 软件概念运行模式线程模型Grid & DeviceBlock & SMThread & SPThread &am…...

VUE2导出el-table数据为excel并且按字段分多个sheet

首先在根目录下建一个文件夹export用来存储export.js import * as XLSX from xlsxfunction autoWidthFunc(ws, data) {// 设置每列的最大宽度const colWidth data.map(row > row.map(val > {var reg new RegExp([\\u4E00-\\u9FFF], g) // 检测字符串是否包含汉字if (v…...

Android面试总结之Android RecyclerView:从基础机制到缓存优化

引言 在 Android 开发中&#xff0c;RecyclerView是高效展示列表数据的核心组件。其强大的性能源于独特的视图复用机制和四级缓存体系。本文将结合源码与示例&#xff0c;带你深入理解RecyclerView的工作原理与优化策略。 核心组件 RecyclerView&#xff1a;作为容器视图&am…...

【C#语言】C#文件操作实战:动态路径处理与安全写入

文章目录 ⭐前言⭐一、场景痛点⭐二、完整实现代码⭐三、关键技术解析&#x1f31f;1、动态路径处理&#x1f31f;2、智能目录创建&#x1f31f;3、安全的文件写入 ⭐四、进阶扩展方案&#x1f31f;1、用户自定义路径选择&#x1f31f;2、异常处理增强&#x1f31f;3、异步写入…...

react中 useEffect和useLayoutEffect的区别

useEffect 和 useLayoutEffect 都是 React 中用于处理副作用的 Hook&#xff0c;但它们在执行时机和用途上有一些关键区别。理解这些区别可以帮助你更好地选择适合的 Hook 来实现特定的功能。 1. 执行时机 useEffect&#xff1a; 异步执行&#xff1a;useEffect 是在组件渲染完…...

TDengine 中的系统信息统计

简介 TDengine 3.0 版本开始提供一个内置数据库 performance_schema&#xff0c;Performance_Schema 数据库中存储了系统中的各种统计信息&#xff0c;包括存储及性能有关统计数据。本节详细介绍其中的表和表结构。 PERF_APP 提供接入集群的应用&#xff08;客户端&#xff…...

C++可变参数

可变参数C风格的可变参数C风格可变参数的使用 C11可变参数模板递归展开参数包参数列表展开折叠表达式 STL中的emplace插入接口 可变参数 C风格的可变参数 可变参数是一种语言特性&#xff0c;可以在函数声明中使用省略号...来表示函数接受可变数量的参数。 例如典型的printf…...

建造者模式 (Builder Pattern)

建造者模式 (Builder Pattern) 是一种创建型设计模式,它将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。 一、基础 1.1 意图 将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。 1.2 适用场景 当创建复杂对象的算法应该…...

Thales靶机攻略

1.下载导入VBox&#xff0c;并启动靶机 靶机地址&#xff1a;https://download.vulnhub.com/thales/Thales.zip 解压后&#xff0c;在VBox中导入虚拟电脑。包含所有网卡的MAC地址。 导入完成&#xff0c;设置网卡模式为仅主机网络。开启靶机。 kali网卡更改为桥接模式。点击工…...

【redis】哨兵:搭建主从/哨兵节点详解和细节

文章目录 编排步骤搭建主从节点创建容器启动容器 搭建哨兵节点创建容器哨兵节点配置文件配置节点启动容器 主从/哨兵节点连入同一个局域网 编排步骤 分为两组 yml&#xff0c;先后启动 我们其实也可以用于一个 yml 文件&#xff0c;直接启动 6 个容器&#xff0c;但是&#x…...

零基础上手Python数据分析 (9):DataFrame 数据读取与写入 - 让数据自由穿梭

回顾一下,上篇博客我们学习了 Pandas 的核心数据结构 Series 和 DataFrame。 DataFrame 作为 Pandas 的 “王牌” 数据结构,是进行数据分析的基石。 但 DataFrame 的强大功能,还需要建立在 数据输入 (Input) 和 数据输出 (Output) 的基础上。 数据从哪里来? 分析结果又如何…...

Emacs 折腾日记(十九)——配置输入法和vim操作方式

上一篇文章中&#xff0c;我们将Emacs变得稍微好看了点。换成了自己喜欢的主题和颜色&#xff0c;这样每天用起来也比较养眼&#xff0c;不会特别排斥。本篇文章的主要任务就是配置输入法方便输入中文以及将vim的操作模式搬到Emacs中。进一步提到Emacs的可用性 配置中文输入法…...

Docker 镜像构建与优化

一、Dockerfile 构建镜像 1.1.拉取所需镜像 首先 docker pull 拉取一个 centos7 的镜像。 docker pull centos:7 下载 nginx 源码包。 官网&#xff1a;nginx: download wget https://nginx.org/download/nginx-1.26.3.tar.gz 1.2.解决 CentOS 7 安装源问题 因为原本的 …...

Mininet--moduledeps.py源码解析

整体构架概述 1. What is it moduledeps.py是Mininet网络模拟框架的模块依赖管理工具&#xff0c;用于动态管理Linux内核模块&#xff08;如Open vSwitch、TUN/TAP&#xff09;和验证系统环境。其核心目的是确保Mininet运行所需的底层模块和可执行文件已正确加载或存在&#…...

JAVA EE_多线程-初阶(一)

1.认识线程 1.1概念 1&#xff09;线程是什么 线程是在进程内部中进行运行的&#xff0c;可以把它想成一个“执行流“&#xff0c;每个线程负责执行线程内的部分代码&#xff0c;多个线程之间可以”同时“执行多个代码。 “同时”&#xff1a;指并行&#xff0c;采用分时复用…...

批量优化与压缩 PPT,减少 PPT 文件的大小

我们经常能够看到有些 PPT 文档明明没有多少内容&#xff0c;但是却占用了很大的空间&#xff0c;存储和传输非常的不方便&#xff0c;这时候通常是因为我们插入了一些图片/字体等资源文件&#xff0c;这些都可能会导致我们的 PPT 文档变得非常的庞大&#xff0c;今天就给大家介…...

AI 的“幻觉”现象:深入解析 Hallucination 的成因与应对之道

文章目录 一、啥是 AI 的 Hallucination&#xff1f;二、啥时候容易出现幻觉&#xff1f;1. 知识边界之外的问题2. 模糊或不明确的输入3. 生成长篇内容4. 多模态任务中的误解5. 过度自信的语气要求 三、幻觉为啥会出现&#xff1f;原理是啥&#xff1f;1. 概率预测的本质2. 训练…...

加载huggingface数据集报token无效错误解决方案

加载huggingface数据集报错 import pandas as pddf pd.read_json("hf://datasets/udell-lab/NLP4LP/data/test.jsonl", linesTrue) print(df)PS C:\Users\pengkangzhen\PythonProjects\llm-ecr> & C:/Users/pengkangzhen/.conda/envs/py3.12_ml/python.exe …...

Java面试题及知识点Day1

自动拆箱和自动装箱 装箱就是自动将基本数据类型转换为包装器类型 拆箱就是自动将包装其类型转化为基本数据类型 重写和重载 重写 1.发生在子类和父类之间 2.参数的方法名&#xff0c;参数&#xff0c;返回值&#xff0c;必须相同 3.权限修饰符不能小于重写方法的权限修饰符…...

【动态规划】-- 三步问题(easy)

文章目录 1. 题目2. 题目解析3. 代码 1. 题目 在线oj 三步问题。有个小孩正在上楼梯&#xff0c;楼梯有 n 阶台阶&#xff0c;小孩一次可以上 1 阶、2 阶或 3 阶。实现一种方法&#xff0c;计算小孩有多少种上楼梯的方式。结果可能很大&#xff0c;你需要对结果模 1000000007。…...

字符流Reader/Writer

一、Reader相关介绍及其子类 Reader是所有字符输入流的超类。它提供了读取字符流的基本方法&#xff0c;如read(), read(char[] cbuf, int off, int len)等&#xff1b;由于Reader是抽象类&#xff0c;通常使用它的子类如FileReader, BufferedReader等来创建字符输入流对象。 …...

字符串交替合并问题

问题&#xff1a; 给你两个字符串 word1 和 word2 。请你从 word1 开始&#xff0c;通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长&#xff0c;就将多出来的字母追加到合并后字符串的末尾。 返回 合并后的字符串 。 示例 1&#xff1a; 输入&#xff1a;w…...

shell脚本一键安装docker+docker-compose,支持x86_64、arm64双架构

目录 脚本内容 运行效果 安装包和脚本 脚本内容 [roottest1 docker]# cat install.sh #!/bin/bash set -e export pathpwd export docker_data"/data/docker_data"function check_arch() {if [ -f /etc/redhat-release ]; thenOS"RedHat"elif [ -f /e…...

Elasticsearch 面试备战指南

Elasticsearch 面试备战指南 一、基础概念 什么是Elasticsearch&#xff1f; Elasticsearch是一个基于Lucene的分布式搜索和分析引擎&#xff0c;提供近实时搜索、高可用性和水平扩展能力。常用于日志分析&#xff08;ELK&#xff09;、全文检索、商业智能等场景。 Elasticsea…...

新手村:逻辑回归-理解04:熵是什么?

新手村&#xff1a;逻辑回归04&#xff1a;熵是什么? 熵是什么? 前置条件 在开始学习逻辑回归中的熵理论之前&#xff0c;需要掌握以下基础知识&#xff1a; 概率论与统计学&#xff1a; 概率分布&#xff08;如伯努利分布、正态分布&#xff09;。条件概率和贝叶斯定理。期…...

Javaweb后端登录会话技术jwt令牌

jwt生成与校验 是base4补位的 最后面是签名&#xff0c;签名不是base64&#xff0c;是通过签名算法加密后来的 令牌长度不是固定的&#xff0c;长度取决于原始内容&#xff0c;载荷&#xff0c;大小 头有&#xff0c;类型&#xff0c;签名算法 base64可以对任意的二进制数据进…...

图像对比分析并生成报告

pip install pyautogui """ 图像对比分析工具 功能&#xff1a;实现像素级差异、结构相似性(SSIM)、直方图相似度和特征匹配率四种对比方法 作者&#xff1a;智能助手 版本&#xff1a;1.2 日期&#xff1a;2025-02-27""" import os import cv2 …...

DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加行拖拽排序功能示例1,TableView16_01.vue 基础行拖拽排序示例

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加行拖拽排序功能示例1,TableView16_01.vu…...

vue-如何将组件内容作为图片生成-html2canvas

1.引入必要的库 这里呢我们使用 html2canvas 库来将 HTML 元素转换为画布&#xff08;canvas&#xff09;&#xff0c;然后再将其导出为图片。首先&#xff0c;确保在项目中安装了 html2canvas&#xff1a; npm install html2canvas 2. 组件结构 然后在我们的vue文件里面&a…...

单片机 - RAM 与内存、ROM 与硬盘 之间的详细对比总结

RAM 与 内存 RAM&#xff08;Random Access Memory&#xff0c;随机存取存储器&#xff09; 和 内存 这两个术语通常是 同义词&#xff0c;即 内存 常常指的就是 RAM。 1. RAM&#xff08;内存&#xff09; 定义&#xff1a;RAM 是计算机中的 主存储器&#xff0c;用于临时存…...

Linux 练习一 NFS和DNS

练习四 任务需求&#xff1a;客户端通过访问 www.nihao.com 后&#xff0c;能够通过 dns 域名解析&#xff0c;访问到 nginx 服务中由 nfs 共享的首页文件&#xff0c;内容为&#xff1a;Very good, you have successfully set up the system. 各个主机能够实现时间同步&#…...

aab 转 apk

googleplay发布的游戏对外前&#xff0c;测试同学要安装到手机上先行测试&#xff0c;所以就有了这个需求。网上找了一篇文章讲的很详细了&#xff0c;文档是英语的&#xff0c;这里摘抄重要的部分做下记录&#xff1a; https://www.geekdashboard.com/extract-apk-files-from…...

JAVA开发:实例成员与静态成员

判断Java中的实例成员与静态成员 在Java中&#xff0c;可以通过以下几种方式判断一个成员是实例成员还是静态成员&#xff1a; 1. 通过声明方式判断 静态成员使用static关键字修饰&#xff0c;实例成员不使用&#xff1a; public class MyClass {// 实例成员int instanceVa…...

DeepSeek面试——模型架构和主要创新点

本文将介绍DeepSeek的模型架构多头潜在注意力&#xff08;MLA&#xff09;技术&#xff0c;混合专家&#xff08;MoE&#xff09;架构&#xff0c; 无辅助损失负载均衡技术&#xff0c;多Token 预测&#xff08;MTP&#xff09;策略。 一、模型架构 DeepSeek-R1的基本架构沿用…...

[项目]基于FreeRTOS的STM32四轴飞行器: 十二.角速度加速度滤波

基于FreeRTOS的STM32四轴飞行器: 十二.滤波 一.滤波介绍二.对角速度进行一阶低通滤波三.对加速度进行卡尔曼滤波 一.滤波介绍 模拟信号滤波&#xff1a; 最常用的滤波方法可以在信号和地之间并联一个电容&#xff0c;因为电容通交隔直&#xff0c;信号突变会给电容充电&#x…...

《基于SpringBoot的图书网购平台的设计与实现》开题报告

个人主页&#xff1a;大数据蟒行探索者 一、选题的依据及意义 1.1选题来源 市场需求驱动&#xff1a;如今&#xff0c;互联网深度融入人们生活&#xff0c;阅读场景愈发多元化&#xff0c;线上购书成为主流趋势之一。读者期望随时随地浏览海量图书资源&#xff0c;对比价格…...

Python 非异步函数执行异步函数的方案

import asyncio import sys from your_module import browser_main # 替换为你的实际模块名 async def _keep_alive(): """保持程序持续运行""" while True: await asyncio.sleep(1) def run_browser(index: int None): """ 执…...

计算机期刊推荐 | 工程技术-电子与电气, 计算机

IET Microwaves Antennas & Propagation的新特刊&#xff1a;《天线与超材料的设计、合成、仿真与实验》 学科领域&#xff1a; 工程技术-电子与电气, 计算机 期刊类型&#xff1a; SCI/SSCI/AHCI 收录数据库&#xff1a; SCI(SCIE) ISSN&#xff1a; 1751-8725 中科院…...

【开源宝藏】30天学会CSS - DAY9 第九课 牛顿摆动量守恒动画

以下是一份逐步拆解教程&#xff0c;带你从零理解并复刻这个牛顿摆&#xff08;Pendulum of Newton&#xff09;动画效果&#xff0c;这是一个经典的物理演示模型&#xff0c;现在通过纯 HTML 和 CSS 实现出来&#xff0c;视觉效果炫酷、结构简洁。 &#x1f3af; 动画效果说明…...

对三维物体模型的阈值操作

对三维物体模型的阈值操作 1. 使用point_coord_x、point_coord_y、point_coord_z阈值分割麻辣兔头2. point_normal_x、point_normal_y、point_normal_z有什么区别&#xff1f;3. 去除离群点 1. 使用point_coord_x、point_coord_y、point_coord_z阈值分割麻辣兔头 dev_open_win…...

【Unity网络编程知识】使用Socket实现简单TCP通讯

1、Socket的常用属性和方法 创建Socket TCP流套接字 Socket socketTcp new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 1.1 常用属性 1&#xff09;套接字的连接状态 socketTcp.Connected 2&#xff09;获取套接字的类型 socketTcp.So…...

简记_单片机硬件最小系统设计

以STM32为例&#xff1a; 一、电源 1.1、数字电源 IO电源&#xff1a;VDD、VSS&#xff1a;1.8~3.6V&#xff0c;常用3.3V&#xff0c;去耦电容1 x 10u N x 100n &#xff1b; 内核电源&#xff1a;内嵌的稳压器输出&#xff1a;1.2V&#xff0c;给内核、存储器、数字外设…...

Android Launcher实战:完美复刻iOS风格Hotseat布局优化

一、需求背景与效果呈现 在Android 13系统深度定制过程中&#xff0c;原生Launcher的Hotseat布局因视觉效果平庸需要进行UI重构。产品团队要求仿照iOS系统设计&#xff0c;实现以下核心特性&#xff1a; 取消传统横屏铺满效果 采用居中显示布局方案 支持圆角背景与智能边距调…...

2025-3-25算法打卡

一&#xff0c;走迷宫 1.题目描述&#xff1a; 给定一个 NMNM 的网格迷宫 GG。GG 的每个格子要么是道路&#xff0c;要么是障碍物&#xff08;道路用 11 表示&#xff0c;障碍物用 00 表示&#xff09;。 已知迷宫的入口位置为 (x1,y1)(x1​,y1​)&#xff0c;出口位置为 (x…...