【STM32】IO口取反 | 寄存器方式 | 异或运算符 | 原理

news2024/11/15 10:23:38

LuckiBit

目录

  • STM32 IO口取反 | 寄存器方式 | 异或运算符 | 原理
    • 1. 引言
    • 2. GPIO基础知识
      • 2.1 GPIO概述
      • 2.2 STM32的GPIO架构
      • 2.3 GPIO寄存器简介
    • 3. GPIO引脚取反原理
      • 3.1 寄存器操作实现取反
      • 3.2 异或运算符的应用
    • 4. 示例代码
      • 4.1 基础示例:LED闪烁
      • 4.2 应用实例:继电器控制
    • 5. GPIO引脚配置详解
      • 5.1 GPIO_InitTypeDef结构体
      • 5.2 配置示例
    • 6. GPIO寄存器操作详解
      • 6.1 输出数据寄存器(GPIOx_ODR)
      • 6.2 位设置/复位寄存器(GPIOx_BSRR)
    • 7. 异或运算符的应用详解
      • 7.1 异或运算符基础
      • 7.2 实现GPIO引脚取反
      • 7.3 取反操作示例
      • 7.4 复杂应用示例:多引脚取反
    • 8. 应用场景
      • 8.1 LED控制
      • 8.2 继电器控制
    • 9. 总结
      • 附录:常用GPIO宏定义
    • 10. 结束语
    • 相关文章:

STM32 IO口取反 | 寄存器方式 | 异或运算符 | 原理

1. 引言

在嵌入式系统中,IO口(输入/输出口)的控制是非常基础且重要的操作。STM32作为一种广泛使用的微控制器,提供了多种方式来操作其IO口。其中,利用寄存器直接操作和使用异或运算符来取反IO口的状态是一种高效且灵活的方法。本文将详细介绍如何通过寄存器方式和异或运算符对STM32的GPIO引脚进行取反操作,帮助读者深入理解这一过程。

2. GPIO基础知识

2.1 GPIO概述

GPIO(General Purpose Input/Output),即通用输入/输出,是微控制器中一种可以被配置为输入或输出状态的数字信号管脚。通过GPIO,可以实现对外部设备的控制,如LED、按钮、传感器等。

2.2 STM32的GPIO架构

STM32的GPIO架构具有以下特点:

  • 每个GPIO引脚可以配置为输入或输出模式。
  • 支持多种工作模式,如推挽输出、开漏输出、浮空输入、上拉输入、下拉输入等。
  • 提供多种速度选择,以满足不同应用的需求。
  • 通过寄存器操作可以实现对GPIO的高效控制。

2.3 GPIO寄存器简介

STM32的GPIO控制通过一系列寄存器实现,主要包括以下几个:

  • GPIOx_CRL/CRH(配置寄存器低/高):配置引脚的模式和功能。
  • GPIOx_IDR(输入数据寄存器):读取引脚的输入状态。
  • GPIOx_ODR(输出数据寄存器):设置引脚的输出状态。
  • GPIOx_BSRR(位设置/复位寄存器):原子性地设置和复位引脚。
  • GPIOx_BRR(位复位寄存器):复位引脚。
  • GPIOx_LCKR(配置锁定寄存器):锁定引脚的配置。

3. GPIO引脚取反原理

GPIO引脚取反是指将当前引脚的电平状态进行翻转,即高电平变低电平,低电平变高电平。通过寄存器操作和异或运算符可以高效实现这一功能。

3.1 寄存器操作实现取反

GPIO引脚的输出状态存储在ODR(输出数据寄存器)中,通过对该寄存器进行操作,可以实现引脚状态的修改。具体操作步骤如下:

  1. 读取当前ODR寄存器的值。
  2. 对需要取反的引脚位进行异或操作。
  3. 将修改后的值写回ODR寄存器。

3.2 异或运算符的应用

异或运算符(^)是一种位运算符,对于任意位a和b,a ^ b的结果如下:

  • 若a和b相同,则结果为0。
  • 若a和b不同,则结果为1。

利用这一特性,可以通过与1进行异或操作实现位的取反。例如,若某引脚对应的位为1,与1进行异或操作后结果为0;若对应位为0,与1进行异或操作后结果为1,从而实现取反效果。

4. 示例代码

4.1 基础示例:LED闪烁

