三、GPIO
一、GPIO简介
- GPIO(General Purpose Input Output)通用输入输出口
- GPIO引脚电平:0V(低电平)~3.3V(高电平),部分引脚可容忍5V
- 容忍5V,即部分引脚输入5V的电压,也认为是高电平;引脚定义中有FT(Five Tolerate)即表示可容忍5V;
- 对于输出而言,最大就只能输出3.3V,因为供电就只有3.3V;
- 可配置为8种输入输出模式;
- 输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等;
- 输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等;
二、GPIO基本结构
1.GPIO整体结构

- STM32上,所有的GPIO都是挂载在APB2时钟总线上;
- GPIO外设的名称按照GPIOA、B、C等等来命名的;
- 每个GPIO外设有16个引脚,编号0~15;
- 每个GPIO模块内,主要包含了寄存器和驱动器;
- 寄存器就是一段特殊的存储器,内核可以通过APB2总线对寄存器进行读写,从而实现电平的输出和读取功能;
- 寄存器的每一位对应一个引脚;
- 输出寄存器写1,对应引脚就会输出高电平;写0,就会输出低电平;
- 输入寄存器读取为1,对应引脚目前为高电平;读取为0,为低电平;
- STM32为32位的单片机,所以STM32内部的寄存器都是32位,但每个GPIO只有16个引脚,所以寄存器只有低16位有对应的引脚,高16位是没有用到的;
- 驱动器是用来增加信号的驱动能力,寄存器只负责存储数据;当进行点灯这样的操作,还是需要驱动器增大驱动能力;
- 寄存器就是一段特殊的存储器,内核可以通过APB2总线对寄存器进行读写,从而实现电平的输出和读取功能;
2.GPIO位结构

- 保护二极管:用于限制引脚的输入电压;
- 上面保护二极管接VDD(3.3V),下面二极管接VSS(0V);
- 当输入电压高于3.3V时,上方二极管导通,输入电压产生的电流就会直接流入VDD而不会流入内部电路,避免过高的电压对内部电路产生伤害;
- 当输入电压低于0V时,下方二极管导通,电流会直接从IO引脚流出去,而不会从内部电路汲取电流,从而保护内部电路;
- 当输入电压位于0~3.3V之间,上下方二极管均不会导通;
- 上下拉电阻
- 上下拉电阻的作用是给输入提供一个默认的输入电平,上下拉电阻均断开时,引脚处于浮空状态,此时引脚的输入电平极易受到外界干扰而改变;
- 上拉电阻连接VDD(3.3V);下方电阻连接VSS(0V);连接开关可通过程序进行配置;
- 上拉电阻打开,下拉电阻断开,即上拉输入模式,又称作默认为高电平的输入模式;
- 上拉电阻断开,下拉电阻打开,即下拉输入模式,又称作默认为低电平的输入模式;
- 上拉电阻和下拉电阻均断开,即浮空输入模式;
- 上下拉电阻的阻值都是比较大的,是一种弱上拉和弱下拉,目的是尽量不影响正常的输入操作;
- 施密特触发器:对输入电压进行整形
- 当施密特触发器的输入电压大于某一阈值时,输出就会瞬间升为高电平;小于某一阈值,输出就会瞬间降为低电平;
- 例如:引脚的波形为外界输入,虽然是数字信号,但实际情况下可能产生各种失真,一下面波形举例:

