构建库函数雏形(以GPIO为例)

news2024/9/28 21:20:51


寄存器 ⇒ 固件库 \textbf{寄存器}\Rightarrow\textbf{固件库} 寄存器固件库

进行外设结构体定义

将之前中的头文件重新定义:


/*片上外设基地址  */
#define PERIPH_BASE           ((unsigned int)0x40000000)                          

/*总线基地址 */
#define AHB1PERIPH_BASE       (PERIPH_BASE + 0x00020000)	

/*GPIO外设基地址*/
#define GPIOF_BASE            (AHB1PERIPH_BASE + 0x1400)


/*RCC外设基地址*/
#define RCC_BASE              (AHB1PERIPH_BASE + 0x3800)

/*RCC的AHB1时钟使能寄存器地址,强制转换成指针*/
#define RCC_AHB1ENR				*(unsigned int*)(RCC_BASE+0x30)



/* 外设结构体定义 */
typedef  unsigned int uint32;
typedef  unsigned int uint16;

typedef struct{
	uint32 MODER;
	uint32 OTYPER;
	uint32 OSPEEDR;
	uint32 PUPDR;
	uint32 IDR;
	uint32 ODR;
	uint16 BSRRH;
	uint16 BSRRL;
	uint32 LCKR;
	uint32 AFRL;
	uint32 AFRH;
}GPIO_TYPEDEF;

#define GPIOF ((GPIO_TYPEDEF*)GPIOF_BASE) //将GPIOF定义为GPIO_TYPEDEF类型的GPIO_BASE

构建置位和复位函数

在嵌入式系统中,BSRRLBSRRH 是用于设置和复位特定引脚的寄存器位。这两个寄存器通常用于直接操作微控制器上的GPIO(General Purpose Input/Output)引脚。

  • BSRRL(Bit Set Register High/Low):用于将指定的引脚置位(设置为高电平)。通过写入1到 BSRRL 寄存器的特定位,相应引脚将被设置为高电平。

  • BSRRH(Bit Reset Register High/Low):用于将指定的引脚复位(设置为低电平)。通过写入1到 BSRRH 寄存器的特定位,相应引脚将被设置为低电平。

 /*
  *函数功能:设置引脚为高电平
  *参数说明:GPIOx,该参数为GPIO_TypeDef类型的指针,指向GPIO端口的地址
  * 			  GPIO_Pin:选择要设置的GPIO端口引脚,可输入宏GPIO_Pin_0-15,
	*										表示GPIOx端口的0-15号引脚。
  */
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
	/*设置GPIOx端口BSRRL寄存器的第GPIO_Pin位,使其输出高电平*/
	/*因为BSRR寄存器写0不影响,
	  GPIO_Pin只是对应位为1,其它位均为0,所以可以直接赋值*/
	
  GPIOx->BSRRL = GPIO_Pin;
}

 /*
  *函数功能:设置引脚为低电平
  *参数说明:GPIOx,该参数为GPIO_TypeDef类型的指针,指向GPIO端口的地址
  * 			  GPIO_Pin:选择要设置的GPIO端口引脚,可输入宏GPIO_Pin_0-15,
	*										表示GPIOx端口的0-15号引脚。
  */
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
	/*设置GPIOx端口BSRRH寄存器的第GPIO_Pin位,使其输出低电平*/
	/*因为BSRR寄存器写0不影响,
	GPIO_Pin只是对应位为1,其它位均为0,所以可以直接赋值*/
	
  GPIOx->BSRRH = GPIO_Pin;
}

进行库函数的自定义

step   I: \textbf{step I:} step I 对端口进行输出数据类型枚举
/* GPIO端口配置模式的枚举定义 */   
typedef enum{ 
  GPIO_Mode_IN   = 0x00, /*!< 输入模式 */
  GPIO_Mode_OUT  = 0x01, /*!< 输出模式 */
  GPIO_Mode_AF   = 0x02, /*!< 复用模式 */
  GPIO_Mode_AN   = 0x03  /*!< 模拟模式 */
}GPIOMode_TypeDef;

/* GPIO输出类型枚举定义 */  
typedef enum{ 
  GPIO_OType_PP = 0x00,	/*!< 推挽模式 */
  GPIO_OType_OD = 0x01	/*!< 开漏模式 */
}GPIOOType_TypeDef;


