GD32零基础教程第二节(点亮一个LED灯)

文章目录

  • 前言
  • 一、GPIO介绍
    • 1.GPIO是什么
    • 2.GPIO命名规则
  • 三、LED灯本质及原理图
    • 1.LED本质
    • 2.LED原理图分析
  • 四、实验代码编写
    • 1.配置GPIO为输出模式的步骤
    • 2.设置GPIO电平状态函数
    • 3.具体代码编写
  • 总结


前言

本篇文章将带大家开始学习国产芯片GD32,这套文章将涵盖基础篇,进阶篇,高级篇,项目篇,本套教程将使用GD32F407VET6开发板。(开发板采用光子物联开发板)

一、GPIO介绍

1.GPIO是什么

GPIO是"General Purpose Input/Output"(通用输入/输出)的缩写,它是数字电路中常见的一个概念,也是嵌入式系统中常用的一个功能模块。

GPIO允许嵌入式系统与外部世界进行通信,它通过将数字信号转换为电压或电流的形式与外部设备进行交互。GPIO引脚可以被配置为输入或输出,这意味着它们可以被用来读取外部设备的状态(如传感器、开关等)或控制外部设备的行为(如LED灯、电机、继电器等)。

在嵌入式系统中,GPIO通常由微控制器或微处理器的引脚提供支持。通过软件配置和控制GPIO,嵌入式系统可以实现各种输入和输出功能,从而实现与外部环境的交互和控制。

2.GPIO命名规则

字母表示端口:字母通常代表了GPIO引脚所在的端口。端口是一组相连的引脚,它们通常由相同的硬件模块或者功能单元控制。例如,一个芯片可能有多个端口,每个端口负责不同的功能或者连接到不同的外部设备。字母可以是A、B、C等,每个字母代表一个端口。

数字表示引脚编号:数字部分表示了具体的GPIO引脚在其所在端口内的编号。通常,这些编号是从0开始的,依次递增。例如,GPIOA0表示端口A中的第一个引脚,GPIOA1表示端口A中的第二个引脚,依此类推。

三、LED灯本质及原理图

1.LED本质

LED是“Light Emitting Diode”的缩写,翻译为发光二极管。

LED的工作原理:LED是一种特殊类型的二极管。它的N型区域富含自由电子,P型区域富含空穴。当正向电压施加在LED的两端时,电子和空穴会在PN结处重组,这个过程释放出能量,而这部分能量会以光的形式发射出来,形成光线。这就是LED发光的原理。

这里我们需要知道LED灯其实就是一个发光二极管,当发光二极管被导通时LED灯就会被点亮,发光二极管截止时,LED灯被熄灭。

2.LED原理图分析

通过观察LED灯的原理图可以知道,我们只需要去控制PB4端口的电平状态就可以控制LED灯的状态,当PB4输出高电平时,发光二极管截止,LED灯熄灭,当PB4输出低电平时,发光二极管导通,LED灯被点亮。
在这里插入图片描述

四、实验代码编写

1.配置GPIO为输出模式的步骤

1.使能GPIO引脚

使能外设的时钟函数如下:

periph:这是一个枚举类型的参数,用于指定要启用时钟的外设。rcu_periph_enum 是一个枚举类型,包含了所有可能的外设。具体来说,它包括了处理器上的各种外设,比如GPIO、USART、SPI、I2C等等。通过传递相应的外设枚举值,函数可以识别并启用指定外设的时钟。

void rcu_periph_clock_enable(rcu_periph_enum periph);

rcu_periph_enum枚举类型:

