GPIO输出——LED闪烁、LED流水灯、蜂鸣器

news2024/11/14 13:26:23

1、STM32F1 GPIO 简介

GPIO ( General Purpose Input Output )通用输入输出口
可配置为 8 种输入输出模式
引脚电平: 0V~3.3V ,部分引脚可容忍 5V
输出模式下可控制端口输出高低电平,用以驱动 LED 、控制蜂鸣器、模拟通信协议输出时序等
输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、 ADC 电压采集、模拟通信协议接收数据等

GPIO 是控制或者采集外部器件的信息的外设,即负责输入输出。它按组分配,每组 16 个

IO 口,组数视芯片而定。STM32F103ZET6 芯片是 144 脚的芯片,具有 GPIOA、GPIOB、GPIOC、

GPIOD、GPIOE、GPIOF 和 GPIOG 七组 GPIO 口,共有 112 个 IO 口可供我们编程使用。这里 重点说一下 STM32F103 的 IO 电平兼容性问题,STM32F103 的绝大部分 IO 口,都兼容 5V, 至于到底哪些是兼容 5V 的,请看 STM32F103xE 的数据手册(注意是数据手册,不是中文参考 手册),见表 5 大容量 STM32F103xx 引脚定义,凡是有 FT 标志的,都是兼容 5V 电平的 IO 口, 可以直接接 5V 的外设(注意:如果引脚设置的是模拟输入模式,则不能接 5V!),凡是不带 FT

标志的,就建议大家不要接 5V 了,可能烧坏 MCU。 

2、GPIO基本结构

 GPIO中寄存器有32位,而端口只有16位,故寄存器只有低16位对应的有端口

驱动器用来增加信号的驱动能力

寄存器只用于存放数据 

3、GPIO 功能模式

GPIO 有八种工作模式,分别是:

1、输入浮空

2、输入上拉

3、输入下拉

4、模拟功能

5、开漏输出

6、推挽输出

7、开漏式复用功能

8、推挽式复用功能

 4、GPIO 寄存器介绍

STM32F1 每组(这里是 A~D)通用 GPIO 口有 7 个 32 位寄存器控制,包括 :

2 个 32 位端口配置寄存器(CRL 和 CRH)

2 个 32 位端口数据寄存器(IDR 和 ODR)

1 个 32 位端口置位/复位寄存器 (BSRR)

1 个 16 位端口复位寄存器(BRR)

1 个 32 位端口锁定寄存器 (LCKR)

(1)端口配置低\高寄存器(GPIOx_CRL/GPIOx_CRH)(x=A…E)

​ 端口配置寄存器共16位,但每4位数据表示1位,共需要64位,而STM32中每个寄存器都为32位,因此分为端口配置低寄存器和端口配置高寄存器。通过端口配置寄存器可以配置GPIO工作模式与端口输出速度。

注意:输出速度可以限制输出引脚的最大翻转速度,作用是降低功耗、提高稳定性,一般情况下配置为50MHz。

(2)端口输入数据寄存器(GPIOx_IDR)(x=A…E)
​ 输入数据共16位,但寄存器共32位,因此寄存器高16位为空。

(3)端口输出数据寄存器(GPIOx_ODR)(x=A…E)
​ 输出数据共16位,但寄存器共32位,因此寄存器高16位为空。

(4)端口位设置/清除寄存器(GPIOx_BERR)(x=A…E)
​ 高16位用于位清除,低16位用于位设置。

高16位:为0不影响;为1清0;
低16为:为0不影响;为1置1。

(5)端口位清除寄存器(GPIOx_BER)(x=A…E)
​ 高16位为空,低16位用于清除,方法同上。

(6)端口位配置锁定寄存器(GPIOx_LCKR)(x=A…E)
​ 高15位为空,低17位用于锁定,较少使用。

五、GPIO常用函数

(1)RCC常用函数

​ 在RCC时钟控制的函数库中,我们最经常用到的是以下三个函数:

在函数的后面是三个总线可以设置的外设

