STM32学习笔记(三) —— GPIO点亮LED

news2024/12/23 3:30:07

1.GPIO简介

GPIO,全称是General-purpose input/output(通用输入输出)。在单片机中是表示能被控制的引脚,能检测输入信号的高低电平,也能输出高低电平控制外部设备。STM32F103RCT6一共有64个引脚,其中有51个GPIO,其他引脚分别是电源、地、一个复位引脚以及一个BOOT引脚。这51个GPIO被分为不同的组,比如PAx、PBx、PCx等,每组一般是16个GPIO。又因为单片机功能很强大,集成了很多外设(比如UART、I2C、SPI等),但引脚有限,所以一般每个GPIO能复用成好几种功能,对于哪个引脚可以用作哪些功能可以通过查阅数据手册得知。比如PC3引脚,它是第11脚,引脚名称是PC3,可以作为GPIO(PC3),也可以用作ADC的输入引脚

引脚复用1

2.GPIO 结构

SSS2.001

图中所示是GPIO基本的内部控制框图,总体分为输入与输出两部分。每个GPIO端口都可以用对应的寄存器来控制其状态。

3.GPIO 模式

输入浮空,输入引脚内部不进行上下拉
输入上拉,输入引脚内部上拉
输入下拉,输入引脚内部下拉
模拟输入,一般用于模拟量输入,比如ADC输入
开漏输出,引脚只能输出电平,不能输出高电平,可以用于线与功能
推挽输出,既能输出高电平也能输出低电平
推挽复用功能,引脚被其他外设接管(比如UART),能输出高低电平
开漏复用功能,引脚被其他外设接管(比如I2C),只能输出低电平

4.GPIO 寄存器

GPIO寄存器就是来控制GPIO的功能及行为的,可以将GPIO配置成上述列出的各种模式,让GPIO检测输入的信号或者控制其输出高电平或者低电平等
每个GPIO有以下几种寄存器

两个32位配置寄存器GPIOx_CRL and GPIOx_CRH
两个32位数据寄存器GPIOx_IDR and GPIOx_ODR
一个32位置位/复位寄存器GPIOx_BSRR
一个16位复位寄存器GPIOx_BRR
一个32位锁定寄存器GPIOx_LCKR

4.1 GPIOx_CRL and GPIOx_CRH寄存器

GPIOx_CRH寄存器与GPIOx_CRL寄存器类似,只不过GPIOx_CRL寄存器用于控制每组GPIO的0-7个引脚,GPIOx_CRH寄存器用于控制每组GPIO的8-15个引脚,这里重点分析GPIOx_CRL寄存器

GPIOx_CRL

上图是参考手册中的GPIOx_CRL寄存器描述。可以看到这32个位都是由CNFy[1:0] - MODEy[1:0]重复组成(其中,y = 0,1,2…7)。每一对CNFy - MODEy(占4个位)用来配置一个GPIO,CNF0 - MODE0用来控制GPIO0,CNF1 - MODE1用来控制GPIO1,依次类推。所以GPIOx_CRL(共32个位)可以控制GPIO0 - 7这8个引脚,GPIOx_CRH用来控制GPIO8 - 15这8个引脚。GPIO属于哪一组由GPIOx_CRL/H中的x指定(x = A,B,C…)。

MODEy[1:0]用于选择GPIO是输入模式还是输出模式,如果是输出模式可以指定输出的最大速率
CNFy[1:0]用于选择GPIO的工作模式(输入浮空、输入上拉、输入下拉…)

比如配置PC5引脚为推挽输出,输出速率2MHz:
1° PC5属于C组引脚,应该选择GPIOC_CRL或者GPIOC_CRH寄存器
2° PC5是C组第5个引脚,每组0-7这8个引脚用GPIOx_CRL寄存器配置,每组8-15这8个引脚用GPIOx_CRH寄存器配置,应该选择GPIOC_CRL寄存器
3° 配置GPIOC_CRL寄存器中的第20 -23位(CNF5 - MODE5)