typedef enum
{
    /* AHB1 peripherals */
    RCU_GPIOA     = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 0U),                  /*!< GPIOA clock */
    RCU_GPIOB     = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 1U),                  /*!< GPIOB clock */
    RCU_GPIOC     = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 2U),                  /*!< GPIOC clock */
    RCU_GPIOD     = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 3U),                  /*!< GPIOD clock */
    RCU_GPIOE     = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 4U),                  /*!< GPIOE clock */
    RCU_GPIOF     = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 5U),                  /*!< GPIOF clock */
    RCU_GPIOG     = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 6U),                  /*!< GPIOG clock */
    RCU_GPIOH     = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 7U),                  /*!< GPIOH clock */
    RCU_GPIOI     = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 8U),                  /*!< GPIOI clock */
    RCU_CRC       = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 12U),                 /*!< CRC clock */
    RCU_BKPSRAM   = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 18U),                 /*!< BKPSRAM clock */
    RCU_TCMSRAM   = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 20U),                 /*!< TCMSRAM clock */
    RCU_DMA0      = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 21U),                 /*!< DMA0 clock */
    RCU_DMA1      = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 22U),                 /*!< DMA1 clock */
    RCU_IPA       = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 23U),                 /*!< IPA clock */
    RCU_ENET      = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 25U),                 /*!< ENET clock */
    RCU_ENETTX    = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 26U),                 /*!< ENETTX clock */
    RCU_ENETRX    = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 27U),                 /*!< ENETRX clock */
    RCU_ENETPTP   = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 28U),                 /*!< ENETPTP clock */
    RCU_USBHS     = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 29U),                 /*!< USBHS clock */
    RCU_USBHSULPI = RCU_REGIDX_BIT(AHB1EN_REG_OFFSET, 30U),                 /*!< USBHSULPI clock */
    /* AHB2 peripherals */
    RCU_DCI       = RCU_REGIDX_BIT(AHB2EN_REG_OFFSET, 0U),                  /*!< DCI clock */
    RCU_TRNG      = RCU_REGIDX_BIT(AHB2EN_REG_OFFSET, 6U),                  /*!< TRNG clock */
    RCU_USBFS     = RCU_REGIDX_BIT(AHB2EN_REG_OFFSET, 7U),                  /*!< USBFS clock */
    /* AHB3 peripherals */
    RCU_EXMC      = RCU_REGIDX_BIT(AHB3EN_REG_OFFSET, 0U),                  /*!< EXMC clock */
    /* APB1 peripherals */
    RCU_TIMER1    = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 0U),                  /*!< TIMER1 clock */
    RCU_TIMER2    = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 1U),                  /*!< TIMER2 clock */
    RCU_TIMER3    = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 2U),                  /*!< TIMER3 clock */
    RCU_TIMER4    = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 3U),                  /*!< TIMER4 clock */
    RCU_TIMER5    = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 4U),                  /*!< TIMER5 clock */
    RCU_TIMER6    = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 5U),                  /*!< TIMER6 clock */
    RCU_TIMER11   = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 6U),                  /*!< TIMER11 clock */
    RCU_TIMER12   = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 7U),                  /*!< TIMER12 clock */
    RCU_TIMER13   = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 8U),                  /*!< TIMER13 clock */   
    RCU_WWDGT     = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 11U),                 /*!< WWDGT clock */
    RCU_SPI1      = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 14U),                 /*!< SPI1 clock */
    RCU_SPI2      = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 15U),                 /*!< SPI2 clock */
    RCU_USART1    = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 17U),                 /*!< USART1 clock */
    RCU_USART2    = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 18U),                 /*!< USART2 clock */
    RCU_UART3     = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 19U),                 /*!< UART3 clock */
    RCU_UART4     = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 20U),                 /*!< UART4 clock */
    RCU_I2C0      = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 21U),                 /*!< I2C0 clock */
    RCU_I2C1      = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 22U),                 /*!< I2C1 clock */
    RCU_I2C2      = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 23U),                 /*!< I2C2 clock */   
    RCU_CAN0      = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 25U),                 /*!< CAN0 clock */
    RCU_CAN1      = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 26U),                 /*!< CAN1 clock */
    RCU_PMU       = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 28U),                 /*!< PMU clock */
    RCU_DAC       = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 29U),                 /*!< DAC clock */
    RCU_UART6     = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 30U),                 /*!< UART6 clock */
    RCU_UART7     = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 31U),                 /*!< UART7 clock */
    RCU_RTC       = RCU_REGIDX_BIT(BDCTL_REG_OFFSET, 15U),                  /*!< RTC clock */
    /* APB2 peripherals */
    RCU_TIMER0    = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 0U),                  /*!< TIMER0 clock */
    RCU_TIMER7    = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 1U),                  /*!< TIMER7 clock */
    RCU_USART0    = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 4U),                  /*!< USART0 clock */
    RCU_USART5    = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 5U),                  /*!< USART5 clock */
    RCU_ADC0      = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 8U),                  /*!< ADC0 clock */
    RCU_ADC1      = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 9U),                  /*!< ADC1 clock */
    RCU_ADC2      = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 10U),                 /*!< ADC2 clock */
    RCU_SDIO      = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 11U),                 /*!< SDIO clock */
    RCU_SPI0      = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 12U),                 /*!< SPI0 clock */
    RCU_SPI3      = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 13U),                 /*!< SPI3 clock */
    RCU_SYSCFG    = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 14U),                 /*!< SYSCFG clock */
    RCU_TIMER8    = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 16U),                 /*!< TIMER8 clock */
    RCU_TIMER9    = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 17U),                 /*!< TIMER9 clock */
    RCU_TIMER10   = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 18U),                 /*!< TIMER10 clock */
    RCU_SPI4      = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 20U),                 /*!< SPI4 clock */
    RCU_SPI5      = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 21U),                 /*!< SPI5 clock */
    RCU_TLI       = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 26U),                 /*!< TLI clock */
    /* APB1 additional peripherals */
    RCU_CTC       = RCU_REGIDX_BIT(ADD_APB1EN_REG_OFFSET, 27U),             /*!< CTC clock */
    RCU_IREF      = RCU_REGIDX_BIT(ADD_APB1EN_REG_OFFSET, 31U),             /*!< IREF clock */
}rcu_periph_enum;

