STM32-06-STM32_GPIO

文章目录

  • STM32 GPIO
    • 1. GPIO简介
    • 2. GPIO工作模式
    • 3. GPIO相关寄存器
    • 4. 通用外设驱动模型
    • 5. GPIO配置步骤
    • 6. 点亮LED灯
    • 7. LED流水灯
    • 8. 按键控制LED灯

STM32 GPIO

1. GPIO简介

  • 什么是GPIO?

    GPIO:General Purpose Input Output,即通用输入输出端口,简称GPIO

    作用:负责采集外部器件的信息或者控制外部器件工作,即输入输出

    在这里插入图片描述

    STM32F103ZET6芯片是144脚的芯片,具有GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOF和GPIOG七组GPIO口,共有112个IO口可供编程使用。

  • GPIO特点?

    1. 不同型号芯片IO口数量可能不一样
    2. 快速翻转
    3. 每个IO口都可以做中断
    4. 支持8种工作模式
  • GPIO电气特性?

    1. STM32工作电压范围:2 V <= VDD <= 3.6 V

    2. GPIO识别电压范围:CMOS端口:-0.3 V <= 低电平 <= 1.164 V 1.833 V <= 高电平 <= 3.6 V

    3. GPIO输出电流:单个IO,最大25mA

  • GPIO引脚分布?

    STM32引脚类型:电源引脚、晶振引脚、复位引脚、下载引脚、BOOT引脚、GPIO引脚

2. GPIO工作模式

  1. 浮空输入
    在这里插入图片描述

  2. 上拉输入
    在这里插入图片描述

  3. 下拉输入
    在这里插入图片描述

  4. 模拟输入
    在这里插入图片描述

  5. 开漏输出
    在这里插入图片描述

  6. 复用开漏输出
    在这里插入图片描述

  7. 推挽输出
    在这里插入图片描述

  8. 复用推挽输出
    在这里插入图片描述

3. GPIO相关寄存器

CRLCRHIDRODRBSRRBRRLCKR
配置工作模式,输出速度配置工作模式,输出速度输入数据输出数据设置ODR寄存器的值F4之后没有这个寄存器,考虑代码兼容性的话不建议使用配置锁定,用得不多
  • CRL寄存器

作用:配置GPIOxPx0~Px7工作模式输出速度
在这里插入图片描述

  • CRH寄存器

    作用:配置GPIOxPx8~Px15工作模式输出速度
    在这里插入图片描述

  • IDR寄存器
    在这里插入图片描述

  • ODR寄存器

    在这里插入图片描述

  • BSRR寄存器
    在这里插入图片描述

4. 通用外设驱动模型

  1. 初始化:时钟设置、参数设置、IO设置(可选)、中断设置(可选)
  2. 读函数(可选):从外设读取数据
  3. 写函数(可选):往外设写入数据
  4. 中断服务函数(可选):根据中断标志,处理外设各种中断事物