//AHB系统总线时钟控制
void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);
//APB2总线时钟控制
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
//APB1总线时钟控制
void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);
/*第一个参数为外设选择,与STM32互联型的设备在下列列表中选择:
 *	   @arg RCC_AHBPeriph_DMA1
 *     @arg RCC_AHBPeriph_DMA2
 *     @arg RCC_AHBPeriph_SRAM
 *     @arg RCC_AHBPeriph_FLITF
 *     @arg RCC_AHBPeriph_CRC
 *     @arg RCC_AHBPeriph_OTG_FS    
 *     @arg RCC_AHBPeriph_ETH_MAC   
 *     @arg RCC_AHBPeriph_ETH_MAC_Tx
 *     @arg RCC_AHBPeriph_ETH_MAC_Rx
 *     

  
 *     @arg RCC_APB2Periph_AFIO, RCC_APB2Periph_GPIOA, RCC_APB2Periph_GPIOB,
 *          RCC_APB2Periph_GPIOC, RCC_APB2Periph_GPIOD, RCC_APB2Periph_GPIOE,
 *          RCC_APB2Periph_GPIOF, RCC_APB2Periph_GPIOG, RCC_APB2Periph_ADC1,
 *          RCC_APB2Periph_ADC2, RCC_APB2Periph_TIM1, RCC_APB2Periph_SPI1,
 *          RCC_APB2Periph_TIM8, RCC_APB2Periph_USART1, RCC_APB2Periph_ADC3,
 *          RCC_APB2Periph_TIM15, RCC_APB2Periph_TIM16, RCC_APB2Periph_TIM17,
 *          RCC_APB2Periph_TIM9, RCC_APB2Periph_TIM10, RCC_APB2Periph_TIM11  
 *
 *     @arg RCC_APB1Periph_TIM2, RCC_APB1Periph_TIM3, RCC_APB1Periph_TIM4,
 *          RCC_APB1Periph_TIM5, RCC_APB1Periph_TIM6, RCC_APB1Periph_TIM7,
 *          RCC_APB1Periph_WWDG, RCC_APB1Periph_SPI2, RCC_APB1Periph_SPI3,
 *          RCC_APB1Periph_USART2, RCC_APB1Periph_USART3, RCC_APB1Periph_USART4, 
 *          RCC_APB1Periph_USART5, RCC_APB1Periph_I2C1, RCC_APB1Periph_I2C2,
 *          RCC_APB1Periph_USB, RCC_APB1Periph_CAN1, RCC_APB1Periph_BKP,
 *          RCC_APB1Periph_PWR, RCC_APB1Periph_DAC, RCC_APB1Periph_CEC,
 *          RCC_APB1Periph_TIM12, RCC_APB1Periph_TIM13, RCC_APB1Periph_TIM14
 *
 *	   其他设备在下列列表中选择:
 *     @arg RCC_AHBPeriph_DMA1
 *     @arg RCC_AHBPeriph_DMA2
 *     @arg RCC_AHBPeriph_SRAM
 *     @arg RCC_AHBPeriph_FLITF
 *     @arg RCC_AHBPeriph_CRC
 *     @arg RCC_AHBPeriph_FSMC
 *     @arg RCC_AHBPeriph_SDIO
 *
 *可用按位或(|)来选择多个外设
 *
 *第二个参数为选择使能或失能,选择:ENABLE or DISABLE
 */

(2)通用IO口的函数库 

​ 在GPIO通用IO口的函数库中,我们最经常用到的是以下函数:

//复位函数,调用这个函数后,所指定的GPIO外设就会被复位
void GPIO_DeInit(GPIO_TypeDef* GPIOx);
//复位函数,可以复位AFIO外设
void GPIO_AFIODeInit(void);
//初始化函数,功能:用结构体的参数来初始化GPIO口
//初始化时,我们需要先定义一个结构体变量,然后给结构体赋值,最后调用初始化函数,函数内部会自动读取结构体的值,然后把外设的各个参数配置好。
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
//功能:把结构体变量赋一个默认值
void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);
//以下四个函数为GPIO的读取函数,均有返回值
//功能:读取输入数据寄存器某一个端口的输入值
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
//功能:读取整个输入数据寄存器
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
//功能:读取输出数据寄存器的某一位,用于输出模式下,查看输入的值
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
//功能:读取整个输出数据寄存器
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
//以下四个函数为GPIO的写入函数
//功能:将指定端口引脚设置为高电平
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
//功能:将指定端口引脚设置为低电平
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
//功能:对指定端口进行写入操作
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
//功能:同时对16个端口进行写入操作
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
/*参数注释:
 *①GPIO_TypeDef* GPIOx,GPIO端口选择,值为GPIOx(x=A~G);
 *可用按位或(|)来选择多个端口
 *
 *②uint16_t GPIO_Pin,IO口引脚选择,一个GPIO端口有16个引脚,所以其值为GPIO_Pin_x(x=0~15)
 *可用按位或(|)来选择多个引脚
 *
 *③BitAction BitVal,指定写入的数据值,这个参数可以是BitAction枚举中的一个值,值为:
 *	@arg Bit_RESET:清除端口值,即置低电平
 *  @arg Bit_SET:设置端口值,即置高电平
 *
 *④uint16_t PortVal,指定要写入端口输出数据寄存器的值
 *
 *⑤GPIO_InitTypeDef* GPIO_InitStruct,GPIO初始化结构体的地址
 */