2.配置GPIO的引脚模式

配置GPIO的引脚模式如下:

void gpio_mode_set(uint32_t gpio_periph, uint32_t mode, uint32_t pull_up_down, uint32_t pin)

gpio_periph:这是一个无符号32位整数,用于指定要配置的 GPIO 外设。通常,嵌入式系统中的每个 GPIO 外设都会有一个对应的寄存器,用于配置和控制该外设的 GPIO 引脚。通过传递相应的 GPIO 外设参数,函数可以识别并配置特定的 GPIO 外设。

这个参数一般传入GPIOA、GPIOB这种类型的参数

mode:这也是一个无符号32位整数,用于指定要设置的 GPIO 引脚的工作模式。GPIO 引脚可以配置为输入模式、输出模式或其他特定模式,比如复用模式。通过传递相应的模式参数,函数可以将 GPIO 引脚设置为所需的工作模式。

GPIO的模式就是使用的一些宏来表示的:
在这里插入图片描述

pull_up_down:同样是一个无符号32位整数,用于指定 GPIO 引脚的上拉或下拉电阻状态。在某些情况下,需要在 GPIO 引脚上启用上拉或下拉电阻,以确保稳定的信号传输。通过传递相应的参数,函数可以控制 GPIO 引脚上拉或下拉电阻的状态。

GPIO引脚可以设置为上拉、下拉、无上拉和下拉电阻等几个选项。
在这里插入图片描述

pin:最后一个参数是一个无符号32位整数,用于指定要配置的 GPIO 引脚的编号。在大多数嵌入式系统中,每个 GPIO 外设都有多个引脚可供选择,通过传递相应的引脚编号参数,函数可以指定要配置的特定 GPIO 引脚。

3.配置GPIO输出类型和速度

void gpio_output_options_set(uint32_t gpio_periph, uint8_t otype, uint32_t speed, uint32_t pin)

gpio_periph:这是一个无符号32位整数,用于指定要配置的 GPIO 外设。类似于 gpio_mode_set 函数,通过传递相应的 GPIO 外设参数,函数可以识别并配置特定的 GPIO 外设。

otype:这是一个无符号8位整数,用于指定 GPIO 引脚的输出类型。GPIO 引脚可以配置为推挽输出或开漏输出两种类型。推挽输出可以提供高电平和低电平输出,而开漏输出通常用于构建开关电路或连接到开漏输出的器件。通过传递相应的参数,函数可以设置 GPIO 引脚的输出类型。

在这里插入图片描述

speed:这也是一个无符号32位整数,用于指定 GPIO 引脚的输出速度。GPIO 引脚的输出速度通常以 MHz 为单位进行定义,表示引脚可以支持的最大输出频率。通过传递相应的速度参数,函数可以设置 GPIO 引脚的输出速度。

在这里插入图片描述

pin:最后一个参数是一个无符号32位整数,用于指定要配置的 GPIO 引脚的编号。类似于 gpio_mode_set 函数,通过传递相应的引脚编号参数,函数可以指定要配置的特定 GPIO 引脚。

在这里插入图片描述

2.设置GPIO电平状态函数

设置GPIO引脚为高电平函数:

void gpio_bit_set(uint32_t gpio_periph, uint32_t pin)

gpio_periph:这是一个无符号32位整数,用于指定要操作的 GPIO 外设。类似于其他 GPIO 相关函数,通过传递相应的 GPIO 外设参数,函数可以识别并操作特定的 GPIO 外设。

pin:这是一个无符号32位整数,用于指定要设置的 GPIO 引脚的编号。通过传递相应的引脚编号参数,函数可以指定要设置输出状态为高电平的特定 GPIO 引脚。

设置GPIO引脚为低电平函数:

void gpio_bit_reset(uint32_t gpio_periph, uint32_t pin)

这个函数的参数和上面这个函数的参数是一样的,这里就不多解释了。

3.具体代码编写