5. GPIO配置步骤

  • 配置步骤

    1. 使能时钟 __HAL_RCC_GPIOx_CLK_ENABLE()
    2. 设置工作模式 HAL_GPIO_Init()
    3. 设置输出状态(可选) HAL_GPIO_WritePin() HAL_GPIO_TogglePin()
    4. 读取输入状态 HAL_GPIO_ReadPin()
  • 相关HAL库函数

    HAL库驱动函数主要寄存器功能
    __HAL_RCC_GPIOx_CLK_ENABLE()F1:RCC_APB2ENR F4:RCC_AHB1ENR F7:RCC_AHB1ENR H7:RCC_AHB4ENR开启GPIO时钟
    HAL_GPIO_Init(…)F1:CRL、CRH、ODR F4/F7/H7:MODER、OTYPER、OSPEEDR、PUPDR初始化GPIO
    HAL_GPIO_WritePin(…)BSRR控制IO输出高/低电平
    HAL_GPIO_TogglePin(…)BSRR每次调用IO输出电平翻转一次
    HAL_GPIO_ReadPin(…)IDR读取IO电平
  • 具体配置步骤,以GPIOA为例

    1. 使能时钟:__HAL_RCC_GPIOx_CLK_ENABLE()

      #define __HAL_RCC_GPIOA_CLK_ENABLE()   
      do { \__IO uint32_t tmpreg; \SET_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPAEN);\/* Delay after an RCC peripheral clock enabling */\tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPAEN);\UNUSED(tmpreg); \} while(0U)
      

      主要代码为SET_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPAEN);,此代码第一个参数为APB2外设使能寄存器,第二个参数代表偏移量,使能这个寄存器的哪一位由这个偏移量来决定。使能GPIOA的时钟时,偏移量为2.

      #define RCC_APB2ENR_IOPAEN_Pos  (2U)                              
      #define RCC_APB2ENR_IOPAEN_Msk  (0x1UL << RCC_APB2ENR_IOPAEN_Pos)/*!< 0x00000004 */
      #define RCC_APB2ENR_IOPAEN      RCC_APB2ENR_IOPAEN_Msk /*!< I/O port A clock enable */
      
    2. 设置工作模式:HAL_GPIO_Init()

      void HAL_GPIO_Init(GPIO_TypeDef  *GPIOx, GPIO_InitTypeDef *GPIO_Init)
      {uint32_t position = 0x00u;uint32_t ioposition;uint32_t iocurrent;uint32_t temp;uint32_t config = 0x00u;__IO uint32_t *configregister; /* Store the address of CRL or CRH register based on pin number */uint32_t registeroffset;       /* offset used during computation of CNF and MODE bits placement inside CRL or CRH register *//* Check the parameters */assert_param(IS_GPIO_ALL_INSTANCE(GPIOx));assert_param(IS_GPIO_PIN(GPIO_Init->Pin));assert_param(IS_GPIO_MODE(GPIO_Init->Mode));/* Configure the port pins */while (((GPIO_Init->Pin) >> position) != 0x00u){/* Get the IO position */ioposition = (0x01uL << position);/* Get the current IO position */iocurrent = (uint32_t)(GPIO_Init->Pin) & ioposition;if (iocurrent == ioposition){/* Check the Alternate function parameters */assert_param(IS_GPIO_AF_INSTANCE(GPIOx));/* Based on the required mode, filling config variable with MODEy[1:0] and CNFy[3:2] corresponding bits */switch (GPIO_Init->Mode){/* If we are configuring the pin in OUTPUT push-pull mode */case GPIO_MODE_OUTPUT_PP:/* Check the GPIO speed parameter */assert_param(IS_GPIO_SPEED(GPIO_Init->Speed));config = GPIO_Init->Speed + GPIO_CR_CNF_GP_OUTPUT_PP;break;/* If we are configuring the pin in OUTPUT open-drain mode */case GPIO_MODE_OUTPUT_OD:/* Check the GPIO speed parameter */assert_param(IS_GPIO_SPEED(GPIO_Init->Speed));config = GPIO_Init->Speed + GPIO_CR_CNF_GP_OUTPUT_OD;break;/* If we are configuring the pin in ALTERNATE FUNCTION push-pull mode */case GPIO_MODE_AF_PP:/* Check the GPIO speed parameter */assert_param(IS_GPIO_SPEED(GPIO_Init->Speed));config = GPIO_Init->Speed + GPIO_CR_CNF_AF_OUTPUT_PP;break;/* If we are configuring the pin in ALTERNATE FUNCTION open-drain mode */case GPIO_MODE_AF_OD:/* Check the GPIO speed parameter */assert_param(IS_GPIO_SPEED(GPIO_Init->Speed));config = GPIO_Init->Speed + GPIO_CR_CNF_AF_OUTPUT_OD;break;/* If we are configuring the pin in INPUT (also applicable to EVENT and IT mode) */case GPIO_MODE_INPUT:case GPIO_MODE_IT_RISING:case GPIO_MODE_IT_FALLING:case GPIO_MODE_IT_RISING_FALLING:case GPIO_MODE_EVT_RISING:case GPIO_MODE_EVT_FALLING:case GPIO_MODE_EVT_RISING_FALLING:/* Check the GPIO pull parameter */assert_param(IS_GPIO_PULL(GPIO_Init->Pull));if (GPIO_Init->Pull == GPIO_NOPULL){config = GPIO_CR_MODE_INPUT + GPIO_CR_CNF_INPUT_FLOATING;}else if (GPIO_Init->Pull == GPIO_PULLUP){config = GPIO_CR_MODE_INPUT + GPIO_CR_CNF_INPUT_PU_PD;/* Set the corresponding ODR bit */GPIOx->BSRR = ioposition;}else /* GPIO_PULLDOWN */{config = GPIO_CR_MODE_INPUT + GPIO_CR_CNF_INPUT_PU_PD;/* Reset the corresponding ODR bit */GPIOx->BRR = ioposition;}break;/* If we are configuring the pin in INPUT analog mode */case GPIO_MODE_ANALOG:config = GPIO_CR_MODE_INPUT + GPIO_CR_CNF_ANALOG;break;/* Parameters are checked with assert_param */default:break;}/* Check if the current bit belongs to first half or last half of the pin count numberin order to address CRH or CRL register*/configregister = (iocurrent < GPIO_PIN_8) ? &GPIOx->CRL     : &GPIOx->CRH;registeroffset = (iocurrent < GPIO_PIN_8) ? (position << 2u) : ((position - 8u) << 2u);/* Apply the new configuration of the pin to the register */MODIFY_REG((*configregister), ((GPIO_CRL_MODE0 | GPIO_CRL_CNF0) << registeroffset), (config << registeroffset));/*--------------------- EXTI Mode Configuration ------------------------*//* Configure the External Interrupt or event for the current IO */if ((GPIO_Init->Mode & EXTI_MODE) == EXTI_MODE){/* Enable AFIO Clock */__HAL_RCC_AFIO_CLK_ENABLE();temp = AFIO->EXTICR[position >> 2u];CLEAR_BIT(temp, (0x0Fu) << (4u * (position & 0x03u)));SET_BIT(temp, (GPIO_GET_INDEX(GPIOx)) << (4u * (position & 0x03u)));AFIO->EXTICR[position >> 2u] = temp;/* Configure the interrupt mask */if ((GPIO_Init->Mode & GPIO_MODE_IT) == GPIO_MODE_IT){SET_BIT(EXTI->IMR, iocurrent);}else{CLEAR_BIT(EXTI->IMR, iocurrent);}/* Configure the event mask */if ((GPIO_Init->Mode & GPIO_MODE_EVT) == GPIO_MODE_EVT){SET_BIT(EXTI->EMR, iocurrent);}else{CLEAR_BIT(EXTI->EMR, iocurrent);}/* Enable or disable the rising trigger */if ((GPIO_Init->Mode & RISING_EDGE) == RISING_EDGE){SET_BIT(EXTI->RTSR, iocurrent);}else{CLEAR_BIT(EXTI->RTSR, iocurrent);}/* Enable or disable the falling trigger */if ((GPIO_Init->Mode & FALLING_EDGE) == FALLING_EDGE){SET_BIT(EXTI->FTSR, iocurrent);}else{CLEAR_BIT(EXTI->FTSR, iocurrent);}}}position++;}
      }
      

      此函数有两个参数,都为结构体指针类型,第一个参数代表GPIO所使用的寄存器的基地址,第二个参数代表GPIO模式配置,GPIO相关寄存器上述已经详细描述各个寄存器代表的功能和用途,下面列出相关结构体定义。

      typedef struct
      {__IO uint32_t CRL;  //HAL_GPIO_Init()函数使用__IO uint32_t CRH;  //HAL_GPIO_Init()函数使用__IO uint32_t IDR;  //HAL_GPIO_ReadPin()函数使用__IO uint32_t ODR;  //HAL_GPIO_Init()函数使用__IO uint32_t BSRR; //HAL_GPIO_WritePin()和HAL_GPIO_TogglePin()函数使用__IO uint32_t BRR;  //一般情况下不使用__IO uint32_t LCKR; //一般情况下不使用
      } GPIO_TypeDef;
      

      下面介绍GPIO初始化配置结构体,里面包含四个成员变量,第一个成员变量为引脚号,第二个成员变量为模式设置,第三个成员变量为上拉下拉设置,第四个成员变量为速度设置,每一个成员变量的值都是固定的,不是任意设置的,都有相关的宏定义,下面一一介绍相关宏定义。

      typedef struct
      {uint32_t Pin;      //引脚号 uint32_t Mode;     //模式设置   uint32_t Pull;     //上拉下拉设置 uint32_t Speed;    //速度设置 
      } GPIO_InitTypeDef;
      

      引脚号取值范围:

      #define GPIO_PIN_0             ((uint16_t)0x0001)  /* Pin 0 selected    */
      #define GPIO_PIN_1             ((uint16_t)0x0002)  /* Pin 1 selected    */
      #define GPIO_PIN_2             ((uint16_t)0x0004)  /* Pin 2 selected    */
      #define GPIO_PIN_3             ((uint16_t)0x0008)  /* Pin 3 selected    */
      #define GPIO_PIN_4             ((uint16_t)0x0010)  /* Pin 4 selected    */
      #define GPIO_PIN_5             ((uint16_t)0x0020)  /* Pin 5 selected    */
      #define GPIO_PIN_6             ((uint16_t)0x0040)  /* Pin 6 selected    */
      #define GPIO_PIN_7             ((uint16_t)0x0080)  /* Pin 7 selected    */
      #define GPIO_PIN_8             ((uint16_t)0x0100)  /* Pin 8 selected    */
      #define GPIO_PIN_9             ((uint16_t)0x0200)  /* Pin 9 selected    */
      #define GPIO_PIN_10            ((uint16_t)0x0400)  /* Pin 10 selected   */
      #define GPIO_PIN_11            ((uint16_t)0x0800)  /* Pin 11 selected   */
      #define GPIO_PIN_12            ((uint16_t)0x1000)  /* Pin 12 selected   */
      #define GPIO_PIN_13            ((uint16_t)0x2000)  /* Pin 13 selected   */
      #define GPIO_PIN_14            ((uint16_t)0x4000)  /* Pin 14 selected   */
      #define GPIO_PIN_15            ((uint16_t)0x8000)  /* Pin 15 selected   */
      #define GPIO_PIN_All           ((uint16_t)0xFFFF)  /* All pins selected */
      

      模式设置取值范围:

      #define  GPIO_MODE_INPUT               0x00000000u      //配合pull设置上拉下拉浮空输入
      #define  GPIO_MODE_OUTPUT_PP           0x00000001u      //推挽输出
      #define  GPIO_MODE_OUTPUT_OD           0x00000011u      //开漏输出
      #define  GPIO_MODE_AF_PP               0x00000002u      //复用推挽输出
      #define  GPIO_MODE_AF_OD               0x00000012u      //复用开漏输出
      #define  GPIO_MODE_AF_INPUT            GPIO_MODE_INPUT         #define  GPIO_MODE_ANALOG              0x00000003u      //模拟输入//以下为外部中断或外部事件模式
      #define  GPIO_MODE_IT_RISING           0x10110000u   
      #define  GPIO_MODE_IT_FALLING          0x10210000u   
      #define  GPIO_MODE_IT_RISING_FALLING   0x10310000u  #define  GPIO_MODE_EVT_RISING          0x10120000u   
      #define  GPIO_MODE_EVT_FALLING         0x10220000u   
      #define  GPIO_MODE_EVT_RISING_FALLING  0x10320000u   
      

      上拉下拉设置取值范围:

      #define  GPIO_NOPULL   0x00000000u   //浮空输入
      #define  GPIO_PULLUP   0x00000001u   //上拉输入
      #define  GPIO_PULLDOWN 0x00000002u   //下拉输入
      

      速度设置取值范围:

      #define  GPIO_SPEED_FREQ_LOW      (GPIO_CRL_MODE0_1) //低速
      #define  GPIO_SPEED_FREQ_MEDIUM   (GPIO_CRL_MODE0_0) //中速
      #define  GPIO_SPEED_FREQ_HIGH     (GPIO_CRL_MODE0)   //高速
      
    3. 设置输出状态: HAL_GPIO_WritePin() HAL_GPIO_TogglePin()

      HAL_GPIO_WritePin()函数有三个参数,第一个参数为上述所提的寄存器基地址,第二个参数为引脚号,第三个参数为要写入的值(GPIO状态:0或1).

      void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
      {/* Check the parameters */assert_param(IS_GPIO_PIN(GPIO_Pin));assert_param(IS_GPIO_PIN_ACTION(PinState));if (PinState != GPIO_PIN_RESET){GPIOx->BSRR = GPIO_Pin;}else{GPIOx->BSRR = (uint32_t)GPIO_Pin << 16u;}
      }
      

      HAL_GPIO_TogglePin()函数有两个参数,第一个参数为上述所提的寄存器基地址,第二个参数为引脚号.

      void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
      {uint32_t odr;/* Check the parameters */assert_param(IS_GPIO_PIN(GPIO_Pin));/* get current Ouput Data Register value */odr = GPIOx->ODR;/* Set selected pins that were at low level, and reset ones that were high */GPIOx->BSRR = ((odr & GPIO_Pin) << GPIO_NUMBER) | (~odr & GPIO_Pin);
      }
      
    4. 读取输入状态: HAL_GPIO_ReadPin()

      HAL_GPIO_ReadPin()函数有两个参数,第一个参数为上述所提的寄存器基地址,第二个参数为引脚号.

      GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
      {GPIO_PinState bitstatus;/* Check the parameters */assert_param(IS_GPIO_PIN(GPIO_Pin));if ((GPIOx->IDR & GPIO_Pin) != (uint32_t)GPIO_PIN_RESET){bitstatus = GPIO_PIN_SET;}else{bitstatus = GPIO_PIN_RESET;}return bitstatus;
      }
      

