【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,则:
- 当Pin点的电位Upin ≥ (VDD+uD)时,此时D1会导通而将Pin点的电位限制在VDD+uD,D2截止;
- 当Pin点的电位在范围(GND-uD) < Upin < (VDD+uD)时,D1截止,D2截止;
- 当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)使能端口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(英语:General-purpose input/output),即通用I/O(输入/输出)端口,是STM32可控制的引脚。STM32芯片的GPIO引脚与外部设备连接起来,可实现与外部通讯、…...
【AI】NLP
不定期更新,建议关注收藏点赞。 目录 transformer大语言模型Google Gemma疫情网民情绪识别 整体框架 baseline构建 模型调参、模型优化、其他模型 数据trick、指标优化、magic feature 数据增强、伪标签、迁移学习 模型融合sklearn中TFIDF参数详解 频率阈值可以去掉…...
Go 代理爬虫
现在注册,还送15美金注册奖励金 --- 亮数据-网络IP代理及全网数据一站式服务商 使用代理服务器,通过 Colly、Goquery、Selenium 进行网络爬虫的基础示例程序 本仓库包含两个分支: basic 分支包含供 Go Proxy Servers 这篇文章改动的基础代码…...
【NLP 43、大模型技术发展】
目录 一、ELMo 2018 训练目标 二、GPT-1 2018 训练目标 三、BERT 2018 训练目标 四、Ernie —— baidu 2019 五、Ernie —— Tsinghua 2019 六、GPT-2 2019 七、UNILM 2019 八、Transformer - XL & XLNet 2019 1.模型结构 Ⅰ、循环机制 Recurrence Mechanism Ⅱ、相对位置…...
在普通用户下修改root用户密码
1 从普通用户切换到root用户 sudo -s 再输入密码。 2 输入passwd ,会提醒你输入当前用户密码,验证后会提醒你输入root用户密码。 3 切换到root用户,使用修改过的密码登陆。 4 成功进入root用户。...
【每日算法】Day 6-1:哈希表从入门到实战——高频算法题(C++实现)
摘要 :掌握高频数据结构!今日深入解析哈希表的核心原理与设计实现,结合冲突解决策略与大厂高频真题,彻底掌握O(1)时间复杂度的数据访问技术。 一、哈希表核心思想 哈希表(Hash Table) 是一种基于键值对的…...
go命令使用
查看配置信息 go env配置go国内源 export GO111MODULEon export GOPROXYhttps://goproxy.cn测试 go install github.com/jesseduffield/lazydockerlatesthttps://github.com/jesseduffield/lazydocker...
深入 SVG:矢量图形、滤镜与动态交互开发指南
1.SVG 详细介绍 SVG(Scalable Vector Graphics) 是一种基于 XML 的矢量图形格式,用于描述二维图形。 1. 命名空间 (Namespace) 命名空间 URI:http://www.w3.org/2000/svg 用途:在 XML 或 XHTML 中区分不同标记语言的…...
SPPAS安装及问题汇总
SPPAS下载地址 文件找不到,可能是MAC的自动化操作问题,解决方案有二: 方案一: 直接查看SPPAS中的readme,运行sppas.command 方案二: 在自动化脚本中添加 export PATH/usr/local/bin:$PATH...
LINUX基础 [三] - 进程创建
目录 前言 进程创建的初次了解(创建进程的原理) 什么是fork函数? 初识fork函数 写时拷贝 fork函数存在的意义 fork调用失败的原因 进程终止 运行完毕结果不正确 main函数返回 库函数函数exit 系统调用接口_exit 进程异常终止 进…...
【day1】数据结构刷题 链表
一 反转链表 206. 反转链表 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1: 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1]示例 2: 输入:head [1,2] 输出:[2,1]…...
鼠标在客户区内按下左键和双击右键
书籍:《Visual C 2017从入门到精通》的2.6鼠标 环境:visual studio 2022 内容:【例2.44】鼠标在客户区内按下左键和双击右键 1.创建一个单文档程序 一个简单的单文档程序-CSDN博客https://blog.csdn.net/qq_20725221/article/details/1463…...
c++ map和vector模板类
在这一章中C语法之模板函数和模板类-CSDN博客 我们学习了怎样写模板函数和模板类,接下来我们来学习系统给我们写好的两个模板类:map和vector。 我相信有了上文的基础,能帮助我们更好的理解这些模板类。 map和vector 是C STL(标准模板库) 中的一部分&a…...
hn航空app hnairSign unidbg 整合Springboot
声明: 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 逆向分析 学习unidbg补环境。先弄一个…...
Arm Linux ceres库编译
由于工作需要,需在国产化系统上编译ceres库,手上有一块树莓派,就在树莓派上面进行测试编译ceres库,总体来说比较顺利。只出现了一点小问题 参考链接: Ceres中文教程-安装 Ceres官方网站(英文) …...
c++中的四种cast转换
文章目录 前言一、dynamic_cast二、static_cast三、const_cast四、reinterpret_cast总结 前言 C继承并扩展C语言的传统类型转换方式,提供了功能更加强大的转型机制(检查与风险) 转换类型典型用途安全性static_cast相关类型转换(…...
矩阵补充,最近邻查找
矩阵补充,最近邻查找 矩阵补充是向量召回最简单的一种方法,现在不常用,学习矩阵补充是为了更好的理解后面学到的双塔模型 下图,输入用户ID和物品ID后从Eebedding层拿到对应的向量做内积,内积的结果就是矩阵补充 模型…...
gradio调用多个CSS的HTML页
很多博客介绍的gradio读取html和css比较简单,如果要做很细致的前端页面优化,比如丰富的响应式的cssjs,至少要有html多个css,是暂不能实现的。bootstrap、font-awesome、jquery等 方案一当然是直接更换htmlcss为主的部署方式&#…...
NVIDIA NeMo 全面教程:从入门到精通
NVIDIA NeMo 全面教程:从入门到精通 文章目录 NVIDIA NeMo 全面教程:从入门到精通目录框架介绍NeMo的核心特点NeMo的架构NeMo与其他框架的比较NeMo的模型集合NeMo的工作流程NeMo 2.0的新特性 安装指南系统要求使用Docker容器安装步骤1:安装Do…...
Go 语言封装邮件发送功能
Go 语言封装邮件发送功能 🏆 目标📦 依赖包🌟 项目结构🚀 代码实现🛠️ 主要方法说明🧪 单元测试🌈 使用示例🏆 代码亮点🌟 改进方向🚀 总结 在现代 Web 开发…...
加新题了,MySQL 8.0 OCP 认证考试 题库更新
MySQL 8.0 OCP 认证考试 题库更新 MySQL 8.0 Database Administrator 考试科目:1Z0-908 近期发现,MySQL OCP认证考试题库发生变化,出现了很多新题,对此,CUUG专门收集整理了最新版本的MySQL考试原题,并会给…...
Thales靶机攻略
1.下载导入VBox,并启动靶机 靶机地址:https://download.vulnhub.com/thales/Thales.zip 解压后,在VBox中导入虚拟电脑。包含所有网卡的MAC地址。 导入完成,设置网卡模式为仅主机网络。开启靶机。 kali网卡更改为桥接模式。点击工…...
尝试使用Tauri2+Django+React项目(2)
前言 尝试使用tauri2DjangoReact的项目-CSDN博客https://blog.csdn.net/qq_63401240/article/details/146403103在前面笔者不知道怎么做,搞了半天 笔者看到官网,原来可以使用二进制文件,好好好 嵌入外部二进制文件 | Taurihttps://v2.taur…...
6.1 模拟专题:LeetCode 1576. 替换所有的问号
1. 题目链接 LeetCode 1576. 替换所有的问号 2. 题目描述 给定一个仅包含小写字母和问号 ? 的字符串 s,要求将所有 ? 替换为任意小写字母,使得替换后的字符串中 没有相邻的两个字符相同。 示例: 输入:s "?zs" →…...
Linux安装go环境
安装一个lazydocker,根据文档需要先安装go环境 https://github.com/jesseduffield/lazydocker 官方文档解析 https://go.dev/doc/install 文档内容如下,一共三步 1.删除先前安装的go,解压下载的go压缩包到/usr/local目录 2.添加环境变量&…...
卡特兰数在数据结构上面的运用
原理 Catalan数是一个数列,其第n项表示n个不同结点可以构成的二叉排序树的数量。Catalan数的第n项公式为:  其中,是组合数,表示从2n个元素中选择n个元素的组合数。 Catalan数的原理可以通过以下方式理解&…...
Unity知识点快速回顾系列
Unity知识点快速回顾系列导航 主要想用于快速回顾unity相关知识点,基本只讲解知识点,只有简单的示例,目前还在整理中。 一、C#知识点入门、基础、核心、进阶 二、Unity 知识点入门、基础、核心、进阶 三、Unity 数据持久化 四、Unity 知识点快…...
悟空crm v12安装好后出现 网络错误问题(已解决)
请求网址: http://wwww.aaaa.com/gateway/adminUser/queryUserNumInfo 请求方法: POST 状态代码: 502 Bad Gateway 远程地址: 101.37.79.226:9807 引荐来源网址政策: strict-origin-when-cross-origin...
便携版:随时随地,高效处理 PDF 文件
PDF-XChange Editor Plus 便携版是一款功能强大且极其实用的 PDF 阅读与编辑工具。它不仅支持快速浏览 PDF 文件,还提供了丰富的编辑功能,让用户可以轻松处理 PDF 文档。经过大神优化处理,这款软件已经变得十分轻便,非常适合需要随…...
【Golang】补充:占位符、转义字符、错误处理
🔥 个人主页:星云爱编程 🔥 所属专栏:Golang 🌷追光的人,终会万丈光芒 🎉欢迎大家点赞👍评论📝收藏⭐文章 1、占位符 1.1通用占位符 %v :默认格式的值。适…...