这里我们来使用上面的函数首先初始化GPIO引脚,并且设置为输出引脚,然后使用设置GPIO电平状态函数来让LED灯闪烁。

#include "gd32f4xx.h"//包含了该系列芯片的寄存器定义、常量定义和函数声明等信息
#include "gd32f4xx_libopt.h"//GD32F4 系列芯片的外设库选项配置文件
#include "systick.h"//配置和使用 SysTick 定时器的功能文件

int main(void)
{
    systick_config();//配置系统主频168M,外部8M晶振,配置在#define __SYSTEM_CLOCK_168M_PLL_8M_HXTAL        (uint32_t)(168000000)
    rcu_periph_clock_enable(RCU_GPIOB);//使能GPIOB时钟
    gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_4);//PB4配置成输出
    gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_4);//PB4配置成推挽输出,50M速度
    while(1)
	{
        gpio_bit_set(GPIOB, GPIO_PIN_4);//PB4输出高电平
        delay_1ms(100);//等待100ms
        gpio_bit_reset(GPIOB, GPIO_PIN_4);//PB4输出低电平
        delay_1ms(100);
    }
}

总结

本篇文章主要讲解了GPIO是什么,以及将GPIO配置为输出模式点亮一个LED灯的实验。

源码链接:
链接:https://pan.baidu.com/s/1-YMOZS_QVGSDkUC0oIbEWg
提取码:tji2

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何洞悉六西格玛培训公司课程设置的全面性?

近年来&#xff0c;市面上的六西格玛培训公司琳琅满目&#xff0c;课程设置更是五花八门。如何判断一个六西格玛培训公司的课程设置是否全面&#xff0c;成为了许多企业和个人关注的焦点。本文&#xff0c;深圳天行健六西格玛培训公司有建议如下&#xff1a; 一、了解六西格玛的…

有趣的css - 暗黑模式切换按钮

大家好&#xff0c;我是 Just&#xff0c;这里是「设计师工作日常」&#xff0c;今天分享的是一个丝滑的暗黑模式切换按钮。 《有趣的css》系列最新实例通过公众号「设计师工作日常」发布。 目录 整体效果核心代码html 代码css 部分代码 完整代码如下html 页面css 样式页面渲染…

一年期单域名SSL证书怎么申请?

申请一年期单域名SSL证书的步骤如下&#xff1a; 1. 选择SSL证书提供商&#xff1a; 选择一家信誉良好、受浏览器广泛信任的SSL证书颁发机构&#xff08;CA&#xff09;&#xff0c;如JoySSL等。可以根据价格、支持服务、证书类型等因素进行比较。 单域名SSL证书-JoySSLhttps:…

ThinkPHP审计(1) 不安全的SQL注入PHP反序列化链子phar利用简单的CMS审计实例

ThinkPHP代码审计(1) 不安全的SQL注入&PHP反序列化链子phar利用&简单的CMS审计实例 文章目录 ThinkPHP代码审计(1) 不安全的SQL注入&PHP反序列化链子phar利用&简单的CMS审计实例一.Thinkphp5不安全的SQL写法二.Thinkphp3 SQL注入三.Thinkphp链5.1.x结合phar实现…

TouchGFX之容器

容器是TouchGFX中的一种组件&#xff0c;可以包含子节点&#xff08;比如控件和其他容器&#xff09;。 在TouchGFX Designer中&#xff0c;可以在Widgets&#xff08;控件&#xff09;选项卡中的containers&#xff08;容器&#xff09;类别下找到容器&#xff0c;向容器中添…

正大国际:国内做外盘qi货的人多吗?

整个中国&#xff0c;期货也就五百万个账户&#xff0c;活跃的也就两百万个&#xff0c;股票账户三亿多个 所以说在国内做期货的是真的少&#xff0c;大部分人聊天知道股票&#xff0c;期货听都没听过 这所有的国内期货账户中&#xff0c;小散户是寥寥无几的&#xff0c;基本…

content warning内容警告中文汉化快捷教程分享

content warning(内容警告)是近期steam上非常受欢迎的一款恐怖题材多人联机游戏,自4月1日上线后,一直保持较高的玩家人数,steam好评率也稳定维持在93%,可以说是4月初发售游戏中的最大黑马。本作首发虽然支持中文,不过游戏内的中文阅读体验并不完整,经常会出现中英文字幕混杂等情…

IoTeX的旅程并非孤军奋战

自2017年起&#xff0c;IoTeX便作为一个雄心勃勃的开源项目&#xff0c;踏上了一条为机器打造开放经济的道路。这个宏伟的目标背后&#xff0c;是一个去中心化的平台愿景&#xff0c;一个能够让人类和机器在有保障的信任、自由意志及精心设计的经济激励下相互协作的开放生态系统…