- 数据选择器:选择是输出数据寄存器还是片上外设(复用功能输出)的信号输入到输出控制;
- 位设置/清除寄存器:用来单独操作输出数据寄存器的某一位,而不影响其他位(即单独操作GPIO中某一引脚的电平高低,输出寄存器同时控制GPIO的16个端口,且只能整体读写 )
- MOS管:MOS管可以理解成电子开关,输出控制的信号控制开关的导通和关闭,进而控制IO口连接到VDD(3.3V)或VSS(0V);可选择推挽、开漏、关闭三种输出模式
- 推挽输出模式:P-MOS和N-MOS均有效;这种模式下,高低电平均有较强的驱动能力,所以推挽输出模式也称为强推输出模式;在推挽输出模式下,STM32对IO口具有绝对的控制权,高低电平都有STM32控制;
- 输出控制输出1时,P-MOS导通,N-MOS断开,输出直接接到VDD(3.3V),输出高电平;
- 输出控制输出0时,P-MOS断开,N-MOS导通,输出直接接到VSS(0V),输出低电平;
- 开漏输出模式:P-MOS无效,N-MOS有效;这种模式下,只有低电平有驱动能力,高电平没有驱动能力;开漏模式常用作通信协议的输出方式,比如I2C通信的引脚;在多机通信的情况下,开漏模式可以避免各个设备的相互干扰;
- 输出控制输出1时,P-MOS断开,N-MOS断开,输出相当于断开,即高阻模式;
- 输出控制输出0时,P-MOS断开,N-MOS导通,输出直接接到VSS(0V),输出低电平;
- 开漏模式还可以用于输出5V的电平信号:在IO口外接一个上拉电阻到5V的电源,输出低电平时,由内部的N-MOS直接接VSS(0V);输出高电平时,由外部上拉电阻拉高至5V;这样就可以输出5V信号,用于兼容一些5V的电平设备;
- 关闭模式:当引脚配置为输入模式时,P-MOS和N-MOS均无效,端口的电平由外部信号来控制;
- 推挽输出模式:P-MOS和N-MOS均有效;这种模式下,高低电平均有较强的驱动能力,所以推挽输出模式也称为强推输出模式;在推挽输出模式下,STM32对IO口具有绝对的控制权,高低电平都有STM32控制;
三、GPIO的8种工作模式

- 上拉/下拉/浮空输入配置

- 模拟输入配置

- 推挽/开漏输出配置

- 复用推挽/开漏输出配置

- 在输出模式下,输入都是有效的;在输入模式下,输出都是无效的;(因为一个端口只能有一个输出,但可以有多个输入);
- 在GPIO的8种模式下,除了模拟输入模式会关闭数字输入功能,其他7种模式下,数字输入都是有效的;
四、参考手册_GPIO部分介绍
-
STM32F103数据手册和参考手册 蓝奏云下载链接,密码:2nkx

-
端口配置寄存器

- 每一个端口的模式由4位进行配置, 16个端口就需要64位,每个寄存器32位,所以配置寄存器有2个;
- GPIO的输出速度可以限制输出引脚的最大翻转速度,该设计是为了低功耗和稳定性,一般要求不高时,配置成50MHz即可;
-
端口输入寄存器

- 低16位对应16个引脚,高16位没有使用;
-
端口输出寄存器

- 低16位对应16个引脚,高16位没有使用;
-
端口位设置/清除寄存器

- 高16位用于位清除,低16位用于位设置; 写1用于设置或清除,写0不产生影响;
-
端口位清除寄存器

- 低16位效果和端口位设置/清除寄存器的高16位功能一样;
- 当只需要单一的进行位设置或位清除,位设置时,用端口位设置/清除寄存器;位清除时,用端口位清除寄存器;(此时进行位设置和位清除时,使用的都是低16位的数据,比较方便);
- 当需要对多个端口同时进行位设置和位清除,可以使用端口设置/清除寄存器,这样可以保证位设置和位清除的同步性;
五、GPIO输出实验_外围设备介绍
1.LED和蜂鸣器
(1)LED和蜂鸣器简介
- LED,发光二极管,正向通电点亮,反向通电不亮;

- 蜂鸣器:分为有源蜂鸣器和无源蜂鸣器
-
有源蜂鸣器:内部自带震荡源,正负极接上直流电压即可持续发声,频率固定;

-
无源蜂鸣器:内部不带震荡源,需要控制器提供震荡脉冲才可发声;调整提供的震荡脉冲的频率,可发出不同频率的声音;
-
(2)LED和蜂鸣器硬件电路