以下代码演示了如何通过寄存器方式和异或运算符实现LED灯的闪烁:

#include "stm32f10x.h"        // 包含 STM32 的设备头文件
#include "stm32f10x_gpio.h"   // 包含 STM32 的 GPIO 头文件

void GPIO_Config(void) {
    // 使能 GPIOA 时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    
    // 配置 GPIOA 引脚 5 为推挽输出模式
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = GPIO_PIN_5;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
}

void GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) {
    // 使用异或运算符取反 GPIO 引脚
    GPIOx->ODR ^= GPIO_Pin;
}

int main(void) {
    // 配置 GPIO
    GPIO_Config();
    
    while (1) {
        // 取反 GPIOA 引脚 5
        GPIO_TogglePin(GPIOA, GPIO_PIN_5);
        
        // 简单的延时
        for (volatile int i = 0; i < 1000000; i++);
    }
}

4.2 应用实例:继电器控制

继电器控制是嵌入式系统中的常见应用之一,通过类似的方法可以实现继电器的开关控制。

#include "stm32f10x.h"        // 包含 STM32 的设备头文件
#include "stm32f10x_gpio.h"   // 包含 STM32 的 GPIO 头文件

void GPIO_Config(void) {
    // 使能 GPIOB 时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    
    // 配置 GPIOB 引脚 12 为推挽输出模式
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = GPIO_PIN_12;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
}

void GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) {
    // 使用异或运算符取反 GPIO 引脚
    GPIOx->ODR ^= GPIO_Pin;
}

int main(void) {
    // 配置 GPIO
    GPIO_Config();
    
    while (1) {
        // 取反 GPIOB 引脚 12
        GPIO_TogglePin(GPIOB, GPIO_PIN_12);
        
        // 简单的延时
        for (volatile int i = 0; i < 1000000; i++);
    }
}

5. GPIO引脚配置详解

5.1 GPIO_InitTypeDef结构体

在STM32的标准外设库中,GPIO的初始化通过GPIO_InitTypeDef结构体实现。该结构体包含以下成员:

  • GPIO_Pin:指定要配置的GPIO引脚,可以是GPIO_Pin_x的组合。
  • GPIO_Speed:指定引脚的输出速度。
  • GPIO_Mode:指定引脚的工作模式。

5.2 配置示例

以下代码展示了如何配置GPIOA的引脚5为推挽输出模式,速度为50MHz:

GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_PIN_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

6. GPIO寄存器操作详解

6.1 输出数据寄存器(GPIOx_ODR)

ODR寄存器用于控制GPIO引脚的输出状态,每个引脚对应一个位。例如,要设置GPIOA的引脚5为高电平,可以通过以下操作实现:

GPIOA->ODR |= GPIO_PIN_5;  // 将引脚5置为高电平

要将引脚5置为低电平,可以使用以下操作:

GPIOA->ODR &= ~GPIO_PIN_5;  // 将引脚5置为低电平

6.2 位设置/复位寄存器(GPIOx_BSRR)

BSRR寄存器提供了一种原子性设置和复位引脚的方式,通过向BSRR寄存器写入相应的位,可以同时设置和复位不同的引脚。例如,要设置引脚5为高电平,同时复位引脚6,可以使用以下操作:

GPIOA->BSRR = GPIO_PIN_5 | (GPIO_PIN_6 << 16);

7. 异或运算符的应用详解

7.1 异或运算符基础

异或运算符(^)是一种位运算符,用于对两个二进制数的对应位进行异或操作。其运算规则如下:

  • 若两个对应位相同,则结果为0。
  • 若两个对应位不同,则结果为1。

例如:

  • 0 ^ 0 = 0
  • 0 ^ 1 = 1
  • 1 ^ 0 = 1
  • 1 ^ 1 = 0

7.2 实现GPIO引脚取反

利用异或运算符可以方便地实现GPIO引脚的取反操作。假设当前引脚状态为1,要将其取反,即将其状态变为0,可以通过与1进行异或操作实现。同理,当前引脚状态为0,通过与1进行异或操作后状态变为1,从而实现状态的取反。

7.3 取反操作示例

以下代码展示了如何通过异或运算符对GPIO引脚进行取反操作:

#include "stm32f10x.h"        // 包含 STM32 的设备头文件
#include "stm32f10x_gpio.h"   // 包含 STM32 的 GPIO 头文件