/* GPIO输出速率枚举定义 */  
typedef enum{ 
  GPIO_Speed_2MHz   = 0x00, /*!< 2MHz   */
  GPIO_Speed_25MHz  = 0x01, /*!< 25MHz  */
  GPIO_Speed_50MHz  = 0x02, /*!< 50MHz  */
  GPIO_Speed_100MHz = 0x03  /*!< 100MHz */
}GPIOSpeed_TypeDef;

/* GPIO上/下拉配置枚举定义 */ 
typedef enum{ 
  GPIO_PuPd_NOPULL = 0x00, /*浮空*/
  GPIO_PuPd_UP     = 0x01, /*上拉*/
  GPIO_PuPd_DOWN   = 0x02  /*下拉*/
}GPIOPuPd_TypeDef;
step   II: \textbf{step II:} step II对端口进行结构化描述
/* GPIO初始化结构体类型定义 */ 
typedef struct {
  uint32_t GPIO_Pin;              /*!< 选择要配置的GPIO引脚
                                        可输入 GPIO_Pin_ 定义的宏 */

  GPIOMode_TypeDef GPIO_Mode;     /*!< 选择GPIO引脚的工作模式
                                       可输入 GPIOMode_TypeDef 定义的枚举值*/

  GPIOSpeed_TypeDef GPIO_Speed;   /*!< 选择GPIO引脚的速率
                                       可输入 GPIOSpeed_TypeDef 定义的枚举值 */

  GPIOOType_TypeDef GPIO_OType;   /*!< 选择GPIO引脚输出类型
                                       可输入 GPIOOType_TypeDef 定义的枚举值*/

  GPIOPuPd_TypeDef GPIO_PuPd;     /*!<选择GPIO引脚的上/下拉模式
                                       可输入 GPIOPuPd_TypeDef 定义的枚举值*/
}GPIO_InitTypeDef;
step   III: \textbf{step III:} step III例化GPIO口

实验实例

main.c部分
闪烁红灯一段时间后闪烁绿灯

#include "stm32f4xx_gpio.h"  

//简单的延时函数,让cpu执行无意义指令,消耗时间
//具体延时时间难以计算,以后我们可使用定时器精确延时
void Delay( uint32_t nCount)	 
{
	for(; nCount != 0; nCount--);
}


int main(void)
{	
	GPIO_InitTypeDef GPIO_InitStruct;
	
	/*开启 GPIOF 时钟,使用外设时都要先开启它的时钟*/
	RCC->AHB1ENR |= (1<<5);

	/* LED 端口初始化 */
	
	/*初始化PF6引脚*/
	/*选择要控制的GPIO引脚*/															   
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;
	/*设置引脚模式为输出模式*/
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
	/*设置引脚的输出类型为推挽输出*/
	GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
	/*设置引脚为上拉模式*/
	GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
	/*设置引脚速率为2MHz */   
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
	/*调用库函数,使用上面配置的GPIO_InitStructure初始化GPIO*/
	GPIO_Init(GPIOF, &GPIO_InitStruct);	

	/*使引脚输出低电平,点亮LED1*/
	GPIO_ResetBits(GPIOF,GPIO_Pin_6);

	/*延时一段时间*/
	Delay(0xFFFFFF);	
	
	/*使引脚输出高电平,关闭LED1*/
	GPIO_SetBits(GPIOF,GPIO_Pin_6);
	
	/*初始化PF7引脚*/
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7;
	GPIO_Init(GPIOF,&GPIO_InitStruct);
	
	/*使引脚输出低电平,点亮LED2*/
	GPIO_ResetBits(GPIOF,GPIO_Pin_7);

}

// 函数为空,目的是为了骗过编译器不报错
void SystemInit(void){	
}

stm32f4xx_gpio.h部分



#include "stm32f4xx.h"