/*
0x03是十六进制
换成二进制是11,用32位来表示就是11前面加30个0
0000 0000 0000 0000 0000 0000 0000 0011
左移20位得到
0000 0011 0000 0000 0000 0000 0000 0000
按位取反得到
1111 1100 1111 1111 1111 1111 1111 1111,两个0的位置对应的就是第20 - 21位,也就是MODE5[1:0]
将上面的值与原来的值进行按位与操作就会将MODE5[1:0]清零
*/
GPIOC->CRL &= ~((uint32_t)0x03 << 20); //将 MODE5[1:0] 清0
/*
同理,将0x02 << 20位后再与原来的值按位或就可以将MODE5[1:0]配置为10
GPIOC_CRL寄存器一共有32个位,上述这样赋值的好处是不会干扰其他位的值,只对需要修改的位进行修改
*/
GPIOC->CRL |=  ((uint32_t)0x02 << 20); //将 MODE5[1:0] 配置为10 输出模式,最大速率2MHz
GPIOC->CRL &= ~((uint32_t)0x03 << 22); //将 CNF5[1:0] 清0
/* 上一步已经清0,如果还要配置为0,这一步可以不要 */
GPIOC->CRL |=  ((uint32_t)0x00 << 22); //将 CNF5[1:0] 配置为00 通用推挽输出模式

4.2 GPIOx_IDR and GPIOx_ODR寄存器

GPIOx_IDR寄存器与GPIOx_ODR寄存器类似,只不过GPIOx_IDR寄存器用于读取GPIO口电平状态且各寄存器位只能读不能写(也不需要写),GPIOx_ODR用于控制GPIO口输出电平状态

GPIOx_ODR

从GPIOx_ODR寄存器描述中可以看到, 32位寄存器的高16位是保留的,低16位用于控制GPIO口的电平输出。每一个ODRy用于控制一个GPIO,ODR0用于控制GPIO0,ODR1用于控制GPIO1,依次类推。所以GPIOx_ODR的低16位就足以控制一组GPIO,GPIO属于哪一组由GPIOx_ODR中的x指定(x = A,B,C…)。

ODRy置1对应的GPIO会输出1(高电平),ODRy清0对应的GPIO会输出0(低电平)

比如配置PC5引脚输出0(低电平)/1(高电平):
1° PC5属于C组引脚,应该选择GPIOC_ODR寄存器
2° 配置GPIOC_ODR寄存器中的第5位(ODR5)

/* PC5引脚输出0(低电平) */
GPIOC->ODR &= ~((uint16_t)0x01 << 5); //将ODR5清0

/* PC5引脚输出1(高电平) */
GPIOC->ODR |= ((uint16_t)0x01 << 5); //将ODR5置1

4.3 GPIOx_BSRR寄存器

GPIOx_BSRR

在GPIOx_BSRR寄存器中,有两种类型的控制位,一种是BRy(高16位),一种是BSy(低16位),最终都是用于控制GPIOx_ODR寄存器。每一个BRy/BSy用于控制一个对应的ODRy位,BR0/BS0用于控制ODR0,BR1/BS1用于控制ODR1,依次类推。而GPIOx_ODR寄存器最终是控制GPIO输出电平状态的,所以可以等效认为BRy/BSy控制的是GPIO输出电平状态,BR0/BS0用于控制GPIO0,BR1/BS1用于控制GPIO1,依次类推。

BRy:写0不会对GPIO输出电平产生影响,置1使对应的GPIO输出低电平
BSy:写0不会对GPIO输出电平产生影响, 置1使对应的GPIO输出高电平

比如配置PC5引脚输出0(低电平)/1(高电平):
1° PC5属于C组引脚,应该选择GPIOC_BSRR寄存器
2° 要输出低电平应该选择BRy位,PC5是C组的第5个引脚,应该选择BR5位;要输出高电平应该选择BSy位,PC5应该选择BS5位
3° 配置GPIOC_BSRR寄存器中的第21位(BR5)/第5位(BS5)

/* PC5引脚输出0(低电平) */
/* 0x01 << 5是定位到第5个GPIO,再左移16是定位到BRy位,因为BRy位是GPIOx_BSRR寄存器的高16位 */
GPIOC->BSRR = (((uint32_t)0x01 << 5) << 16);

/* PC5引脚输出1(高电平) */
GPIOC->BSRR = ((uint32_t)0x01 << 5);

4.4 GPIOx_BRR寄存器

GPIOx_BRR1
GPIOx_BRR2
GPIOx_BRR寄存器也是用于控制GPIOx_ODR寄存器,与GPIOx_BSRR寄存器中的BRy位功能相同,这里也可以认为是直接控制GPIO输出电平状态的,只能让对应的GPIO输出低电平

比如配置PC5引脚输出0(低电平):
1° PC5属于C组引脚,应该选择GPIOC_BRR寄存器
2° 配置GPIOC_BRR寄存器中的第5位(BR5)