/*初始化结构体定义:
 *①定义一个结构体变量
 *GPIO_InitTypeDef GPIO_InitStructure;
 *结构体如下:
 *typedef struct
 *{
 *  uint16_t GPIO_Pin;             
 *  GPIOSpeed_TypeDef GPIO_Speed;  
 *  GPIOMode_TypeDef GPIO_Mode;    
 *}GPIO_InitTypeDef;
 *由此可知该结构体有三个成员,分别为GPIO_Pin、GPIO_Speed和GPIO_Mode,下一步就是分别赋值
 *
 *②给结构体赋值:
 *GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置推挽输出
 *GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;		   //使用GPIO的0号引脚
 *GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度为50MHz
 *
 *GPIO_Mode,用于设置工作模式,其枚举如下:
 *typedef enum
 *{ GPIO_Mode_AIN = 0x0,			//模拟输入模式(Analog IN)
 *  GPIO_Mode_IN_FLOATING = 0x04,	//浮空输入模式
 *  GPIO_Mode_IPD = 0x28,			//下拉输入模式(In Pull Down)
 *  GPIO_Mode_IPU = 0x48,			//上拉输入模式(In Pull Up)
 *  GPIO_Mode_Out_OD = 0x14,		//开漏输出模式(Out Open Drain)
 *  GPIO_Mode_Out_PP = 0x10,		//推挽输出模式(Out Push Pull)
 *  GPIO_Mode_AF_OD = 0x1C,			//复用开漏模式(Atl Open Drain)
 *  GPIO_Mode_AF_PP = 0x18			//复用推挽模式(Atl Push Pull)
 *}GPIOMode_TypeDef;
 *
 *GPIO_Pin,选择引脚,值为GPIO_Pin_x(x=0~15和All)
 *
 *GPIO_Speed,选择输出速度,其枚举如下:
 *typedef enum
 *{ 
 *  GPIO_Speed_10MHz = 1,
 *  GPIO_Speed_2MHz, 
 *  GPIO_Speed_50MHz
 *}GPIOSpeed_TypeDef;
 *常用速度为50MHz
 */

六、主要程序

1、第一步:使用RCC初始化GPIO时钟

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

GPIOA是位于APB2总线上的

请添加图片描述

 2、 第二步:使用GPIO_Init函数初始化GPIO

    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;//50兆hz的速度
    //用结构体的函数初始化GPIO口
    GPIO_Init(GPIOA, &GPIO_InitStructure);//第二个参数为指向结构体的指针,故传地址

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;

若要使用多个端口GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;

若要使用A/B/C/D的全部端口GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All

(3)使用输出或输入的函数控制GPIO口

​ 调用输入的函数,GPIO_SetBits()、GPIO_ResetBits()和GPIO_WriteBit()均可单独设置引脚低电平,代码如下:

GPIO_ResetBits(GPIOA,GPIO_Pin_0);
Delay_ms(250);
GPIO_SetBits(GPIOA,GPIO_Pin_0);
Delay_ms(250);
		
GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);
Delay_ms(250);
GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET);
Delay_ms(250);
//通过强制转换为BitAction的枚举类型来直接输入高低电平
GPIO_WriteBit(GPIOA,GPIO_Pin_0,(BitAction)0);
Delay_ms(250);
GPIO_WriteBit(GPIOA,GPIO_Pin_0,(BitAction)1);
Delay_ms(250);

GPIO_WriteBit直接写1或0来设置电平的时候,需要将将数字强制转换成枚举类型BitAction

Bit_RESET和Bit_SET也是枚举类型BitAction

GPIO_Write(GPIOA, ~0x0040)表示将整个GPIOA寄存器进行配置,16位的数据

七、完整程序

1、点亮一个灯(低电平亮)(LED连接PA0口)

 

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
 