/*GPIO引脚号定义*/
#define GPIO_Pin_0                 ((uint16_t)0x0001)  /*!< 选择Pin0 (1<<0) */
#define GPIO_Pin_1                 ((uint16_t)0x0002)  /*!< 选择Pin1 (1<<1)*/
#define GPIO_Pin_2                 ((uint16_t)0x0004)  /*!< 选择Pin2 (1<<2)*/
#define GPIO_Pin_3                 ((uint16_t)0x0008)  /*!< 选择Pin3 (1<<3)*/
#define GPIO_Pin_4                 ((uint16_t)0x0010)  /*!< 选择Pin4 */
#define GPIO_Pin_5                 ((uint16_t)0x0020)  /*!< 选择Pin5 */
#define GPIO_Pin_6                 ((uint16_t)0x0040)  /*!< 选择Pin6 */
#define GPIO_Pin_7                 ((uint16_t)0x0080)  /*!< 选择Pin7 */
#define GPIO_Pin_8                 ((uint16_t)0x0100)  /*!< 选择Pin8 */
#define GPIO_Pin_9                 ((uint16_t)0x0200)  /*!< 选择Pin9 */
#define GPIO_Pin_10                ((uint16_t)0x0400)  /*!< 选择Pin10 */
#define GPIO_Pin_11                ((uint16_t)0x0800)  /*!< 选择Pin11 */
#define GPIO_Pin_12                ((uint16_t)0x1000)  /*!< 选择Pin12 */
#define GPIO_Pin_13                ((uint16_t)0x2000)  /*!< 选择Pin13 */
#define GPIO_Pin_14                ((uint16_t)0x4000)  /*!< 选择Pin14 */
#define GPIO_Pin_15                ((uint16_t)0x8000)  /*!< 选择Pin15 */
#define GPIO_Pin_All               ((uint16_t)0xFFFF)  /*!< 选择全部引脚 */




/** 
  * GPIO端口配置模式的枚举定义
  */   
typedef enum
{ 
  GPIO_Mode_IN   = 0x00, /*!< 输入模式 */
  GPIO_Mode_OUT  = 0x01, /*!< 输出模式 */
  GPIO_Mode_AF   = 0x02, /*!< 复用模式 */
  GPIO_Mode_AN   = 0x03  /*!< 模拟模式 */
}GPIOMode_TypeDef;

/** 
  * GPIO输出类型枚举定义
  */  
typedef enum
{ 
  GPIO_OType_PP = 0x00,	/*!< 推挽模式 */
  GPIO_OType_OD = 0x01	/*!< 开漏模式 */
}GPIOOType_TypeDef;


/** 
  * GPIO输出速率枚举定义
  */  
typedef enum
{ 
  GPIO_Speed_2MHz   = 0x00, /*!< 2MHz   */
  GPIO_Speed_25MHz  = 0x01, /*!< 25MHz  */
  GPIO_Speed_50MHz  = 0x02, /*!< 50MHz  */
  GPIO_Speed_100MHz = 0x03  /*!<100MHz  */
}GPIOSpeed_TypeDef;


  

/** 
  *GPIO上/下拉配置枚举定义
  */ 
typedef enum
{ 
  GPIO_PuPd_NOPULL = 0x00,/*浮空*/
  GPIO_PuPd_UP     = 0x01, /*上拉*/
  GPIO_PuPd_DOWN   = 0x02  /*下拉*/
}GPIOPuPd_TypeDef;



/** 
  * GPIO初始化结构体类型定义
  */ 
typedef struct 
{
  uint32_t GPIO_Pin;              /*!< 选择要配置的GPIO引脚
                                        可输入 GPIO_Pin_ 定义的宏 */

  GPIOMode_TypeDef GPIO_Mode;     /*!< 选择GPIO引脚的工作模式
                                       可输入 GPIOMode_TypeDef 定义的枚举值*/

  GPIOSpeed_TypeDef GPIO_Speed;   /*!< 选择GPIO引脚的速率
                                       可输入 GPIOSpeed_TypeDef 定义的枚举值 */

  GPIOOType_TypeDef GPIO_OType;   /*!< 选择GPIO引脚输出类型
                                       可输入 GPIOOType_TypeDef 定义的枚举值*/

  GPIOPuPd_TypeDef GPIO_PuPd;     /*!<选择GPIO引脚的上/下拉模式
                                       可输入 GPIOPuPd_TypeDef 定义的枚举值*/
}GPIO_InitTypeDef;



void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);

stm32f4xx_gpio.c部分