void GPIO_Config(void) {
    // 使能 GPIOA 时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    
    // 配置 GPIOA 引脚 5 为推挽输出模式
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = GPIO_PIN_5;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
}

void GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) {
    // 使用异或运算符取反 GPIO 引脚
    GPIOx->ODR ^= GPIO_Pin;
}

int main(void) {
    // 配置 GPIO
    GPIO_Config();
    
    while (1) {
        // 取反 GPIOA 引脚 5
        GPIO_TogglePin(GPIOA, GPIO_PIN_5);
        
        // 简单的延时
        for (volatile int i = 0; i < 1000000; i++);
    }
}

7.4 复杂应用示例:多引脚取反

以下代码展示了如何对多个GPIO引脚同时进行取反操作:

#include "stm32f10x.h"        // 包含 STM32 的设备头文件
#include "stm32f10x_gpio.h"   // 包含 STM32 的 GPIO 头文件

void GPIO_Config(void) {
    // 使能 GPIOA 时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    
    // 配置 GPIOA 引脚 5 和 引脚 6 为推挽输出模式
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = GPIO_PIN_5 | GPIO_PIN_6;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
}

void GPIO_TogglePins(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pins) {
    // 使用异或运算符取反 GPIO 引脚
    GPIOx->ODR ^= GPIO_Pins;
}

int main(void) {
    // 配置 GPIO
    GPIO_Config();
    
    while (1) {
        // 取反 GPIOA 引脚 5 和 引脚 6
        GPIO_TogglePins(GPIOA, GPIO_PIN_5 | GPIO_PIN_6);
        
        // 简单的延时
        for (volatile int i = 0; i < 1000000; i++);
    }
}

8. 应用场景

8.1 LED控制

通过上述方法,可以方便地控制LED灯的状态。例如,可以在按钮按下时取反LED灯的状态,达到开关LED灯的效果。

#include "stm32f10x.h"
#include "stm32f10x_gpio.h"

void GPIO_Config(void) {
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = GPIO_PIN_5;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
}

void Button_Config(void) {
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
    
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = GPIO_PIN_13;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 上拉输入
    GPIO_Init(GPIOC, &GPIO_InitStructure);
}

int main(void) {
    GPIO_Config();
    Button_Config();
    
    while (1) {
        if (GPIO_ReadInputDataBit(GPIOC, GPIO_PIN_13) == 0) { // 按钮按下
            GPIO_TogglePin(GPIOA, GPIO_PIN_5);
            // 消抖延时
            for (volatile int i = 0; i < 100000; i++);
            while (GPIO_ReadInputDataBit(GPIOC, GPIO_PIN_13) == 0); // 等待按钮松开
        }
    }
}

8.2 继电器控制

在工业控制中,继电器控制是常见应用。通过GPIO引脚的取反操作,可以实现继电器的开关控制。

#include "stm32f10x.h"
#include "stm32f10x_gpio.h"

void GPIO_Config(void) {
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = GPIO_PIN_12;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
}

void Relay_Toggle(void) {
    GPIOB->ODR ^= GPIO_PIN_12;
}

int main(void) {
    GPIO_Config();
    
    while (1) {
        Relay_Toggle();
        for (volatile int i = 0; i < 1000000; i++);
    }
}

9. 总结

本文详细介绍了通过寄存器方式和异或运算符对STM32的GPIO引脚进行取反操作的方法。通过这些方法,可以高效、灵活地控制GPIO引脚的状态,适用于多种嵌入式应用场景。以下是本文的要点总结:

  • GPIO引脚的基本概念和STM32的GPIO架构。
  • GPIO寄存器的功能和使用方法。
  • 异或运算符的基本原理及其在GPIO引脚取反中的应用。
  • 通过具体示例演示如何实现GPIO引脚的取反操作。

通过掌握这些内容,可以更好地理解和应用STM32的GPIO控制,为嵌入式系统开发打下坚实的基础。

附录:常用GPIO宏定义

#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 */

10. 结束语

  1. 本节内容已经全部介绍完毕,希望通过这篇文章,大家对 STM32IO 口取反有了更深入的理解和认识。
  2. 感谢各位的阅读和支持,如果觉得这篇文章对你有帮助,请不要吝惜你的点赞和评论,这对我们非常重要。再次感谢大家的关注和支持!点我关注❤️