6. 点亮LED灯

  • 硬件连接图

    从硬件电路图可以看出,STM32F1开发板包含三个LED灯,一个蓝色的电源指示灯,一个红色,一个绿色。电源指示灯接地,上电后就会点亮。红灯和绿灯一端共阳,一端由PB5PE5控制,只要给PB5和PE5接低电平,LED0和LED1就会亮。
    在这里插入图片描述

  • 代码配置步骤

    1. 使能时钟

      //使能时钟
      __HAL_RCC_GPIOB_CLK_ENABLE();
      
    2. 设置工作模式

      //配置工作模式
      GPIO_InitTypeDef gpio_init_struct;
      gpio_init_struct.Pin = GPIO_PIN_5;
      gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP;
      gpio_init_struct.Speed = GPIO_SPEED_FREQ_LOW;
      HAL_GPIO_Init(GPIOB, &gpio_init_struct);//设置初始化状态
      HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);
      
    3. 设置输出状态

      //点亮LED0
      HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET);
      
  • 实验结果展示
    在这里插入图片描述

7. LED流水灯

  • 代码配置步骤

    1. 使能时钟

      //使能时钟
      __HAL_RCC_GPIOB_CLK_ENABLE();
      __HAL_RCC_GPIOE_CLK_ENABLE();
      
    2. 设置工作模式

      //配置工作模式
      //引脚设置为第五个引脚
      gpio_init_struct.Pin = GPIO_PIN_5;
      //推挽输出
      gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP;
      //低速模式
      gpio_init_struct.Speed = GPIO_SPEED_FREQ_LOW;
      //往结构体传值
      HAL_GPIO_Init(GPIOB, &gpio_init_struct);gpio_init_struct.Pin = GPIO_PIN_5;
      gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP;
      gpio_init_struct.Speed = GPIO_SPEED_FREQ_LOW;
      HAL_GPIO_Init(GPIOE, &gpio_init_struct);//设置初始化状态
      HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);
      HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5, GPIO_PIN_SET);	
      
    3. 设置输出状态

      //直接使用HAL_GPIO_TogglePin()函数进行翻转
      HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_5);
      delay_ms(300);
      HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_5);
      delay_ms(300);
      
  • 实验结果展示