#include "stm32f4xx_gpio.h"

/**
  *函数功能:设置引脚为高电平
  *参数说明:GPIOx,该参数为GPIO_TypeDef类型的指针,指向GPIO端口的地址
  * 			  GPIO_Pin:选择要设置的GPIO端口引脚,可输入宏GPIO_Pin_0-15,
	*										表示GPIOx端口的0-15号引脚。
  */
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
	/*设置GPIOx端口BSRRL寄存器的第GPIO_Pin位,使其输出高电平*/
	/*因为BSRR寄存器写0不影响,
	  GPIO_Pin只是对应位为1,其它位均为0,所以可以直接赋值*/
	
  GPIOx->BSRRL = GPIO_Pin;
}

/**
  *函数功能:设置引脚为低电平
  *参数说明:GPIOx,该参数为GPIO_TypeDef类型的指针,指向GPIO端口的地址
  * 			  GPIO_Pin:选择要设置的GPIO端口引脚,可输入宏GPIO_Pin_0-15,
	*										表示GPIOx端口的0-15号引脚。
  */
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
	/*设置GPIOx端口BSRRH寄存器的第GPIO_Pin位,使其输出低电平*/
	/*因为BSRR寄存器写0不影响,
	GPIO_Pin只是对应位为1,其它位均为0,所以可以直接赋值*/
	
  GPIOx->BSRRH = GPIO_Pin;
}

/**
  *函数功能:初始化引脚模式
  *参数说明:GPIOx,该参数为GPIO_TypeDef类型的指针,指向GPIO端口的地址
  * 			  GPIO_InitTypeDef:GPIO_InitTypeDef结构体指针,指向初始化变量
  */
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
{
	  uint32_t pinpos = 0x00, pos = 0x00 , currentpin = 0x00;
	
	/*-- GPIO Mode Configuration --*/
  for (pinpos = 0x00; pinpos < 16; pinpos++)
  {
		/*以下运算是为了通过 GPIO_InitStruct->GPIO_Pin 算出引脚号0-15*/
		
		/*经过运算后pos的pinpos位为1,其余为0,与GPIO_Pin_x宏对应。pinpos变量每次循环加1,*/
		pos = ((uint32_t)0x01) << pinpos;
   
		/* pos与GPIO_InitStruct->GPIO_Pin做 & 运算,若运算结果currentpin == pos,
		则表示GPIO_InitStruct->GPIO_Pin的pinpos位也为1,
		从而可知pinpos就是GPIO_InitStruct->GPIO_Pin对应的引脚号:0-15*/
    currentpin = (GPIO_InitStruct->GPIO_Pin) & pos;

		/*currentpin == pos时执行初始化*/
    if (currentpin == pos)
		{		
			/*GPIOx端口,MODER寄存器的GPIO_InitStruct->GPIO_Pin对应的引脚,MODER位清空*/
			GPIOx->MODER  &= ~(3 << (2 *pinpos));
		
			/*GPIOx端口,MODER寄存器的GPIO_Pin引脚,MODER位设置"输入/输出/复用输出/模拟"模式*/
			GPIOx->MODER |= (((uint32_t)GPIO_InitStruct->GPIO_Mode) << (2 *pinpos));

			/*GPIOx端口,PUPDR寄存器的GPIO_Pin引脚,PUPDR位清空*/
			GPIOx->PUPDR &= ~(3 << ((2 *pinpos)));
		
			/*GPIOx端口,PUPDR寄存器的GPIO_Pin引脚,PUPDR位设置"上/下拉"模式*/
			GPIOx->PUPDR |= (((uint32_t)GPIO_InitStruct->GPIO_PuPd) << (2 *pinpos));		
		
			/*若模式为"输出/复用输出"模式,则设置速度与输出类型*/
			if ((GPIO_InitStruct->GPIO_Mode == GPIO_Mode_OUT) || (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_AF))
			{
				/*GPIOx端口,OSPEEDR寄存器的GPIO_Pin引脚,OSPEEDR位清空*/
				GPIOx->OSPEEDR &= ~(3 << (2 *pinpos));
				/*GPIOx端口,OSPEEDR寄存器的GPIO_Pin引脚,OSPEEDR位设置输出速度*/
				GPIOx->OSPEEDR |= ((uint32_t)(GPIO_InitStruct->GPIO_Speed) << (2 *pinpos));

				/*GPIOx端口,OTYPER寄存器的GPIO_Pin引脚,OTYPER位清空*/
				GPIOx->OTYPER  &= ~(1 << (pinpos)) ;
				/*GPIOx端口,OTYPER位寄存器的GPIO_Pin引脚,OTYPER位设置"推挽/开漏"输出类型*/
				GPIOx->OTYPER |= (uint16_t)(((uint16_t)GPIO_InitStruct->GPIO_OType) << (pinpos));
			}
		}
	}
}

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

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