int main(void)
{
	//使用RCC初始化GPIO时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	//使用GPIO_Init函数初始化GPIO
	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;//50兆hz的速度
	//用结构体的函数初始化GPIO口
	GPIO_Init(GPIOA, &GPIO_InitStructure);//第二个参数为指向结构体的指针,故传地址
	
	while (1)
	{
		//使用输出或输入函数控制GPIO口
		GPIO_ResetBits(GPIOA, GPIO_Pin_0);//0
		Delay_ms(500);
		GPIO_SetBits(GPIOA, GPIO_Pin_0);//1
		Delay_ms(500);
		
		GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET);//0
		Delay_ms(500);
		GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET);//1
		Delay_ms(500);
		
		
		GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)0);
		Delay_ms(500);
		GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)1);
		Delay_ms(500);
	}
}

2、流水灯(低电平亮)(LED连接PA0~PA6)

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
 
int main(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_All;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	while (1)
	{
		GPIO_Write(GPIOA, ~0x0001);	//0000 0000 0000 0001 低电平点亮
		Delay_ms(100);
		GPIO_Write(GPIOA, ~0x0002);	//0000 0000 0000 0010
		Delay_ms(100);
		GPIO_Write(GPIOA, ~0x0004);	//0000 0000 0000 0100
		Delay_ms(100);
		GPIO_Write(GPIOA, ~0x0008);	//0000 0000 0000 1000
		Delay_ms(100);
		GPIO_Write(GPIOA, ~0x0010);	//0000 0000 0001 0000
		Delay_ms(100);
		GPIO_Write(GPIOA, ~0x0020);	//0000 0000 0010 0000
		Delay_ms(100);
		GPIO_Write(GPIOA, ~0x0040);	//0000 0000 0100 0000
		Delay_ms(100);
		GPIO_Write(GPIOA, ~0x0080);	//0000 0000 1000 0000
		Delay_ms(100);
	}
}

3、蜂鸣器(低电平的时候响)(蜂鸣器接口为PB12

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
 
int main(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);
	
	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);
	}
}

八、其他基础知识

1、A15、B3、B4三个端口默认是JTAG调试端口,如果要当作普通端口,要进行一些相关的配置

2、有源蜂鸣器:内部自带振荡器,频率固定

     无源蜂鸣器:不带振荡器,要提供震荡脉冲才能发生,可以发出不同频率的声音

3、推挽输出高低电平都有驱动能力

     开漏输出高电平相当于高阻态,没有驱动能力,低电平有驱动能力
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/480978.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring 统一功能处理(拦截器)

文章目录 Spring拦截器1.统一用户登录权限校验1) SpringAOP 用户统一验证的问题2) Spring拦截器3) 拦截器实现原理4)同一访问前缀添加 2. 统一异常处理3. 统一数据返回格式1)统一数据返回的好处2)统一数据返回实现 Spring拦截器 SpringBoot统…

第13章 项目合同管理

文章目录 13.2.1 按信息系统 范围 划分的合同分类 4451、总承包合同2、单项工程承包合同3、分包合同 13.2.2 按项目 付款方式 划分的合同分类 4461、总价合同2、成本补偿合同(卖方有利)3、工料合同 13.3.1 项目合同的内容 44713.3.2 项目合同签订的注意事…

【设计模式】我终于读懂了迭代器模式。。。

看一个具体的需求 编写程序展示一个学校院系结构:需求是这样 要在一个页面中展示出学校的院系组成, 一个学校有多个学院, 一个学院有多个系。 如图: 传统的设计方案(类图) 传统的方式的问题分析 将学院看做是学校的子类&#xf…

深度学习(23):SmoothL1Loss损失函数