/* PC5引脚输出0(低电平) */
GPIOC->BRR = ((uint16_t)0x01 << 5);

4.5 GPIOx_LCKR寄存器

GPIOx_LCKR寄存器可以锁定GPIOx_CRL与GPIOx_CRH寄存器的配置,一旦对相应的GPIO被锁定后,在下次系统复位之前将不能再更改对应的GPIOx_CRL与GPIOx_CRH寄存器。

锁键写入序列:
对LCKK位 写1 -> 写0 -> 写1 -> 读0 -> 读1,并且在进行写入序列时不能更改LCK[15:0]位的值
最后一个读1可以省略,但可以用来确认锁键已被激活

比如要锁定PC5的配置寄存器(GPIOC_CRL and GPIOC_CRH):

uint32_t xReturn = 0x00;
/* 0x01 << 16 是对LCKK位写1,0x01 << 5 是对LCK5位置1(对PC5的配置寄存器进行锁定) */
GPIOC->LCKR = ((uint16_t)0x01 << 16 | (uint16_t)0x01 << 5);
/* 对LCKK位写1,同时LCK5位的值不变 */
GPIOC->LCKR = ((uint16_t)0x01 <<5);
/* 对LCKK位写1,同时LCK5位的值不变 */
GPIOC->LCKR = ((uint16_t)0x01 << 16 | (uint16_t)0x01 << 5);
/* 读0 */
xReturn = GPIOC->LCKR;
/* 读1 */
xReturn = GPIOC->LCKR;

if(xReturn & ((uint16_t)0x01 << 16)) {
	printf("PC5 has been locked\r\n");
}

当PC5的配置寄存器被锁定后,在下次系统复位之前都不能再更改。如果需要继续锁定其他GPIO,可针对对应的GPIO再次重复上述写序列。

上述对GPIO寄存器进行了一个比较完整的分析,对于其他外设,也同样是操作对应的外设寄存器来实现相应的功能,至于每个外设的寄存器描述可以查阅参考手册。由于STM32寄存器比较多,我们在实际应用时一般很少使用寄存器编程,更多的是使用库编程,后续我们采用HAL库编程的方式进行功能验证

5.硬件连接

在这里插入图片描述

我们开发板上将LED引脚接在单片机的PB1引脚上。当PB1输出高电平时,LED不亮;当PB1输出低电平时,LED点亮。开发板完整的原理图可以在HAL库工程模板这一章节的最后,百度网盘链接分享处获取

6.寄存器软件编程

1° 这里的PB1引脚是当作普通引脚来使用,所以不能配置成开漏复用或者推挽复用,又要求PB1能输出高低电平,所以要配置成通用推挽输出模式,这里要求的速率不高,可以配置成最大输出速率2MHz就可以。(那为什么不能配置成输入模式呢,因为输入模式下的引脚状态是由外部决定的,内部可以去读取外部引脚状态。我们这里要求PB1引脚既要有高电平也要有低电平,即使外部能让PB1引脚在高低电平之间转换,也不一定是单片机内部程序可控的,所以不能用输入模式。)
2° 在while循环中将LED点亮500ms再熄灭500ms,依次循环。500ms延时可以使用HAL_Delay(500)来实现。

在编程之前,我们还要知道要使用某一个外设功能时,要先打开外设的时钟,时钟的开启在参考手册中RCC(复位和时钟控制)那一章,通过查阅手册可以发现GPIOB的时钟使能位在RCC_APB2ENR寄存器中的第3位

RCC_APB2ENR1
RCC_APB2ENR2

将RCC_APB2ENR寄存器中的第3位置1就可以开启GPIOC的时钟,其他外设时钟的开启也是类似的。

开启GPIOC时钟代码:

RCC_APB2ENR |= ((uint16_t)0x01 << 3); //开启GPIOB时钟

在上一节调试串口的基础上增加以下代码:

/* 在while循环之前添加以下初始化代码 */
RCC->APB2ENR |=  ((uint16_t)0x01 << 3 ); //开启GPIOB时钟
/* 配置PB1为通用推挽输出模式,输出速率设置为2MHz */
GPIOB->CRL &= ~((uint32_t)0x03 << 4); //将 MODE1[1:0] 清0
GPIOB->CRL |=  ((uint32_t)0x02 << 4); //将 MODE1[1:0] 配置为10 输出模式,最大速率2MHz
GPIOB->CRL &= ~((uint32_t)0x03 << 6); //将 CNF1[1:0]  清0
GPIOB->CRL |=  ((uint32_t)0x00 << 6); //将 CNF1[1:0]  配置为00 通用推挽输出模式