相关文章

k8s---helm

Helm是什么&#xff1f; 在没有helm之前。部署一个服务&#xff0c;需要deployment、service、ingress、挂在卷等等相关配置都需要人工来配置。 helm的作用就是通过打包的方式&#xff0c;把需要人工编写的配置集成在一起。是一键式的部署服务。类似于yum功能。 由官方提供的…

通过Android Logcat分析firebase崩溃

参考&#xff1a;UnityIL2CPP包Crash闪退利用Android Logcat还原符号表堆栈日志 - 简书 一、安装Android Logcat插件 1、新建空白unity工程&#xff0c;打开PackageManager窗口&#xff0c;菜单栏Window/PackageManager 2、PackageManager中安装Android Logcat日志工具 3、安…

Leetcode1143. 最长公共子序列

解题思路 求两个数组或者字符串的最长公共子序列问题&#xff0c;肯定是要用动态规划的。下面的题解并不难&#xff0c;你肯定能看懂。 首先&#xff0c;区分两个概念&#xff1a;子序列可以是不连续的&#xff1b;子数组&#xff08;子字符串&#xff09;需要是连续的&#xf…

威联通QNAP NAS结合cpolar内网穿透实现公网远程访问NAS中存储的文件

文章目录 推荐 前言1. 威联通安装cpolar内网穿透2. 内网穿透2.1 创建隧道2.2 测试公网远程访问 3. 配置固定二级子域名3.1 保留二级子域名3.2 配置二级子域名 4. 使用固定二级子域名远程访问 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣…

蓝桥杯备赛 week 3 —— 高精度(C/C++,零基础,配图)

目录 &#x1f308;前言&#xff1a; &#x1f4c1; 高精度的概念 &#x1f4c1; 高精度加法和其模板 &#x1f4c1; 高精度减法和其模板 &#x1f4c1; 高精度乘法和其模板 &#x1f4c1; 高精度除法和其模板 &#x1f4c1; 总结 &#x1f308;前言&#xff1a; 这篇文…

WinSCP下载安装并实现远程SSH本地服务器上传文件

文章目录 1. 简介2. 软件下载安装&#xff1a;3. SSH链接服务器4. WinSCP使用公网TCP地址链接本地服务器5. WinSCP使用固定公网TCP地址访问服务器 1. 简介 ​ Winscp是一个支持SSH(Secure SHell)的可视化SCP(Secure Copy)文件传输软件&#xff0c;它的主要功能是在本地与远程计…

中仕教育:公务员省考和国考分别是什么时候?

1. 国考&#xff1a;国考时间基本上是固定的。报名时间一般在每年的10月中下旬&#xff0c;考试时间在11月下旬或12月上旬&#xff0c;面试时间在次年的2—3月。 2. 省考&#xff1a;大部分省份集中在3月至5月&#xff0c;部分省份还会有春秋两次考试。 省考和国考能都报名吗…

Obsidian笔记软件结合cpolar实现安卓移动端远程本地群晖WebDAV数据同步

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

C#,最小生成树(MST)博鲁夫卡(Boruvka)算法的源代码

Otakar Boruvka 本文给出Boruvka算法的C#实现源代码。 Boruvka算法用于查找边加权图的最小生成树&#xff08;MST&#xff09;&#xff0c;它早于Prim和Kruskal的算法&#xff0c;但仍然可以被认为是两者的关联。 一、Boruvka算法的历史 1926年&#xff0c;奥塔卡博鲁夫卡&…

【Flink-1.17-教程】-【四】Flink DataStream API(1)源算子(Source)