0. 基本介绍 SmoothL1Loss是一种常用的损失函数,通常用于回归任务中,其相对于均方差(MSE)损失函数的优势在于对异常值(如过大或过小的离群点)的惩罚更小,从而使模型更加健壮。 SmoothL1Loss的公式为: l o s s ( x , y ) { 0.5 …

机器人中的数值优化(三)—— 无约束最优化方法基础、线搜索准则

本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考,主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等,本系列文章篇数较多,不定期更新,上半部分介绍无约束优化,…

eureka自我保护模式详解(全网最全)

1. 什么叫自我保护模式? 当微服务客户端启动后,会把自身信息注册到Eureka注册中心,以供其他微服务进行调用。一般情况下,当某个服务不可用时(一段时间内没有检测到心跳或者连接超时等),那么Eure…

spring3:更简单的读取和存入对象

目录 1.存储 Bean 对象 1.1 前置⼯作:配置扫描路径(重要) 1.2 添加注解存储 Bean 对象 1.2.1.Controller[控制器] 1.2.2 Service[服务] 1.2.3 repoistory[仓库] 1.2.4 Configuration[配置] 1.2.5 Component[组件] 1.3为什么要这么多类…

Spring 创建和使用

文章目录 什么是 Bean ?1. 创建 Spring 项目1.创建一个 Maven 项目2. 添加 Spring 依赖1.配置 Maven 国内源2.添加 Maven 依赖 3.添加启动项 2.存储Bean对象1.创建 Bean2.注册 Bean3.获取并使用 Bean 对象1. 得到 Spring 对象常见方式有两种: 2. 获取 Bean 对象Bean 的三种获取…

SpringMVC中使用LocalDateTime、LocalDate等参数作为入参数据转换问题

1、接收GET请求方式及POST请求表单方式时间类型传参,需要自定义参数转换器或者使用ControllerAdvice配合initBind,不设置的话表单方式会报以下错误: 这种情况要和时间作为Json字符串时区别对待,因为前端json转后端pojo底层使用的是…

什么是Auto GPT-4? OpenAI 最新语言模型概览

动动发财的小手,点个赞吧! 人工智能正在快速发展,近年来最令人兴奋的发展之一是创建可以生成类似人类文本的语言模型。领先的人工智能研究机构 OpenAI 最近发布了其最新的语言模型 Auto GPT-4。 在什么是 Auto GPT-4? OpenAI 最新…

【Java笔试强训 29】

🎉🎉🎉点进来你就是我的人了博主主页:🙈🙈🙈戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔🤺🤺🤺 目录 一、选择题 二、编程题 🔥求正数数…

AtCoder Beginner Contest 300(D-G)

D - AABCC (atcoder.jp) (1)题目大意 给你个数N,问你不超过N的三个质数abc组成的数有多少个。 (2)解题思路 考虑到枚举的数不会特别多,因此预处理出1e6的质因子,暴力枚举即可。 (3&a…

在体育新闻文本中提取关键词可以使用什么技术

在体育新闻文本中提取关键词可以使用以下技术: 1. 领域词典: 通过构建体育领域的词汇表,将其中的词语作为关键词,可以较好地提取体育新闻中的关键词。 就当下的研究情况,国内外有哪些体育领域的词汇表http://t.csdn…

Reactive Streams介绍与应用分析

目录 一、Reactive Streams基本知识 (一)基本介绍 (二)反应式流的特点 基本特性1:事件驱动&变化传递 基本特性2:数据流 基本特性3:声明式 高级特性1:流量控制(回压) 高级特性2:异步边界 &…

ALBEF:基于动量蒸馏的视觉语言表示学习

Align before Fuse:Vision and Language Representation Learning with Momentum Distillation ALBEF:基于动量蒸馏的视觉语言表示学习 摘要 大规模的视觉和语言表征学习在各种视觉-语言任务上显示出有希望的改进。大多数现有的方法采用了基于Transform…

【平衡二叉搜索树(AVL)-- 旋转】

目录: 前言1、二叉搜索树的插入2、AVL树的旋转(1)右单旋(LL)(2)左单旋(RR)(3)右左双旋(LR)(4)左右…

第18章 项目风险管理

文章目录 18.1.2 风险的分类 54318.1.3 风险的性质 544项目风险管理6个过程(风险管理、识别风险、实施定性风险分析、实施定量风险分析、规划风险应对、控制风险)组织和干系人的风险态度影响因素18.3.3 规划风险管理的输出 550风险识别的原则18.4.2 识别…

vim编辑文件

目录 一、vi和vim (1)介绍 (2)相同点 (3)不同点 二、使用vim打开文件 三、使用vim编辑文件 (1)vim的四个模式 (2)命令模式下的编辑命令 删除 复制 …

树莓派4:跑通Tensorflow的Sequential模型用于图片分类

重要提示:由于树莓派相对孱弱的性能,直接在其上训练模型可能花(lang4)费非常长的时间。本文仅作为示例性的可行性参考,请酌情考虑实验平台。 著名的Tensorflow框架也可以运行在树莓派上。理论还没吃透,但使…

【量化交易笔记】5.SMA,EMA 和WMA区别

股票中的SMA,EMA和WMA是常用的技术分析指标。这些指标基于历史股价计算得出,可以帮助投资者了解股票的趋势,为决策提供依据。虽然它们都是平均值算法,但它们之间还是有一些区别的。 SMA 简单移动平均线(Simple Moving…