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


寄存器 ⇒ 固件库 \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.mzph.cn/news/638749.shtml

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

相关文章

线性代数的学习和整理23:用EXCEL和python 计算向量/矩阵的:内积/点积,外积/叉积

目录 1 乘法 1.1 标量乘法(中小学乘法) 1.1.1 乘法的定义 1.1.2 乘法符合的规律 1.2 向量乘法 1.2.1 向量&#xff1a;有方向和大小的对象 1.2.2 向量的标量乘法 1.2.3 常见的向量乘法及结果 1.2.4 向量的其他乘法及结果 1.2.5 向量的模长&#xff08;长度&#xff0…

第三篇【传奇开心果系列】Vant开发移动应用:财务管理应用

传奇开心果博文系列 系列博文目录Vant开发移动应用系列博文 博文目录一、项目目标二、编程思路三、初步实现示例代码四、扩展思路五、使用Firebase等后端服务来实现用户认证和数据存储示例代码六、用Vant组件库实现收入和支出分类管理的示例代码七、用Vant组件库实现收入和支出…

Redis经典五大类型源码及底层实现

Redis经典五大类型源码及底层实现分析 1、一些题目 redis的zset底层实现&#xff1f;redis的跳表和压缩列表说一下&#xff0c;解决了哪些问题&#xff0c;时间复杂度和空间复杂度如何&#xff1f;redis的zset使用的是什么数据结构&#xff1f; Redis数据类型的底层数据结构…

《WebKit 技术内幕》之五(1): HTML解释器和DOM 模型

第五章 HTML 解释器和 DOM 模型 1.DOM 模型 1.1 DOM标准 DOM &#xff08;Document Object Model&#xff09;的全称是文档对象模型&#xff0c;它可以以一种独立于平台和语言的方式访问和修改一个文档的内容和结构。这里的文档可以是 HTML 文档、XML 文档或者 XHTML 文档。D…

python基本数据类型 - 字典集合

引入 在内存中存储的数据可以是不同的数据类型。比如名字可以使用字符串存储&#xff0c;年龄可以使用数字存储&#xff0c;python有6种基本数据类型&#xff0c;用于各种数据的存储&#xff0c;分别是&#xff1a;numbers(数字类型)、string(字符串)、List(列表)、Tuple(元组…

【笔记】Blender4.0建模入门-3物体的基本操作

Blender入门 ——邵发 3.1 物体的移动 演示&#xff1a; 1、选中一个物体 2、选中移动工具 3、移动 - 沿坐标轴移动 - 在坐标平面内移动 - 自由移动&#xff08;不好控制&#xff09; 选中物体&#xff1a;右上的大纲窗口&#xff0c;点击物体名称&#xff0c;物体的轮…

文件操作(上)

目录 文件的必要性&#xff1a; 文件分类&#xff1a; 程序文件&#xff1a; 数据文件&#xff1a; 文件的打开与关闭&#xff1a; fopen函数分析: ​编辑 FILE*: char*filename: char*mode: fclose函数&#xff1a; 应用&#xff1a; 文件编译 Fgetc Fputc 应用…

HNU-数据挖掘-作业1

数据挖掘课程作业作业1 计科210X 甘晴void 202108010XXX 第一题 假设所分析的数据包括属性 age,它在数据元组中的值&#xff08;以递增序&#xff09;为13 ,15 ,16 ,16 ,19 ,20 ,20 ,21 ,22 ,22 ,25 ,25 ,25 ,25 ,30 ,33 ,33 ,35 ,35 ,35 ,35 ,36 ,40 ,45 ,46 ,52,70。 a.…

基于Unity平台开发Vision Pro应用

VisionOS是苹果最新空间计算设备Vision Pro的操作系统。Unity开发人员可以利用现有的3D场景 以及为 visionOS 构建游戏或应用程序的资产。有关 visionOS 的更多信息&#xff0c;请参阅 Apple 的 visionOS 概述。 visionOS提供了几种不同的显示应用程序的模式&#xff1a;Windo…

【网站项目】基于SSM的274办公自动化管理系统

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

JVM系列-1.初识JVM

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring原理、JUC原理、Kafka原理、分布式技术原理、数据库技术、JVM原理&#x1f525;如果感觉博主的文…

异或运算的骚操作,由浅入深拿捏一类型的题

文章目录 &#x1f680;前言&#x1f680;异或运算的基本用法&#x1f680;一组数中一种数出现了奇数次&#xff0c;其他种数出现了偶数次&#xff0c;找出这个数&#x1f680;一组数中有两种数出现了奇数次&#xff0c;其他种数出现了偶数次&#xff0c;求这两个数✈️得到一个…

Spring Boot3.2.2整合MyBatis Plus3.5.5

目录 1.前置条件 2.导坐标 3.配置数据源 4.配置mapper扫描路径 5.MyBatis Plus代码生成器整合 1.导坐标 2.编写代码生成逻辑 1.前置条件 已经初始化好一个spring boot项目且版本为3X&#xff0c;项目可正常启动 2.导坐标 <dependency><groupId>com.baomid…

弹性调度助力企业灵活应对业务变化,高效管理云上资源

作者&#xff1a;吴昆 什么是弹性调度 云计算时代&#xff0c;企业可以通过云平台获得大量计算资源&#xff0c;并根据业务发展和流量需求的实时变化&#xff0c;灵活调整使用的资源类型与资源量。阿里云提供了多种弹性资源&#xff0c;如云服务器 ECS 和弹性容器实例 ECI&am…

基于 Spring Boot+MySQL实现的在线考试系统源码+数据库,基于不同类型的客观题,进行自动组卷、批卷等功能的考试系统

1. 部署相关 1.1. 介绍 一个 JAVA 实现的在线考试系统,主要实现一套基于不同类型的客观题,进行自动组卷、批卷等功能的考试系统&#xff08;没有主观题&#xff09; 1.2. 系统架构 后端技术栈基于 Spring Boot数据库MySQLORMMyBatis & MyBatis-plus缓存Redis、guava的L…

【Java网络编程02】套接字编程

【Java网络编程02】套接字编程 1. Socket套接字 概念&#xff1a;Socket套接字&#xff0c;就是系统提供用于实现网络通信的技术&#xff0c;是基于TCP/IP协议的网络通信基本操作单元。基于Socket套接字的网络程序开发就是网络编程。 分类&#xff1a; 我们可以把Socket套接字…

docker 部署 sentinel

docker 部署 sentinel 环境安装 拉取镜像 目前稳定的版本是1.8.0 docker pull bladex/sentinel-dashboard:1.8.0启动服务 docker run --name sentinel -p 8858:8858 -td bladex/sentinel-dashboard:1.8.0登录 登录的时候账号和密码都是sentinel

算法训练营Day45

#Java #动态规划 Feeling and experiences&#xff1a; 最长公共子序列&#xff1a;力扣题目链接 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新…

泛型..

1.泛型 所谓泛型 其实就是一种类型参数(我们平常所见到的参数指的就是方法中的参数 他接收有外界传递来的值 然后在方法中进行使用) 并且还提高了代码的复用率 何以见得提高了代码的复用率 其实就是通过对比使用了泛型技术和没有使用泛型技术之间的区别&#xff1a; 以下是没有…

windows如何切换访问NAS共享文件夹用户

从资源管理器对NAS共享文件夹输入用户名与密码进行访问后&#xff0c;想切换访问用户&#xff0c;搜索了一圈&#xff0c;网上介绍的方法都无效&#xff0c;最后只能注销windows7登陆&#xff0c;然后重新登陆&#xff0c;再访问NAS共享时才能切换用户&#xff0c;各位观众如有…