/* PB1引脚输出1(高电平),默认熄灭LED */
GPIOB->BSRR = ((uint32_t)0x01 << 1); //这里也可以使用ODR寄存器

/* while循环中控制LED亮灭代码 */
while(1)
{
  /* PB1引脚输出0(低电平)点亮LED */
  GPIOB->BSRR = (((uint32_t)0x01 << 1) << 16); //这里也可以使用BRR寄存器、ODR寄存器
  /* 延时 */
  HAL_Delay(500);
    
  /* PB1引脚输出1(高电平)熄灭LED */
  GPIOB->BSRR = ((uint32_t)0x01 << 1); //这里也可以使用ODR寄存器
  /* 延时 */
  HAL_Delay(500);
}

将程序下载到开发板,发现LED会以500ms的间隔不停闪烁。

上述我们使用的是寄存器来实现LED亮灭的功能的,下面我们使用STM32CubeMX来配置HAL库实现LED亮灭功能。

7.HAL库软件编程

使用STM32CubeMX打开工程文件

打开工程文件

按下图所示找到PB1引脚,点击后在弹出的选项中选择GPIO_Output

PC5

按下图配置PB1引脚

在这里插入图片描述

生成代码后,可以发现在gpio.c文件中已经配置好了PB1引脚:

void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  /* 开启GPIO时钟 */
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOD_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();
  /* 开启GPIOB时钟 */
  __HAL_RCC_GPIOB_CLK_ENABLE();

  /* 这里将PB1引脚默认输出高电平 */
  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);

  /*Configure GPIO pin : PtPin */
  /* 这里是PB1引脚,我们给他定义了一个标签LED,所以他显示LED_Pin */
  GPIO_InitStruct.Pin = LED_Pin; //在main.h中有定义:#define LED_Pin GPIO_PIN_1
  /* 推挽输出模式 */
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  /* 无上下拉 */
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  /* 输出速率选择 */
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  /* 调用HAL_GPIO_Init对PC5进行初始化 */
  HAL_GPIO_Init(LED_GPIO_Port, &GPIO_InitStruct); //在main.h中有定义:#define LED_GPIO_Port GPIOB
}

以上就是STM32CubeMX对PB1引脚做的初始化配置,并且会在main函数中调用初始化配置函数MX_GPIO_Init()。对于如何使用这个引脚是由我们自己实现的,不过有相关的库函数可供我们调用,这些函数可以在对应外设的头文件中查找。比如GPIO相关的接口函数可以在stm32f1xx_hal_gpio.h中找到

stm32f1xx_hal_gpio.h

我们上述初始化PC5引脚时调用的就是HAL_GPIO_Init函数,如果需要让PC5引脚输出高低电平可以调用
HAL_GPIO_WritePin函数。在对应外设的源文件中可以找到相关函数,函数定义上方有注释说明函数各个参数的含义。比如在stm32f1xx_hal_gpio.c中的HAL_GPIO_WritePin函数

HAL_GPIO_WritePin

第一个参数是指定哪一组GPIO,我们使用PB1,是B组,就是GPIOB;
第二个参数是指定哪一个引脚,我们使用PB1是C组第1个引脚,就是GPIO_PIN_1;
第三个参数是指要在引脚上输出的电平状态,GPIO_PIN_RESET是输出低电平,GPIO_PIN_SET是输出高电平。

那我们要让LED灯亮灭时就可以调用HAL_GPIO_WritePin函数,我们在while函数中编程:

/* while循环中控制LED亮灭代码 */
while(1)
{
    /* PB1引脚输出0(低电平)点亮LED */
    HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);
    /* 延时 */
    HAL_Delay(500);
        
    /* PB1引脚输出1(高电平)熄灭LED */
    HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);
    /* 延时 */
    HAL_Delay(500);
}

将程序下载到开发板后,发现LED会以500ms的间隔不停闪烁。

本例程代码可以在HAL库工程模板这一章节的最后,百度网盘链接分享处获取

以上是通过开发板进行实际验证的,下面使用软件仿真,

我们首先进入调试界面( 前面章节有提到,所以本篇以及后续章节都不再重复提及 ),按下图所示打开逻辑分析仪

在这里插入图片描述