- STM32的GPIO在推挽输出模式下,高低电平具有比较强的驱动能力,选用高电平驱动或者低电平驱动均可;
- 单片机电路种,一般倾向于低电平驱动,因为很多单片机或芯片,都是用了高电平弱驱动,低电平强驱动的规则(这样可以一定程度上避免高低电平冲突);
2.面包板


六、GPIO输出实验
1.LED闪烁
-
接线图

-
操作STM32的GPIO外设一共需要3个步骤:
- 使用RCC(Reset Clock Control,复位时钟控制),开启GPIO的时钟;
- 使用GPIO_Init()函数初始化GPIO;
- 使用输出或输入函数控制GPIO口;
-
RCC外设常用的3个库函数


-
GPIO常用的库函数:GPIO_Init、GPIO的8个读写函数

- GPIO的4个输出函数

- GPIO的4个输出函数
-
Delay延时函数
- Delay.c
#include "stm32f10x.h"/*** @brief 微秒级延时* @param xus 延时时长,范围:0~233015* @retval 无*/ void Delay_us(uint32_t xus) {SysTick->LOAD = 72 * xus; //设置定时器重装值SysTick->VAL = 0x00; //清空当前计数值SysTick->CTRL = 0x00000005; //设置时钟源为HCLK,启动定时器while(!(SysTick->CTRL & 0x00010000)); //等待计数到0SysTick->CTRL = 0x00000004; //关闭定时器 }/*** @brief 毫秒级延时* @param xms 延时时长,范围:0~4294967295* @retval 无*/ void Delay_ms(uint32_t xms) {while(xms--){Delay_us(1000);} }/*** @brief 秒级延时* @param xs 延时时长,范围:0~4294967295* @retval 无*/ void Delay_s(uint32_t xs) {while(xs--){Delay_ms(1000);} }- Delay.h
#ifndef __DELAY_H #define __DELAY_Hvoid Delay_us(uint32_t us); void Delay_ms(uint32_t ms); void Delay_s(uint32_t s);#endif -
main.c
#include "stm32f10x.h" // Device header
#include "Delay.h"int main(void)
{//1.打开GPIOA时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //2.配置PA0为推挽输出GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);while(1){GPIO_ResetBits(GPIOA, GPIO_Pin_0); // 打开LEDDelay_ms(500);GPIO_SetBits(GPIOA, GPIO_Pin_0); // 关闭LEDDelay_ms(500);}}
- LED闪烁实验,工程下载地址,密码:gso9
2.LED流水灯
- 接线图

- main.c
#include "stm32f10x.h" // Device header
#include "Delay.h"int main(void)
{//1.打开GPIOA时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //2.配置PA0-PA7为推挽输出GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);while(1){GPIO_Write(GPIOA, ~0x0001);Delay_ms(500);GPIO_Write(GPIOA, ~0x0002);Delay_ms(500);GPIO_Write(GPIOA, ~0x0004);Delay_ms(500);GPIO_Write(GPIOA, ~0x0008);Delay_ms(500);GPIO_Write(GPIOA, ~0x0010);Delay_ms(500);GPIO_Write(GPIOA, ~0x0020);Delay_ms(500);GPIO_Write(GPIOA, ~0x0040);Delay_ms(500);GPIO_Write(GPIOA, ~0x0080);Delay_ms(500);}}
- LED流水灯实验,工程下载地址,密码:1vmb
3.蜂鸣器
- 接线图

- main.c
#include "stm32f10x.h" // Device header
#include "Delay.h"int main(void)
{//1.打开GPIOB时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //2.配置PA0-PA7为推挽输出GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);while(1){GPIO_ResetBits(GPIOB, GPIO_Pin_12);Delay_ms(100);GPIO_SetBits(GPIOB, GPIO_Pin_12);Delay_ms(100);GPIO_ResetBits(GPIOB, GPIO_Pin_12);Delay_ms(100);GPIO_SetBits(GPIOB, GPIO_Pin_12);Delay_ms(700);}}
- 蜂鸣器实验,工程下载地址,密码:a1zp
4.库函数的使用方法
- 打开对应外设库函数种的.h文件,查看有哪些函数------>转到对应函数的定义,查看函数功能和参数的用法;
- 库函数使用手册(老版本,部分用法有出入,整体差异不大)下载链接
- 网上搜索,参考别人的代码;
七、GPIO输入实验_外围设备介绍
1.按键
- 常用的输入设备,按下导通,松开断开;
- 按键抖动:按键内部使用的是机械式弹簧片来进行通断,在按下和松手的瞬间会伴有一连串的抖动;
- 按键的抖动时间比较短,通常在5~10ms,人眼是分辨不出来的,但是对于高速运行的单片机而言,5 ~ 10ms还是很漫长的,所以需要对抖动进行过滤,即按键消抖;
- 最简单的过滤办法就是加一段延时,把抖动时间耗过去;

- 按键的电路

2.传感器模块
- 课程中有4个传感器模块:光敏电阻传感器、热敏电阻传感器、对射式红外传感器、反射式红外传感器;
- 这些传感器模块都是利用传感器元件(光敏电阻/热敏电阻/红外接收管)的电阻会随着外界的模拟量变化而变化(光线越强,光敏电阻阻值越小;温度越高,热敏电阻阻值越小;红外光线越强,红外接收管的阻值越小;)
- 电阻的变化不容易采集到,通常将传感器元件与定值电阻进行串联分压,这样就可以得到模拟电压的输出。对于电路来说,检测电压就比较容易;
- 还可以通过电压比较器,对输出的模拟电压进行二值化,这样就可以得到数字电压输出;

- 传感器的电路

八、GPIO输入实验
1. 按键控制LED
- 接线图

- 读取引脚和端口的库函数

- LED.c
#include "stm32f10x.h" // Device headervoid LED_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_SetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2);
}void LED1_ON(void)
{GPIO_ResetBits(GPIOA, GPIO_Pin_1);
}void LED1_OFF(void)
{GPIO_SetBits(GPIOA, GPIO_Pin_1);
}void LED1_Turn(void)
{if(GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1) == 0){GPIO_SetBits(GPIOA, GPIO_Pin_1);}else{GPIO_ResetBits(GPIOA, GPIO_Pin_1);}
}void LED2_ON(void)
{GPIO_ResetBits(GPIOA, GPIO_Pin_2);
}void LED2_OFF(void)
{GPIO_SetBits(GPIOA, GPIO_Pin_2);
}void LED2_Turn(void)
{if(GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_2) == 0){GPIO_SetBits(GPIOA, GPIO_Pin_2);}else{GPIO_ResetBits(GPIOA, GPIO_Pin_2);}
}
- LED.h
#ifndef __LED_H
#define __LED_Hvoid LED_Init(void);void LED1_ON(void);
void LED1_OFF(void);
void LED1_Turn(void);
void LED2_ON(void);
void LED2_OFF(void);
void LED2_Turn(void);#endif
- Key.c
#include "stm32f10x.h" // Device header
#include "Delay.h"void Key_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_11;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);
}uint8_t Ket_GetNum(void)
{uint8_t KeyNum = 0;if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0) // 按键1按下{ Delay_ms(20); // 消抖while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0); // 等待抬起Delay_ms(20); // 消抖KeyNum = 1; // 按键1按下后松开}if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0) // 按键2按下{ Delay_ms(20); // 消抖while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0); // 等待抬起Delay_ms(20); // 消抖KeyNum = 2; // 按键2按下后松开}return KeyNum;
}
- Key.h
#ifndef __KEY_H
#define __KEY_H
#include "stm32f10x.h" // Device headervoid Key_Init(void);
uint8_t Ket_GetNum(void); #endif
- 按键控制LED实验,工程下载地址,密码:2pzm
2.光敏传感器控制蜂鸣器
- 接线图