8. 按键控制LED灯

  • 硬件连接图

    KEY_UP按键一端接的高电平,当检测到PA0为1时,代表按键按下。KEY0KEY1KEY2按键共地,当检测到PE4、PE3、PE2为0时,代表按键按下。
    在这里插入图片描述

    执行按键操作时,需要使用软件消抖,就是通过延时跳过抖动的时间段,再判断IO输入电平。
    在这里插入图片描述

  • 代码配置

    按键初始化函数

    void key_init(void)
    {GPIO_InitTypeDef gpio_init_struct;//使能时钟__HAL_RCC_GPIOE_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();//配置工作模式gpio_init_struct.Pin = GPIO_PIN_3;gpio_init_struct.Mode = GPIO_MODE_INPUT;//配置上拉输入gpio_init_struct.Pull = GPIO_PULLUP;HAL_GPIO_Init(GPIOE, &gpio_init_struct);//配置工作模式gpio_init_struct.Pin = GPIO_PIN_0;gpio_init_struct.Mode = GPIO_MODE_INPUT;//配置下拉输入gpio_init_struct.Pull = GPIO_PULLDOWN;HAL_GPIO_Init(GPIOA, &gpio_init_struct);
    }
    

    红色LED按键控制函数

    uint8_t key_scan_red_led(void)
    {if(HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_3) == 0){delay_ms(10);  //消抖if(HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_3) == 0){while(HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_3) == 0);  //等待按键松开return 1;   //按键按下返回}}return 0;
    }
    

    绿色LED按键控制函数

    uint8_t key_scan_green_led(void)
    {if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == 1){delay_ms(10);  //消抖if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == 1){while(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == 1);return 1;   //按键按下返回}}return 0;
    }
    

    主函数

    int main(void)
    {HAL_Init();                         /* 初始化HAL库 */sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */delay_init(72);                     /* 延时初始化 */led_init();                         /* LED初始化 */key_init();while(1){//判断控制红色LED的按键是否按下if (key_scan_red_led()){HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET);   delay_ms(100);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);}//判断控制绿色LED的按键是否按下if(key_scan_green_led()){HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5,GPIO_PIN_RESET);    delay_ms(100);HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5,GPIO_PIN_SET);}}
    }
    
  • 实验结果展示

声明:资料来源(战舰STM32F103ZET6开发板资源包)

  1. Cortex-M3权威指南(中文).pdf
  2. STM32F10xxx参考手册_V10(中文版).pdf
  3. STM32F103 战舰开发指南V1.3.pdf
  4. STM32F103ZET6(中文版).pdf
  5. 战舰V4 硬件参考手册_V1.0.pdf

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js逆向第16例:猿人学第12题入门级js

文章目录 一、前言二、定位关键参数三、代码实现一、前言 任务:抓取这5页的数字,计算加和并提交结果 既然是入门级,那肯定很简单了 二、定位关键参数 控制台查看请求数据,m值应该就是关键参数了 进入堆栈 马上定位到了m值"m": btoa(yuanrenxue + window.pag…

移动通信原理与关键技术学习之信道编解码(5)

先回顾调制的过程&#xff1a;调制就是对信号源的信息进行处理加到载波上&#xff0c;使其变为适合于信道传输的形式的过程&#xff0c;就是使载波随信号而改变的技术。 1.什么是IQ调制&#xff1f; 答&#xff1a;将数据分为两路&#xff0c;分别进行载波调制&#xff0c;两…

IDC机房服务器搬迁之运行了几年的服务器没关过机,今天关机下架,再上架突然起不来了,怎么快速处理?

环境 戴尔R420 服务器 1U 2台直连存储 4U CentOS 7 问题描述 IDC机房服务器搬迁之运行了几年的服务器没关过机,今天关机下架,再上架突然起不来了,怎么快速处理? 服务器上电开机就出现进入紧急模式 Welcome to emergency mode! After logging in, type “journalctl …

Cylinder3D论文阅读

Cylindrical and Asymmetrical 3D Convolution Networks for LiDAR Segmentation&#xff08;2020年论文&#xff09; 作者&#xff1a;香港中文大学 论文链接&#xff1a;https://arxiv.org/pdf/2011.10033.pdf 代码链接&#xff1a;https://github.com/xinge008/Cylinder3D …

基于自适应遗传算法的车间调度matlab仿真,可以任意调整工件数和机器数,输出甘特图

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 编码与初始化 4.2 适应度函数 4.3 遗传操作 4.4 自适应机制 4.5 终止条件 5.完整程序 1.程序功能描述 基于自适应遗传算法的车间调度matlab仿真,可以任意调整工件数和机器数,输出甘…

React 18中新钩子 useDeferredValue 使用

React是一个流行的用于构建用户界面的JavaScript库,它不断发展以为开发人员提供优化性能的工具。 React 18中引入的此类工具之一是useDeferredValue钩子,它旨在通过优先渲染更新来提高应用程序的性能。 useDeferredValue钩子是什么? useDeferredValue钩子是React性能优化工…

SEO 分步教程:初学者掌握的 8 个简单基础知识

如果您刚刚开始使用搜索引擎优化 &#xff08;SEO&#xff09;&#xff0c;那么分步 SEO 教程是有序的。在这一点上&#xff0c;你可能已经听说过一些基本术语&#xff0c;如关键词研究和页面优化。但是&#xff0c;您如何应用迄今为止收集的所有知识呢&#xff1f; 如果您刚刚…

SpringBoot中使用SpringEvent业务解耦神器实现监听发布事件同步异步执行任务

场景 SpringBoot中使用单例模式ScheduledExecutorService实现异步多线程任务(若依源码学习)&#xff1a; SpringBoot中使用单例模式ScheduledExecutorService实现异步多线程任务(若依源码学习)-CSDN博客 设计模式-观察者模式在Java中的使用示例-环境监测系统&#xff1a; 设…

windbg下载安装傻瓜式教程

前言 windbg是分析windows上面分析程序的利器 &#xff0c;Windbg是微软出品的强大调试器&#xff0c;是分析软件异常的利器&#xff0c;Windbg之于windows就像GDB之于linux。&#xff08;好了&#xff0c;我也就不讲废话了&#xff0c;我想你也只想知道最简单的安装方式...&am…

线性代数基础【4】线性方程组

第四章 线性方程组 一、线性方程组的基本概念与表达形式 二、线性方程组解的基本定理 定理1 设A为mXn矩阵,则 (1)齐次线性方程组AX0 只有零解的充分必要条件是r(A)n; (2)齐次线性方程组AX0 有非零解(或有无数个解)的充分必要条件是r(A)&#xff1c;n 推论1 设A为n阶矩阵,则…

你为什么还在用Promise.all?

请停止在JavaScript中使用Promise.all() 什么是JavaScript中的Promise 如果您偶然发现这篇文章,那么您可能已经熟悉了promise。 但是,对于那些JavaScript新手来说,让我们来详细说明一下。 从本质上讲,Promise对象表示异步操作的最终完成或失败。 有趣的是,当创建promise时,其值…