点击 Setup…

在这里插入图片描述

添加PB1端口

在这里插入图片描述

选择显示类型为Bit

在这里插入图片描述

点击Close就可以在逻辑分析仪中看到我们添加的PB1端口

在这里插入图片描述

点击全速运行后,就可以看到PB1的波形,每隔500ms翻转一次状态( 高低电平 )

在这里插入图片描述

注:逻辑分析仪中每一隔代表的时间间隔,可以通过,先将鼠标光标移到波形区域,使用鼠标中的滚轮滚动调节

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

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

相关文章

【国产MCU】-认识CH32V307及开发环境搭建

认识CH32V307及开发环境搭建 文章目录 认识CH32V307及开发环境搭建1、CH32V307介绍2、开发环境搭建3、程序固件下载1、CH32V307介绍 CH32V307是沁恒推出的一款基于32位RISC-V设计的互联型微控制器,配备了硬件堆栈区、快速中断入口,在标准RISC-V基础上大大提高了中断响应速度…

Matlab进阶绘图第40期—堆叠蝴蝶图

堆叠蝴蝶图是蝴蝶图的一种变形。 堆叠蝴蝶图一般由左右两个横向堆叠图组合而成&#xff0c;可以很直观地展示两种数据各组分之间的差异。 本文使用自制的Butterfly小工具进行堆叠蝴蝶图的绘制&#xff0c;先来看一下成品效果&#xff1a; 特别提示&#xff1a;本期内容『数据…

密码加密——MD5与BCryptPasswordEncoder

目录 一、问题 二、密码加密 1、MD5密码加密 2、BCryptPasswordEncoder加密&#xff08;推荐&#xff09; 2.1 特点 2.2 使用步骤 一、问题 在数据库表中的密码都是明文存储的&#xff0c;安全性太低 需求&#xff1a; 将密码加密后存储&#xff0c;提高安全性 二、密码加密…

Shell中正则表达式

1.正则表达式介绍 1、正则表达式---通常用于判断语句中&#xff0c;用来检查某一字符串是否满足某一格式 2、正则表达式是由普通字符与元字符组成 3、普通字符包括大小写字母、数字、标点符号及一些其他符号 4、元字符是指在正则表达式中具有特殊意义的专用字符&#xff0c…

翻译: GPT-4 Vision通过量身定制的推荐来增强应用的用户体验 升级Streamlit五

GPT-4 Vision 系列: 翻译: GPT-4 with Vision 升级 Streamlit 应用程序的 7 种方式一翻译: GPT-4 with Vision 升级 Streamlit 应用程序的 7 种方式二翻译: GPT-4 Vision静态图表转换为动态数据可视化 升级Streamlit 三翻译: GPT-4 Vision从图像转换为完全可编辑的表格 升级St…

游戏开发丨基于Panda3D的迷宫小球游戏

文章目录 写在前面Panda3D程序设计程序分析运行结果系列文章写在后面 写在前面 本期内容 基于panda3d的迷宫中的小球游戏 所需环境 pythonpycharm或anacondapanda3d 下载地址 https://download.csdn.net/download/m0_68111267/88792121 Panda3D Panda3D是一种开放源代码…

JUC并发编程-四大函数式接口、Stream 流式计算、ForkJoin并行执行任务

12. 四大函数式接口 新时代的程序员&#xff1a;lambda表达式、链式编程、函数式接口、Stream流式计算 函数式接口&#xff1a;只有一个方法的接口&#xff0c;可以有一些默认的方法 如&#xff1a;Runnable接口函数 1&#xff09;Function 函数型接口 public class Functio…

SpringBoot项目实现热部署的配置方法

SpringBoot项目实现热部署的配置方法 1、什么是热部署&#xff1f; 热部署&#xff0c;就是在应用正在运行的时候升级软件&#xff0c;却不需要重新启动应用。 2、什么是SpringBoot热部署&#xff1f; SpringBoot热部署就是在项目正在运行的时候修改代码, 却不需要重新启动…

QT 使用XML保存操作记录

文章目录 1 实现程序保存操作记录的思路2 XML文档基本结构3 QDomDocument实现XML读写3.1 QDomDocument实现生成XML文件3.2 QDomDocument实现读取XML文件 4 QXmlStreamWriter实现读写4.1 QXmlStreamWriter实现生成XML4.2 QXmlStreamWriter实现读取XML 1 实现程序保存操作记录的思…