【Flink-1.17-教程】-【四】Flink DataStream API&#xff08;1&#xff09;源算子&#xff08;Source&#xff09; 1&#xff09;执行环境&#xff08;Execution Environment&#xff09;1.1.创建执行环境1.2.执行模式&#xff08;Execution Mode&#xff09;1.3.触发程序执行…

米贸搜|Meta广告中级水准:Facebook自动完成四项广告设置,改善投放成效!

广告投放中的机器学习预算自动分配版位自动分配受众自动分配创意灵活调整 一、广告投放中的机器学习 机器学习现已成为数字营销的基础&#xff0c;能够帮助我们面向想要触达的受众投放与之相关的广告。随着我们对如何使用机器学习的了解加深&#xff0c;我们对“如何创建广告…

眼镜清洗机是智商说吗?适合清洗眼镜的超声波清洗机推荐

随着现代生活步伐的加快&#xff0c;对于家居清洁的需求也日益增长。在这个背景下&#xff0c;超声波清洗机成为了现代家庭清洁的好帮手。有的朋友会认识超声波清洗机洗眼镜是智商税&#xff01;其实只要是用过超声波清洗机都知道这不是智商税&#xff0c;眼镜店老板每天用来清…

程序员如何保持身心健康

程序员要保持身心健康&#xff0c;可以注意以下几个方面&#xff1a; 饮食健康&#xff1a;保持均衡的饮食&#xff0c;多吃蔬菜水果&#xff0c;减少油腻和高热量食物的摄入。同时&#xff0c;适当饮水&#xff0c;避免因长时间坐着工作而导致的脱水。尽量不要吃街边摊、大排…

postgresql12表膨胀解决(不锁表)

查看所有数据库占用磁盘空间 SELECTpg_database.datname AS "数据库名称",pg_size_pretty(pg_database_size(pg_database.datname)) AS "磁盘占用空间" FROMpg_database;发现有个数据库占用空间过大 查询库中所有表占用空间 SELECTtable_name,pg_size_…

Chatgpt的崛起之路

Chatgpt的崛起之路 背景与发展历程背景发展历程 技术原理第一阶段&#xff1a;训练监督策略模型第二阶段&#xff1a;训练奖励模型第三阶段&#xff1a;采用强化学习来增强模型的能力。 国内使用情况及应用的领域面临的数据安全挑战与建议ChatGPT获取数据产生的问题数据泄露问题…

【学网攻】 第(8)节 -- 端口安全

文章目录 【学网攻】 第(1)节 -- 认识网络【学网攻】 第(2)节 -- 交换机认识及使用【学网攻】 第(3)节 -- 交换机配置聚合端口【学网攻】 第(4)节 -- 交换机划分Vlan【学网攻】 第(5)节 -- Cisco VTP的使用​​​​​​【学网攻】 第(6)节 -- 三层交换机实现VLAN间路由【学网攻…

docker 部署springboot项目

新建Dockerfile ## AdoptOpenJDK 停止发布 OpenJDK 二进制&#xff0c;而 Eclipse Temurin 是它的延伸&#xff0c;提供更好的稳定性 ## 感谢复旦核博士的建议&#xff01;灰子哥&#xff0c;牛皮&#xff01; FROM eclipse-temurin:8-jre## 将后端项目的 Jar 文件&#xff0c…

念念不忘智能编程,必有回响CodeArts Snap

开发者的碎碎念 之前在【我与ModelArts的故事】的文章里&#xff0c;分享过我学习新技术的经历&#xff0c;主要有&#xff1a; 自主学习&#xff0c;比如自学Python&#xff1b;借助华为云的产品边用边学。 在围着"编程学习"这座城池&#xff0c;外围来来回回转了…

springboot126疫情下图书馆管理系统

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的疫情下图书馆管理系统 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章…

帕金森既然不是癌症,但又为什么令患者非常的痛苦呢?

帕金森病是一种慢性、进行性的神经系统退行性疾病&#xff0c;主要影响到大脑中负责协调和控制运动的神经元。帕金森病的主要症状包括肢体僵硬、震颤、运动迟缓以及平衡障碍等&#xff0c;给患者的生活和工作带来了很大的困扰和痛苦。 帕金森病的肢体僵硬和运动迟缓是最常见的…