相关文章:

  • 指针的神秘探险:从入门到精通的奇幻之旅 !

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

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

相关文章

大数据面试SQL(三):每分钟在线直播人数

文章目录 每分钟在线直播人数 一、题目 二、分析 三、SQL实战 四、样例数据参考 每分钟在线直播人数 一、题目 有如下数据记录直播平台主播上播及下播时间&#xff0c;根据该数据计算出平台每分钟的在线直播人数。 这里用主播名称做统计&#xff0c;前提是主播名称唯一…

【初阶数据结构题目】16.用队列实现栈

用队列实现栈 点击链接答题 思路&#xff1a; 出栈&#xff1a;找不为空的队列&#xff0c;将size-1个数据导入到另一个队列中。 入栈&#xff1a;往不为空队列里面插入数据 取栈顶元素&#xff1a; 例如&#xff1a; 两个队列&#xff1a; Q1&#xff1a;1 2 3Q2&#xff1a;…

『大模型笔记』从API到Agent:万字长文洞悉LangChain工程化设计

『大模型笔记』从API到Agent&#xff1a;万字长文洞悉LangChain工程化设计 具体内容来自&#xff1a;从API到Agent&#xff1a;万字长文洞悉LangChain工程化设计

Spring源码解析(30)之AOP拦截链执行过程

一、前言 在上一节中我们介绍了AOP动态代理对象的创建过程&#xff0c;并且看到了Spring AOP在生成calllBacks的时候第一个拦截器就是&#xff1a;DynamicAdvisorInterceptor&#xff0c;所以我们通过代理对象执行对应的方法的时候就如跳入到这个拦截器中&#xff0c;接下来我们…

【RISC-V设计-07】- RISC-V处理器设计K0A之CSR

【RISC-V设计-07】- RISC-V处理器设计K0A之CSR 文章目录 【RISC-V设计-07】- RISC-V处理器设计K0A之CSR1.简介2.顶层设计3.端口说明4.寄存器说明5.代码设计6.总结 1.简介 控制和状态寄存器&#xff08;Control and Status Register&#xff0c;简称CSR&#xff09;是用于控制和…

使用历史版本比对法排查C++程序中的内存泄漏问题

目录 1、问题描述 2、使用Process Explorer实时查看程序的虚拟内存占用 2.1、对于内存泄漏问题&#xff0c;需要查看程序占用的虚拟内存 2.2、Windows任务管理器中看不到程序进程占用的虚拟内存&#xff0c;使用Process Explorer工具可以看到 2.3、通过Process Explorer工…

通世智库:姚力渟——第一次走进缓和医疗

2024年7月9日&#xff0c;我因工作原因&#xff0c;第一次以工作者的视角走进了位于北京市中心最具盛名的协和医院缓和医疗门诊&#xff0c;亲临现场去感受缓和医疗给患者及家属的贴心温暖和有益帮助。在此之前&#xff0c;我是一个惧怕医院&#xff0c;并时刻抱着能不去医院就…

Waterfox水狐浏览器:追求性能与隐私的64位网络探索者

大家好&#xff0c;今天电脑天空要为大家详细介绍一款基于Mozilla Firefox源代码开发的浏览器——Waterfox&#xff08;水狐浏览器&#xff09;。它专为64位系统优化&#xff0c;致力于提供更快速、更高效的浏览体验&#xff0c;并高度重视用户隐私保护。 主要特点 1. 高性能…

Stable Diffusion绘画 | 图生图-批量处理

批量处理中&#xff0c;对待处理图片的要求&#xff1a;宽高比一致 修改提示词后批量处理 调整参数&#xff1a; 确保宽高与原图一致增加一定的重绘幅度 调整提示词信息&#xff1a; 批量处理后&#xff0c;出图如下所示&#xff1a; 修改模型后批量处理 恢复提示词&#xf…

【数学建模】 多模数据与智能模型

文章目录 多模数据与智能模型1. 数字图像处理与计算机视觉1.1 数字图像的表示与处理1.1.1 认识OpenCV1.1.2 色彩学1.1.3 常见图像操作 1.2 数字图像的特征点1.2.1 Sobel算子1.2.2 Canny算子1.2.3 Harris角点检测1.2.4 ORB特征点检测 1.3 计算机视觉1.3.1 卷积神经网络1.3.2 YOL…