前端学习<四>JavaScript基础——10-运算符

我们在前面讲过变量&#xff0c;本文讲一下运算符和表达式。 运算符的定义和分类 运算符的定义 运算符&#xff1a;也叫操作符&#xff0c;是一种符号。通过运算符可以对一个或多个值进行运算&#xff0c;并获取运算结果。 表达式&#xff1a;数字、运算符、变量的组合&…

华为 2024 届校园招聘-硬件通⽤/单板开发——第十套

华为 2024 届校园招聘-硬件通⽤/单板开发——第十套 部分题目分享&#xff0c;完整版带答案&#xff08;共十套&#xff09;获取&#xff08;WX:didadidadidida313&#xff0c;加我备注&#xff1a;CSDN huawei硬件单板题目&#xff0c;谢绝白嫖哈&#xff09; 1、I2 C 总线…

代码随想录算法训练营Day14|二叉树理论基础和递归遍历

代码随想录卡哥视频 理论基础 需要了解 二叉树的种类&#xff0c;存储方式&#xff0c;遍历方式 以及二叉树的定义 文章讲解&#xff1a;代码随想录 递归遍历 &#xff08;必须掌握&#xff09; 二叉树的三种递归遍历掌握其规律后&#xff0c;其实很简单 题目链接/文章讲解/…

如何制作软件安装包第二步

目录 0.文章目的1.第二次打开发现之前生成的2.重新引导引入文件--制作安装包3.输入安装包基本信息4.确认安装路径5.选择制作完成的exe执行文件6.加入jre运行环境--这步很重要&#xff0c;否则项目运行不起来7.填写安装包名称8.添加版权信息文件&#xff08;可选操作&#xff09…

android-自定义TextView在文字内容末尾添加图片icon、可以添加间距

样式示意图 自定义属性 style.xml <declare-styleable name"IconLabelTextView"><attr name"iconSrc" format"reference"/><attr name"iconPaddingStart" format"dimension"/><attr name"iconPad…

PKI:构建数字安全基石的关键技术

在数字化时代&#xff0c;网络安全已成为我们日常生活和工作的重要组成部分。为了确保数据的完整性、机密性和身份的真实性&#xff0c;公钥基础设施&#xff08;Public Key Infrastructure&#xff0c;简称PKI&#xff09;技术应运而生&#xff0c;为构建数字安全基石提供了重…

无人机控制框架的设计

无人机控制框架的设计主要包括以下几个模块&#xff1a;传感器模块、控制模块、通信模块和执行器模块。 传感器模块&#xff1a;负责获取无人机当前的状态信息&#xff0c;包括位置、姿态、速度等。常用的传感器包括GPS、陀螺仪、加速度计、气压计等。 控制模块&#xff1a;根…

Mysql底层原理二:Buffer Pool

1.数据区 就是描述信息缓存页这块&#xff0c;用来存放从磁盘加载的数据页&#xff08;看上图 索引页和数据页是分开的&#xff09; 2. free链表 用来标识数据区哪些数据页是可用的 3. flush链表 update的时候&#xff0c;如果数据在数据区可以找到&#xff0c;那就直接内…

Novel Influence Maximization Algorithm for Social Network Behavior Management

Abstract: 通过影响力最大化的过程来识别对社交网络中的产品采用或信息利用做出重大贡献的用户。社交网络的指数增长给这些网络的分析带来了一些挑战。现有文献非常重视对结构属性进行建模&#xff0c;而忽略了用户与其社会行为之间的关系。对于社会行为&#xff0c;本文将影响…

基于Java+SpringBoot+vue3+uniapp点餐/外卖管理系统设计与实现

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

第九届蓝桥杯大赛个人赛省赛(软件类)真题C 语言 A 组-航班时间

#include<iostream> using namespace std;int getTime(){int h1, h2, m1, m2, s1, s2, d 0;//d一定初始化为0&#xff0c;以正确处理不跨天的情况 scanf("%d:%d:%d %d:%d:%d (%d)", &h1, &m1, &s1, &h2, &m2, &s2, &d);return d …

使用高德微信小程序插件实现精准获取打卡位置

由于微信小程序的 getFuzzyLocation 误差太大 不得不改用高德微信sdk 使用方法&#xff1a; 一、下载 sdk 相关下载-微信小程序插件 | 高德地图API 二、引入 sdk //引入 var amapFile require(../../libs/amap-wx.js); Page({onLoad: function() {var that this;va…