- Buzzer.c
#include "stm32f10x.h" // Device headervoid Buzzer_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_SetBits(GPIOB, GPIO_Pin_12);
}void Buzzer_ON(void)
{GPIO_ResetBits(GPIOB, GPIO_Pin_12);
}void Buzzer_OFF(void)
{GPIO_SetBits(GPIOB, GPIO_Pin_12);
}void Buzzer_Turn(void)
{if(GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_12) == 0){GPIO_SetBits(GPIOB, GPIO_Pin_12);}else{GPIO_ResetBits(GPIOB, GPIO_Pin_12);}
}
- Buzzer.h
#ifndef __BUZZER_H
#define __BUZZER_Hvoid Buzzer_Init(void);
void Buzzer_ON(void);
void Buzzer_OFF(void);
void Buzzer_Turn(void);#endif
- LightSensor.c
#include "stm32f10x.h" // Device headervoid LightSeneorInit(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 光敏传感器,光照强时,输出低电平,输出指示灯亮;光照弱时,输出高电平,输出指示灯灭;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_SetBits(GPIOB, GPIO_Pin_13);
}uint8_t LightSensor_Get(void)
{return GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_13);
}
- LightSensor.h
#ifndef __LightSensor_H
#define __LightSensor_H
#include "stm32f10x.h" // Device headervoid LightSeneorInit(void);
uint8_t LightSensor_Get(void);#endif
- main.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "Buzzer.h"
#include "LightSensor.h"int main(void)
{Buzzer_Init();LightSeneorInit();while(1){if(LightSensor_Get() == 1){Buzzer_ON();}else{Buzzer_OFF();}}}
- 光敏传感器控制蜂鸣器,工程下载地址,密码:bh7h
相关文章:
三、GPIO
一、GPIO简介 GPIO(General Purpose Input Output)通用输入输出口GPIO引脚电平:0V(低电平)~3.3V(高电平),部分引脚可容忍5V 容忍5V,即部分引脚输入5V的电压,…...
Guava Cache 实战:构建高并发场景下的字典数据缓存
一、场景背景 在系统开发中,字典数据(如状态类型、分类数据)具有以下特点: 高频读取(每个请求都可能涉及)低频变化(管理员修改后才会变更)数据一致性要求适中(允许分钟…...
混杂模式(Promiscuous Mode)与 Trunk 端口的区别详解
一、混杂模式(Promiscuous Mode) 1. 定义与工作原理 定义:混杂模式是网络接口的一种工作模式,允许接口接收通过其物理链路的所有数据包,而不仅是目标地址为本机的数据包。工作层级:OSI 数据链路层&#x…...
rknn_convert的使用方法
rknn_convert是RKNN-Toolkit2提供的一套常用模型转换工具,通过封装上述API接口,用户只需编辑模型对应的yml配置文件,就可以通过指令转换模型。以下是如何使用rknn_convert工具的示例命令以及支持的指令参数: python -m rknn.api.…...
Turtle综合案例实战(绘制复杂图形、小游戏)
在学习了 Turtle 基本的绘图技巧后,我们可以通过结合多个概念和技巧,绘制复杂的图形或实现简单的小游戏。本章将介绍两个实战案例: 绘制复杂图形:结合前面所学的知识,绘制一个精美的多层次复杂图案。简单的游戏:利用 Turtle 实现一个简单的小游戏——蛇形游戏,这是一个经…...
[dp5_多状态dp] 按摩师 | 打家劫舍 II | 删除并获得点数 | 粉刷房子
目录 1.面试题 17.16. 按摩师 题解 2.打家劫舍 II 题解 3.删除并获得点数 题解 4.粉刷房子 题解 一定要有这样的能力,碰到一个新题的时候,可以往之前做过的题方向靠! 打家劫舍问题模型: 不能选择相邻的两个数,并且要最终…...
DM数据库配置归档模式的两种方式
归档模式,联机日志文件中的内容保存到硬盘中,形成归档日志文件(REDO日志)。 采用归档模式会对系统的性能产生些许影响,然而系统在归档模式下运行会更安全,当 出现故障时其丢失数据的可能性更小,这是因为一旦出现介质故…...
Leetcode 2440 -- dfs | 枚举
题目描述 创建价值相同的连通块 思路 代码 class Solution { public:int componentValue(vector<int>& nums, vector<vector<int>>& edges) {// get max_val and sum_valint n nums.size();int max_val -1, sum_val 0;for(auto &x : nums) m…...
Vue 中 this.$emit(“update:xx“,value) 和 :xx.sync 实现同步数据的做法
在 Vue 2.x 中,this.$emit(update:xx, value) 和 xx.sync 都是用来实现父子组件之间的数据同步的方式,它们背后的工作原理有些相似,但语法上有所不同。让我们逐个详细解释这两者的使用方式。 xx.sync(语法糖) xx.syn…...
Agent TARS与Manus的正面竞争
Agent TARS 是 Manus 的直接竞争对手,两者在 AI Agent 领域形成了显著的技术与生态对抗。 一、技术架构与功能定位的竞争 集成化架构 vs 模块化设计 Agent TARS 基于字节跳动的 UI-TARS 视觉语言模型,将视觉感知、推理、接地(grounding&#…...
【Tauri2】013——前端Window Event与创建Window
前言 【Tauri2】012——on_window_event函数-CSDN博客https://blog.csdn.net/qq_63401240/article/details/146909801?spm1001.2014.3001.5501 前面介绍了on_window_event,这个在Builder中的方法,里面有许多事件,比如Moved,Res…...
创建Linux虚拟环境并远程连接,finalshell自定义壁纸
安装VMware 这里不多赘述。 挂载Linux系统 1). 打开Vmware虚拟机,打开 编辑 -> 虚拟网络编辑器(N) 选择 NAT模式,然后选择右下角的 更改设置。 设置子网IP为 192.168.100.0,然后选择 应用 -> 确定。 解压 CentOS7-1.zip 到一个比较大…...
DBAPI设置服务器开机自启动
在 /etc/systemd/system 目录下创建一个新的服务文件,例如 dbapi.service [Unit] Descriptiondbapi standalone Service Afternetwork.target[Service] ExecStart/your-path/dbapi-enterprise-4.2.2/bin/dbapi.sh start standalone Restartalways Userroot[Install…...
基于pycharm的YOLOv11模型训练方法
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、前期准备1.1 软件环境配置1.2 训练集参考 二、训练步骤2.1 打开文件夹2.2 打开文件2.3 data.yaml最终代码 三、train.py四、最终结果五、detect.py六、 拓展…...
预测分析(三):基于机器学习的分类预测
文章目录 基于机器学习的分类预测分类任务逻辑回归分类树分类树的工作原理 随机森林多元分类朴素贝叶斯分类器贝叶斯公式回到分类问题**1. 算法原理****2. 主要类型****(1) 高斯朴素贝叶斯****(2) 多项式朴素贝叶斯****(3) 伯努利朴素贝叶斯** **3. 优缺点****4. 应用场景****5…...
基于大模型预测升主动脉瘤的多维度诊疗研究报告
目录 一、引言 1.1 研究背景 1.2 研究目的与意义 二、升主动脉瘤概述 2.1 定义与分类 2.2 发病原因与机制 2.3 流行病学现状 三、大模型技术原理及应用现状 3.1 大模型基本原理 3.2 在医疗领域的应用进展 3.3 针对升主动脉瘤预测的独特价值 四、术前大模型预测方案…...
解决Spring参数解析异常:Name for argument of type XXX not specified
前言 在开发 Spring Boot 应用时,我们常遇到类似 java.lang.IllegalArgumentException: Name for argument not specified 的报错。这类问题通常与方法参数名称的解析机制相关,尤其在使用 RequestParam、PathVariable 等注解时更为常见。 一、问题现象与…...
基数排序算法解析与TypeScript实现
基数排序(Radix Sort)是一种高效的非比较型整数排序算法,通过逐位分配与收集的方式实现排序。本文将深入解析其工作原理,并给出完整的TypeScript实现。 一、算法原理 1. 核心思想 多关键字排序:将整数按位数切割成不同…...
034-QSharedMemory
QSharedMemory 以下为针对 QSharedMemory 的技术调研及实现方案,包含原理、优化策略、完整代码实现及流程图解: 一、QSharedMemory 核心原理 1.1 共享内存机制 共享内存流程图 (注:此处应为共享内存IPC流程图,因文本…...
在 Ubuntu 上离线安装 Prometheus 和 Grafana
在 Ubuntu 上离线安装 Prometheus 和 Grafana 的步骤如下: 一.安装验证 二.安装步骤 1.准备离线安装包 在一台可以访问互联网的机器上下载 Prometheus 和 Grafana 的二进制文件。 Prometheus 下载地址:Prometheus 官方下载页面Grafana 下载地址&#…...
Ansible:playbook的高级用法
文章目录 1. handlers与notify2. tags组件3. playbook中使用变量3.1使用 setup 模块中变量3.2在playbook 命令行中定义变量3.3在playbook文件中定义变量3.4使用变量文件3.5主机清单文件中定义变量主机变量组(公共)变量 1. handlers与notify Handlers&am…...
【C++进阶九】继承和虚继承
【C进阶九】继承和虚继承 1.什么是继承2.继承关系2.1protected和private的区别2.2通过父类的函数去访问父类的private成员2.3默认继承 3.基类和派生类对象的赋值转换4.继承中的作用域5.子类中的默认成员函数6.继承与静态成员7. 菱形继承8.虚继承9.继承和组合 1.什么是继承 继承…...
近日八股——计算机网络
一.c. TCP握手为什么三次、不能是二次、或四次? i.不能是两次: 防止已经失效的连接报文突然又传到了服务端,产生错误 如果不采用三次握手,服务端直接建立连接,会白白浪费资源 三次握手告诉服务端,客户端有没有收这个数据&#…...
HOW - Axios 拦截器特性
目录 Axios 介绍拦截器特性1. 统一添加 Token(请求拦截器)2. 处理 401 未授权(响应拦截器)3. 统一处理错误信息(响应拦截器)4. 请求 Loading 状态管理5. 自动重试请求(如 429 过载)6…...
自适应信号处理任务(过滤,预测,重建,分类)
自适应滤波 # signals creation: u, v, d N = 5000 n = 10 u = np.sin(np.arange(0, N/10., N/50000...
电子电气架构 --- 面向服务的体系架构
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 周末洗了一个澡,换了一身衣服,出了门却不知道去哪儿,不知道去找谁&am…...
TypeScript 装饰器类型详解
TypeScript 装饰器类型详解 一、类装饰器 // 参数:类的构造函数 function ClassDecorator(constructor: Function) {Object.defineProperty(constructor.prototype, timestamp, {value: Date.now()}); }ClassDecorator class DataService {// 装饰后自动添加times…...
Nyquist内置函数-杂项函数
1 Nyquist内置函数-杂项函数 1.1 杂项函数 这些函数对于日常使用来说都是安全且推荐的。 1.1.1 to-mono(sound) [SAL] (to-mono sound) [LISP] 如果 sound 是多声道声音,返回其所有声道的总和;如果 sound 本身就是单声道声音,则直接返回&…...
基姆拉尔森计算公式
基姆拉尔森计算公式(Zellers Congruence 的变体)是一种快速根据公历日期计算星期几的数学公式。其核心思想是通过对年月日的数值进行特定变换和取模运算,直接得到星期几的结果。 公式定义 对于日期 年-月-日,公式如下:…...
5 分钟用满血 DeepSeek R1 搭建个人 AI 知识库(含本地部署)
最近很多朋友都在问:怎么本地部署 DeepSeek 搭建个人知识库。 老实说,如果你不是为了研究技术,或者确实需要保护涉密数据,我真不建议去折腾本地部署。 为什么呢? 目前 Ollama 从 1.5B 到 70B 都只是把 R1 的推理能力…...