学习日志8.7--NGFW(Next Generation Firewall)下一代防火墙

目录 一、NGFW&#xff08;Next Generation Firewall&#xff09;下一代防火墙 二、防火墙CLI命令行配置 三、防火墙初始化Web登入 一、NGFW&#xff08;Next Generation Firewall&#xff09;下一代防火墙 防火墙是用来实现识别外部的安全流量&#xff0c;抵御外部的攻击流…

vue3+element-plus+flask 简易【工作日志本】小软件(过程超详细)

终于有时间继续学习技术了&#xff01;开发了一个简易的用于记录日常工作内容的小软件&#xff0c;权当学习和练手。功能如下&#xff1a;用户登录、日志内容的查、增、删、改以及导出。 开发环境&#xff1a; windows 10&#xff0c;mysql 8&#xff0c;Hbuilder X&#xff08…

Linux -- 进度条小程序

目录 一、缓冲区 二、回车与换行 三、进度条 1、版本一 2、版本二 在写小程序之前先来了解两个知识点 一、缓冲区 缓冲区(buffer)&#xff0c;它是内存空间的一部分。也就是说在内存空间中预留了一定的存储空间&#xff0c;这些存储空间用来缓冲输入或者输出的数据&#…

【eNSP模拟实验】交换机调整stp根端口和配置边缘端口

拓扑 关闭提示和设备重命名 将S1~S4交换机都做如下相关对应的配置 <Huawei>sys [Huawei]un in en [Huawei]sys S1 调整根端口 当前S3交换机生成树简要信息&#xff0c;其中e0/0/1是阻塞端口&#xff0c;e0/0/5是根端口。如何让e0/0/5变成阻塞端口&#xff0c;让e0/0/1…

【面试题】IDEA实现Debug远程调试Linux中的系统

有朋友面试时被问到&#xff0c;怎么远程调试部署在Linux中的系统&#xff1f;听到这个问题&#xff0c;那位朋友直接懵了&#xff0c;第一反应是震惊&#xff0c;已经部署在Linux中的系统还能调试&#xff1f; 沉默了几秒&#xff0c;只好说没有远程调试过Linux中的系统&#…

Debian 12 Linux系统安装Mongodb服务器步骤

在本地或云中运行的 Debian12 或 11 Linux 发行版上设置 MongoDB 数据库服务器并不是一件困难的事情&#xff0c;但是&#xff0c;必须知道如何使用终端和 Linux 命令行。虽然 MongoDB 除了社区版之外还提供了企业版&#xff0c;但在这里我们将使用这个免费的开源 NoSQL 文档数…

Spring基础知识学习总结(四)

&#xff08;5&#xff09;Spring新注解 使用上面的注解还不能全部替代xml配置文件&#xff0c;还需要使用注解替代的配置如下&#xff1a; 非自定义的Bean的配置&#xff1a;<bean>加载properties文件的配置&#xff1a;<context:property-placeholder>组件扫描…

Linux 文件、重定向、缓冲区

个人主页&#xff1a;仍有未知等待探索-CSDN博客 专题分栏&#xff1a; Linux 目录 一、文件 1、文件的理解&#xff08;浅层&#xff09; 1.文件是什么&#xff1f; 2.文件操作的前提 3.文件的存储 4.一个进程可以打开多个文件吗&#xff1f;如果可以怎么管理的&#xf…

【Android】网络技术知识总结之WebView,HttpURLConnection,OKHttp,XML的pull解析方式

文章目录 webView使用步骤示例 HttpURLConnection使用步骤示例GET请求POST请求 okHttp使用步骤1. 添加依赖2. 创建OkHttpClient实例3. 创建Request对象构建请求4. 发送请求5. 获取响应 Pull解析方式1. 准备XML数据2. 创建数据类3. 使用Pull解析器解析XML webView WebView 是 An…

三大浏览器Google Chrome、Edge、Firefox内存占用对比

问题 Chrome、Edg、Firefox三家究竟谁的占用少 结论 打开一个页面内存占用 Firefox>Edge>Chrome 打开打量页面内存占用 Firefox>Chrome>Edge 从监视器可以看到Edge增加一个页面增加一个页面不到100M而其它浏览器需要150M左右;Firefox浏览器主线程内存占用800M比…