(五)MySQL的备份及恢复

1、MySQL日志管理 在数据库保存数据时&#xff0c;有时候不可避免会出现数据丢失或者被破坏&#xff0c;这样情况下&#xff0c;我们必须保证数据的安全性和完整性&#xff0c;就需要使用日志来查看或者恢复数据了 数据库中数据丢失或被破坏可能原因&#xff1a; 误删除数据…

二进制安全虚拟机Protostar靶场(6)堆的简单介绍以及实战 heap1

前言 这是一个系列文章&#xff0c;之前已经介绍过一些二进制安全的基础知识&#xff0c;这里就不过多重复提及&#xff0c;不熟悉的同学可以去看看我之前写的文章 程序静态分析 https://exploit.education/protostar/heap-one/#include <stdlib.h> #include <unis…

笔记本键盘卸载或自动跳出字符故障或按键无效修复办法

首先&#xff0c;在Windows 10操作系统中&#xff0c;您可以在笔记本电脑桌面上找到"计算机"图标&#xff0c;并使用鼠标右键点击它。然后选择"属性"选项。 打开系统属性后&#xff0c;您会看到右上角有一个"设备管理器"选项。请点击它来打开设…

Vim实战:使用Vim实现图像分类任务(一)

文章目录 摘要安装包安装timm 数据增强Cutout和MixupEMA项目结构编译安装Vim环境环境安装过程安装库文件 计算mean和std生成数据集 摘要 论文&#xff1a;https://arxiv.org/pdf/2401.09417v1.pdf 翻译&#xff1a; 近年来&#xff0c;随着深度学习的发展&#xff0c;视觉模型…

适用于 Mac 的 9 款最佳数据恢复软件列表

查看 2024 年 Mac 最佳数据恢复软件的完整列表&#xff0c;并随时恢复您想要的任何类型的数据。 “我们只是人类&#xff0c;我们应该犯错误”。这句话适用于生活的各个方面。错误是会发生的&#xff0c;正是错误使你成为人。 您可以使用 Mac 在线传输内容、上网、工作、玩游…

在Mixamo网站上,下载的动画导入unity给自己的模型添加后出错怎么解决

在Mixamo网站上&#xff0c;下载的动画导入unity给自己的模型添加后出错 一、在Mixamo下载的模型可以正常使用二、在自己的模型和unity自带模型上就出错1.解决方法2.解决成功 注意 一、在Mixamo下载的模型可以正常使用 二、在自己的模型和unity自带模型上就出错 1.解决方法 选…

asp.net core监听本地ip地址

开发asp.net core的时候遇到一个问题我想提供访问供其他同事测试&#xff0c;但是默认都是localhost或者127.0.0.1。我想换成我的Ip地址访问但是不行&#xff0c;百度搜索需要更换监听的地址即修改launchSettings.json&#xff0c;修改为0.0.0.0:5248&#xff0c;这样不管local…

数据结构——用Java实现二分搜索树

目录 一、树 二、二分搜索树 1.二叉树 2.二分搜索树 三、代码实现 1.树的构建 2.获取树中结点的个数 3.添加元素 4.查找元素 &#xff08;1&#xff09;查找元素是否存在 &#xff08;2&#xff09;查找最小元素 &#xff08;3&#xff09;查找最大元素 5.二分搜索…

数字美妆技术:美颜SDK和动态贴纸技术的崭新时代

数字美妆的兴起标志着人们对于自身形象的追求不再局限于现实生活&#xff0c;而是延伸到了虚拟世界。同时&#xff0c;美颜SDK的动态贴纸技术也开始进入到大家的视野之中。 一、美颜SDK&#xff1a;技术之作 通过复杂的图像处理算法&#xff0c;美颜SDK能够实时检测人脸&…

Lua语法基本使用

&#x1f353; 简介&#xff1a;java系列技术分享(&#x1f449;持续更新中…&#x1f525;) &#x1f353; 初衷:一起学习、一起进步、坚持不懈 &#x1f353; 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正&#x1f64f; &#x1f353; 希望这篇文章对你有所帮助,欢…

【网络基础】IP

IP协议报头 4位版本号(version): 指定IP协议的版本, 对于IPv4来说, 就是4.4位头部长度(header length): IP头部的长度是多少个32bit, 也就是 length * 4 的字节数. 4bit表示最大的数字是15, 因此IP头部最大长度是60字节. 8位服务类型(Type Of Service): 3位优先权字段(已经弃用…