外设驱动库开发笔记3:AD527x系列数字电位器驱动

2023-11-01

在一些时候我们需要使用精度更高的数字电位器来实现我们的应用。我们经常使用AD527x系列数字电位器来实现这类应用。在通常情况下,AD527x系列数字电位器完全能够满足要求。为了减少重复工作,在这里我们将分系并实现AD527x系列数字电位器的驱动。

1、功能概述

我们在这里讨论的AD527x系列数字电位器包括:AD5270、AD5271、AD5272和AD5724,他们的功能是相同的,主要在数字位或通讯接口上有写差别。

AD527x系列数字电位器集业界领先的可变电阻性能与非易失性存储器(NVM)于一体,这些器件的端到端电阻容差误差小于1%,并提供50次可编程(50-TP)存储器。将电阻值编程写入50-TP存储器之前,可进行无限次调整。这些器件不需要任何外部电压源来帮助熔断熔丝,并提供50次永久编程的机会。在50-TP激活期间,一个永久熔断熔丝指令会将游标位置固定。

对于AD527x系列数字电位器,皆有一个16位宽的移位寄存器,一切对AD527x系列数字电位器的操作都是同过这个以为寄存器完成的。移位寄存器的格式如下所示。

该16位移位寄存器由两个应设为0的未用位、四个控制位和10个RDAC数据位组成,并且数据以MSB优先方式加载。对于AD5271和AD5274只有8位数据,则最后两位会被忽略。四个控制位决定软件命令的功能,具体的功能码如下所示:

我们对AD527x系列数字电位器的操作就是以这10个命令为基础的,事实上NOP命令是可以忽略的,因为它不会有任何操作发生。其中有命令5和命令7需要说一下。

命令7则用于设置控制寄存器。控制寄存器仅后4为有效。C0用于设置50-TP的编程使能。C1用于设置RDAC的写保护。C2用于电阻容差校准。C3则是指示50-TP的编程状态。具体结构如下:

而命令5用于设置读出的50-TP的内容。就是说这条命令用于设置我下次读取50-TP时究竟是那一条的类容,因为总共有50条。具体的取值如下:

共50条需要50个编码,使用了D0到DF5位,编号1开始一一对应50个编程位置。

2、驱动设计与实现

我们已经了解了AD527x系列数字电位器的基本情况,接下来我们就设计并实现AD527x系列数字电位器的驱动。 

2.1、对象定义

同样的我们将基于对象操作的思想来设计AD527x系列数字电位器的驱动。既如此,我们首先必须要定义AD527x系列数字电位器对象。

2.1.1、抽象对象类型

在抽象出AD527x系列数字电位器对象类型之前,我们先来分析一下AD527x系列数字电位器。一个对象最起码包含属性和操作两个特性,我们来分析一下AD527x系列数字电位器对象包含有那些属性和操作。

对于AD527x系列数字电位器包含有多种器件,不同的器件在通讯接口和档位等方面会有差别,所以我们将设备的类型作为其属性以分辩究竟是哪种器件,进而分辨接口和档位差异。游标的当前位置以及控制寄存器的值我们也将其设置为属性以确定设备当前的状态。当设备时I2C接口时,需要有一个设备地址,所以我们将设备地址设置为属性,这个属性只在I2C接口模式时才起作用。而在使用SPI接口的器件时,需要一个片选信号,所以我们将操作片选信号作为AD527x系列数字电位器的一个操作,这个操作只在使用SPI接口的器件时才起作用。此外,AD527x系列数字电位器对象还需要实现数据的发送与接收以及操作过程中必要的延时函数,我们均将其作为对象的操作。据上述分析我们可以抽象出AD527x系列数字电位器对象类型如下:

/*定义用于SPI接口的对象类型*/
typedef struct AD527xObject {
  AD527xType type; //设备类型
  uint8_t devAddress; //设备地址,用于I2C接口
  uint8_t conreg; //控制寄存器
  uint16_t rdac; //游标寄存器现值
  void (*ChipSelcet)(AD527xCSType en); //片选信号,用于SPI接口
  void (*Receive)(struct AD527xObject *rx,uint8_t *rData,uint16_t rSize);
  void (*Transmit)(struct AD527xObject *rx,uint8_t *wData,uint16_t wSize);
  void (*Delayms)(volatile uint32_t nTime);       //ms延时操作指针
}AD527xObjectType;

2.1.2、对象的初始化

一个对象我们需要对其初始化才能使用,初始化函数至少包含有2方面内容:一是为对象变量赋必要的初值;二是检查这些初值是否是有效的。特别是一些操作指针错误的话可能产生严重的后果。基于这一原则,我们设计AD527x系列数字电位器的对象初始化函数如下:

/* 初始化AD527x对象,I2C接口必须初始化devAddress,SPI接口必需初始化void (*ChipSelcet)(bool) */
void AD527xInitialization(AD527xObjectType *rx,
                          uint8_t address,
                          AD527xType type,
                          AD527xReceive recieve,
                          AD527xTransmit transmit,
                          AD527xChipSelcet cs,
                          AD527xDelayms delayms)
{
  if((rx==NULL)||(recieve==NULL)||(transmit==NULL)||(delayms==NULL))
  {
    return;
  }

  if((type==AD5270)||(type==AD5271)) //使用SPI接口
  {
    if(cs==NULL) //硬件电路实现片选
    {
      rx->ChipSelcet=DefaultChipSelcet;
    }
    else
    {
      rx->ChipSelcet=cs;
    }
    rx->devAddress=0x00;
  }
  else //使用I2C接口
  {
    if((address==0x58)||(address==0x5C)||(address==0x5E))
    {
      rx->devAddress=address;
    }
    else if((address==0x2C)||(address==0x2E)||(address==0x2F))
    {
      rx->devAddress=(address<<1);
    }
    else
    {
      rx->devAddress=0x00;
    }

    rx->ChipSelcet=NULL;
  }
  
  rx->type=type;

  rx->conreg=0x00;
  rx->rdac=0x0000;

  rx->Receive=recieve;
  rx->Transmit=transmit;
  rx->Delayms=delayms;

  ReadControlRegister(rx);

  SetSoftShutMode(rx,SOFT_NORMAL_MODE);
}

2.2、对象操作

前面我们已经描述过,对AD527x系列数字电位器的操作命令有9个。这9个命令皆是对寄存器进行读写操作的,所以我们这里将这些操作分为读寄存器操作和写寄存器操作,并以此设计驱动程序。

2.2.1、写寄存器操作

首先我们需要说明写寄存器操作是针对对象的操作函数,而不是对象变量包含的操作,因为我们只在对象变量中放入依赖于外界平台的基本操作。写寄存器操作会以回调的方式调用对象变量包含的基本操作。

因为AD527x系列数字电位器对象包括不同接口和不同档位的器件,所以我们设计写寄存器操作时需要考虑AD527x系列数字电位器对象的类型。而这个类型已在初始化时赋予了对象变量。据此我们设计写寄存器操作函数如下:

/* 写寄存器操作 */
static void AD527xWriteRegister(AD527xObjectType *rx,uint16_t cmd)
{
  uint8_t tData[2];

  tData[0]=(uint8_t)(cmd>>8);
  tData[1]=(uint8_t)cmd;

  if((rx->type==AD5270)||(rx->type==AD5271)) //SPI接口
  {
    rx->ChipSelcet(AD527xCS_ENABLE);
    rx->Delayms(1);
  }

  rx->Transmit(rx,tData,2);

  if((rx->type==AD5270)||(rx->type==AD5271)) //SPI接口
  {
    rx->Delayms(1);
    rx->ChipSelcet(AD527xCS_DISABLE);
  }
}

2.2.2、读寄存器操作

与写寄存器操作一样,读寄存器操作一样要考虑到AD527x系列数字电位器对象的类型。在使用SPI接口的对象类型种需要考虑片选信号的处理。我们设计读寄存器操作如下:

/* 读寄存器操作 */
static void AD527xReadRegister(AD527xObjectType *rx,uint16_t cmd,uint8_t *rData)
{
  uint8_t tData[2];

  if((rx->type==AD5270)||(rx->type==AD5271)) //SPI接口
  {
    rx->ChipSelcet(AD527xCS_ENABLE);
    rx->Delayms(1);
  }

  rx->Transmit(rx,tData,2);

  rx->Receive(rx,rData,2);

  if((rx->type==AD5270)||(rx->type==AD5271)) //SPI接口
  {
    rx->Delayms(1);
    rx->ChipSelcet(AD527xCS_DISABLE);
  }
}

2.2.3、面向命令的操作

我们已经实现了对继存存其的读操作和写操作,但我们并不想通过调用这两个函数并传递命令来实现我们的应用。所以我们将不同的操作命令所要完成的功能封装成函数,在这些函数中调用读写寄存器操作函数来完成。这样使用驱动就变得更为简便。例如我们设计读写RDAC的函数如下:

/* 设置AD527x游标位置 */
void SetRDACForAd527x(AD527xObjectType *rx,uint16_t data)
{
  uint16_t temp=0;
  
  if((rx->type==AD5271)||(rx->type==AD5274)) //256档
  {
    temp=data>255?255:data;
  }
  else if((rx->type==AD5270)||(rx->type==AD5272)) //1024档
  {
    temp=data>1023?1023:data;
  }

  temp=COMMAND_W_RDAC|temp;

  if(((rx->conreg)&0x02)!=0x02)
  {
    SetControlRegister(rx,PROGRAM_RDAC_ENABLE|rx->conreg);
  }

  AD527xWriteRegister(rx,temp);
}

/* 读取RDAC游标寄存器的内容 */
uint16_t ReadRDACFromAd527x(AD527xObjectType *rx)
{
  uint8_t rData[2];

  uint16_t cmd=COMMAND_R_RDAC;

  AD527xReadRegister(rx,cmd,rData);

  rx->rdac=(rData[0]<<8)+rData[1];
  
  return rx->rdac;
}

3、驱动的使用

我们已经实现了AD527x系列数字电位器的驱动。接下来我们来考虑如何使用这一驱动实现我们的应用。

3.1、声明并初始化对象

我们已经定义了AD527x系列数字电位器对象类型。所以我们先要使用对象类型声明一个AD527x系列数字电位器对象变量。形式如下:

AD527xObjectType ad527x;

当然,这里定义的这个对象变量还不能直接使用。我们需要使用初始化函数对这个对象变量进行初始化。初始化函数前面已经说过,传递的参数皆是与对象变量相关的。初始化函数的参数如下:

AD527xObjectType *rx,待初始化的对象变量。

uint8_t address,采用I2C接口通讯是的设备地址。

AD527xType type,对象的设备类型。

AD527xReceive recieve,数据接收函数指针。

AD527xTransmit transmit,数据发送函数指针。

AD527xChipSelcet cs,使用SPI接口通讯时,片选操作函数指针。

AD527xDelayms delayms,毫秒延时操作函数指针。

对于这些参数,对象变量我们已经定义了。对象类型根据实际器件输入即可。而设备地址在使用I2C接口时按要求输入即可,如果是SPI接口则任意uint8_t类型的值均可。最主要的是我们需要定义几个函数,并将函数指针作为参数。这几个函数的类型图下:

/*定义片选信号函数指针类型*/
typedef void (*AD527xChipSelcet)(AD527xCSType en);

/*定义接收数据函数指针类型*/
typedef void (*AD527xReceive)(struct AD527xObject *rx,uint8_t *rData,uint16_t rSize);

/*定义发送数据函数指针类型*/
typedef void (*AD527xTransmit)(struct AD527xObject *rx,uint8_t *wData,uint16_t wSize);

/*定义ms延时操作指针*/
typedef void (*AD527xDelayms)(volatile uint32_t nTime);

对于这几个函数我们根据样式定义就可以了,具体的操作可能与使用的硬件平台有关系。片选操作函数只在使用SPI接口是需要定义,否则可以传入NULL即可。具体函数定义如下:

/*定义片选信号函数*/
void AD527xCS(AD527xCSType en)
{
  if(AD527xCS_ENABLE==en)
  {
    HAL_GPIO_WritePin(GPIOF, GPIO_PIN_4, GPIO_PIN_RESET);
  }
  else
  {
    HAL_GPIO_WritePin(GPIOF, GPIO_PIN_4, GPIO_PIN_SET);
  }
}

/*定义接收数据函数*/
void AD527xReceiveData(struct AD527xObject *rx,uint8_t *rData,uint16_t rSize)
{
  HAL_SPI_Receive (&hspi, rData, rSize, 1000);
}

/*定义发送数据函数*/
void AD527xTransmitData(struct AD527xObject *rx,uint8_t *wData,uint16_t wSize)
{
  HAL_SPI_Transmit (&hspi, wData, wSize, 1000);
}

对于延时函数我们可以采用各种方法实现。我们曹勇的STM32平台和HAL库则可以直接使用HAL_Delay()函数。于是我们可以调用初始化函数如下:

AD527xInitialization(&ad527x,0x00,AD5270,AD527xReceiveData,AD527xTransmitData,AD527xCS,HAL_Delay);

这是使用SPI接口器件的初始化操作,使用I2C接口的初始化操作类似次操作即可。

3.2、基于对象进行操作

我们已经定义了对象变量并对其进行了初始化。接下来我们就要看看如何操作对象得到我们想要的结果。

我们在前面已经根据操作命令做了封装,所以我们需要什么养的功能只需要调用相应的函数就可以了。如我们想要设置RDAC为最大值则:

SetValueToAd5270(&ad527x,1023);

其中第1个参数为要操作的对象指针,第2个参数为要设置的游标位置值。

4、应用总结

我们已经实现AD527x系列数字电位器的驱动及基于此驱动的应用,得到了与我们预期一致的结果,说明驱动的设计时符合需求的。

在使用驱动时需注意,采用I2C接口的器件需要考虑设备地址的问题。设备地址由ADDR引脚的状态决定。由三种取值如下:

在使用驱动时需注意,采用SPI接口的器件需要考虑片选操作的问题。如果片选信号是通过硬件电路来实现的,我们在初始化时给其传递NULL值。如果是软件操作片选则传递我们编写的片选操作函数。

源码地址GitHub:https://github.com/foxclever/ExPeriphDriver

欢迎关注:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

外设驱动库开发笔记3:AD527x系列数字电位器驱动 的相关文章

  • 【RTD】AD7793驱动程序

    文章目录 1 前言2 AD7793驱动程序2 1 spi访问接口2 2 寄存器和常用配置值2 3 初始化2 4 原始数据获取2 5 阻值换算 3 使用4 完整工程代码 1 前言 前面文章主要描述AD7793分别与两线 三线 四线RTD连接电
  • 外设驱动库开发笔记6:AD719x系列ADC驱动

    前面我们讨论了AD7705这种ADC器件的驱动开发 在实际中我们使用更多的是AD719x系列的ADC芯片 包括有AD7191 AD7192和AD7193等 接下来我们就来设计并开发AD719x的驱动程序 1 功能概述 AD7192是一款适合
  • STM32常用小驱动

    STM32常用小驱动 灯控及蜂鸣器驱动 按键消抖使用例子 蜂鸣器控制列子 数据处理校验计算类 因为疫情 最近在做红外温度检测设备 一些设备组合控制逻辑 灯控及蜂鸣器驱动 支持循环响 响多少次 响多少秒 FILE misc drv c Cre
  • 计算机操作系统的启动与加载过程

    注 uboot 嵌入式系统的bootloader 包含了BIOS的功能 相当于PC机的BIOS 引导程序
  • 程序、进程、线程联系以及进程和线程的区别和联系

    程序和进程的区别与联系 程序是一组有序的指令集合是一个静态的概念 一个程序由一组指令组成 以二进制方式存在存储器中 进程是程序及其数据在计算机上的一次运行活动 是一个动态的概念 进程的运行实体是程序 离开的程序的进程没有意义 进程是由程序
  • 外设驱动库开发笔记3:AD527x系列数字电位器驱动

    在一些时候我们需要使用精度更高的数字电位器来实现我们的应用 我们经常使用AD527x系列数字电位器来实现这类应用 在通常情况下 AD527x系列数字电位器完全能够满足要求 为了减少重复工作 在这里我们将分系并实现AD527x系列数字电位器的
  • 罗技驱动检测不到设备?解决方法

    罗技旗下的鼠标是很多用户都在使用的设备 需要用户安装驱动程序才能够运行 而近期有些小伙伴遇到了罗技驱动检测不到设备的情况 这该如何处理 纯净之家 win7纯净版系统 win7 ghost 纯净版 方法一 1 检测不到设备也有可能不是驱动的问
  • QCM2290平台XBL阶段I2C使能并点亮LED

    描述 qcm2290平台上 在低压充电阶段 XBL 需要驱动LED灯芯片 提供接口供充电模块调用 显示充电指示灯功能 说明 LED控制芯片是I2C接口 我只需要提供接口即可 我这边实现了在开机时led灯闪烁 在充电相关PmicLib目录下添
  • Windbg Preview与虚拟机win10系统实现双机调试

    在驱动开发之调试内核模块中实现了用windbg与虚拟机xp系统下的双机调试 接下来说下怎么使用windbg preview与虚拟机win10系统进行双机调试 主要在三个方面进行配置 win10系统配置 虚拟机配置 windbg previe
  • uhd驱动安装(usrpB210,usrpX310等)

    sdr技术与设备介绍 参考博文地址 上述博文介绍了什么是SDR技术 以及sdr设备的分类应用 问题描述 使用sdr设备 usrpx系列 usrpb系列 的准备 驱动 镜像 方案一 推荐方案 资源下载地址 一个UHD源码 一个UHD对应的镜像
  • rk3288 6222b 模组调试 (rtl8822cs)--wifi

    rtl8822cs 模块 wifi调试 记录 任务 在rk3288 android7 1 上移植配置 rtl8822cs 的wifi模块 思路 将厂商给的 wifi 驱动换上 并在 内核中 修改对应 makefile 和 Kconfig 以
  • linux驱动开发(四):ioctl()函数

    前文中我们介绍了应用程序通过使用虚拟文件系统VFS提供的接口 来控制字符驱动程序 完成字符驱动设备的open close read write操作 但是如果我们想进行除此以外的其他操作 拓展一些file operations给出的接口中没有
  • Win10下VS2019双机调试之调试驱动

    转载于 https blog csdn net m0 48995611 article details 112211268 有现成的写的非常详细就不重复造轮子了 ps 1 注意文章字体加深部分 非常重要 2 原文bcdefit dbgset
  • 应用程序如何调用驱动

    以write函数举例 详细调用流程 insmod驱动程序 申请设备名 设备号以及指定fops方法 这些可以在 proc devices中获得 从 proc devices中获得主设备号 并使用mknode命令来建立设备节点文件 这是通过主设
  • DRM驱动(七)之atomic_commit

    上节已经把应用的参数check了一遍 这次就可以把对应的参数配置到硬件里进行刷图操作了 int drm atomic commit struct drm atomic state state struct drm mode config c
  • “Failed to initialize NVML

    Checking nvidia driver version with error Failed to initialize NVML GPU access blocked by the operating system 解决办法 360安
  • windbg+vmware双机调试配置教程及可能出现的问题

    一 设备参数说明 1 调试机 物理机windows 10 windbg 10 0 22000 194 2 被调试机 虚拟机windows xp sp3 3 虚拟机软件 VMware workstation 16 1 2 二 虚拟机配置调试串
  • 外设驱动库开发笔记53:MAX31856热偶变送器驱动

    在我们的产品中经常有需要温度检测的地方 而热电偶温度检测电路是我们常用的 热电偶温度检测的方法很多 有时出于简单方便的考虑我们会选择热偶温度变送器来实现 这一篇我们就来讨论使用MAX31856热电偶温度变送器实现温度的检测 1 功能概述 M
  • linux驱动模块的加载和卸载

    Linux 驱动有两种运行方式 第一种就是将驱动编译进 Linux 内核中 这样当 Linux 内核启动的时候就会自动运行驱动程序 第二种就是将驱动编译成模块 Linux 下模块扩展名为 ko 在Linux 内核启动以后使用 insmod
  • Windows 11开启硬件加速后出现的黑屏、闪屏(如Edge浏览器、照片)问题的两种解决方案

    2022年3月21日更新 若只有Edge出现闪屏问题 可跳到下方查看原文章 若其他软件也出现闪屏问题的话 可能是Intel核显驱动的问题 可以到Intel官网搜索相应的驱动程序 不要下载最新版 core 6 11代驱动下载地址 https

随机推荐

  • 数据结构基础训练

    数据结构基础训练 数组和字符串 数组的操作 数组操作四种 读取元素 从索引从0开始 内存连续 查找元素 考虑最坏的情况 即所有元素不满足查找条件 插入元素 分顺序存储式插入和链式存储插入 链式较方便 删除元素 删除后的索引需要重新按新的元素
  • 学生管理系统(java)

    学生管理系统实现步骤 案例需求 针对目前我们的所学内容 完成一个综合案例 学生管理系统 该系统主要功能如下 添加学生 通过键盘录入学生信息 添加到集合中 删除学生 通过键盘录入要删除学生的学号 将该学生对象从集合中删除 修改学生 通过键盘录
  • 如何匹配基本正则表达式模式?条码拆分器BardecodeFiler v2.6.1.1全新发布!

    BardecodeFiler是一个随时可用的应用程序 可根据条形码值拆分和重命名TIF JPEG和PDF文档 应用程序从输入文件夹中读取文档 并在输出文件夹中创建新文档 原始文档不会被修改或删除 BardecodeFiler可以使用 reg
  • 一致性hash算法 - consistent hashing

    一致性hash算法 consistent hashing consistent hashing 算法早在 1997 年就在论文 Consistent hashing and random trees 中被提出 目前在 cache 系统中应用
  • Web自动化测试工具:Selenium3+Java详解

    今天我们一起来聊一聊Selenium的常用API使用 编程语言选用Java实现 如果使用Python等语言也大同小异 此外 本文在行文时默认同学们都已经具备一定的前端Html CSS等基础 由于本主题涉及的内容较多 加之笔者也是利用业余时间
  • 软件工程能力漫谈:比编码更重要的,是项目管理能力

    章老师博士毕业后在清华待了 12 年 主要是做网络方面的研究 到 2006 年的时候离开清华 进入到工业界 首先做了六年的用户产品研发 之后在 2012 年加入百度 一直做网络基础架构相关的开发工作 主要是对内服务 在运维部和系统部 做 B
  • python 图片识别_python识别图片文字

    滑稽研究所 python识别图片文字 哈喽 大家好呀 我是滑稽君 大家在写论文时可能经常碰到无法复制文字的文章 明明找到了需要的内容却无法直接复制使用 这让我们十分苦恼 那么本期滑稽君就告诉大家如何使用python识别图片中的文字 滑稽君整
  • 几款优秀的Windows密码抓取工具

    前言 本篇介绍几款优秀的Windows上的密码抓取工具 每个工具都有自己的特点非常实用 欢迎补充 0x01 Mimikatz 个人点评 这款工具非常强大 公认的Windows密码神器 1 简介 Mimikat是一个法国人写的轻量级调试器 M
  • Linux kernel内存管理之OOM相关参数

    一 OOM概念 OOM是Out Of Memory 内存溢出 的缩写 虽然linux kernel的内存管理有很多机制 从cache中回收 swap out等 可以满足用户空间的各种虚拟内存需求 但是 当你的系统配置不合理 让一匹小马拉大车
  • 浅析React Hooks原理

    React Hooks 简介 React Hooks 是 React 16 8 以及之后版本的产物 React Hooks 就是一堆钩子函数 不同的钩子函数提供了不同的功能 React 通过这些钩子函数对函数型组件进行增强 Hooks 允许
  • 7.2面试

    1 tcp ip四层模型是什么 应用层 运输层 网际层 物理层 网络接口层 网际层 传输层 应用层 tcp ip四层协议模型是对osi七层网络协议模型的简化 其中在tcp ip参考模型中去掉了osi中的会话层和表示层 合并为应用层 把ois
  • 手把手教你用Keil5新建STM32工程

    一 去Keil官网下载STM32芯片支持包 网址http www keil com dd2 pack 下载之后安装 这里的芯片支持包对应标准库的开发 二 去STM32社区下载STM32官方标准库 点击STM32社区网站https www s
  • 调试最长的一帧(第17天)

    先看看流程 电子书上介绍了渲染器osgViewer Renderer类 osgViewer Renderer为摄像机渲染场景的工作提供了一个公共接口 当我们向视景器viewer添加了一个新的摄像机camera时 一个与摄像机相关联的渲染器R
  • 不止是Android,Github超高影响力开源大放送,学习开发必备教科书

    http www cnblogs com liushilin p 6378607 html 1 free programming books https github com vhf free programming books 这个项目目
  • centos7下安装flex,bison

    centos7下安装flex bison 1 修改镜像源为国内镜像源 比如阿里云 1 首先备份系统自带yum源配置文件 etc yum repos d CentOS Base repo root fengyi flex cp etc yum
  • 终于解决DELL台式机的风扇噪音变大的问题

    我的这台电脑是今年7月中旬买的 是DELL 的5150 刚到家的时候 几乎没有什么噪音 很安静 我当时还在感叹DELL的降噪音技术做得如此之好 但到九月份的时候 发现噪音有些变大 尤其在运行需大量运算的程序时 我当时也没多想 但发现就算上新
  • Json Path提取器

    一 Json Path提取器截图 二 Json Path提取器使用说明 http响应的Json结果如下图 数据来源 可以是Http请求的响应结果或者JMeter变量值 目标变量名和Json Path表达式 将Json Path提取出的结果存
  • 共享里的文件被删除了怎么办?可尝试这三种恢复方法

    共享里的文件被删除了怎么恢复 删除之后就马上去回收站找 可是没回收站里没有怎么办 来自某xx小伙伴的咨询 如果你也出现同样的疑惑 那么可以尝试下面的三种方法恢复共享里的文件 方法一 以前的版本恢复 从Windows XP SP2和Windo
  • python安装到一半停止_关于python:使用requirements.txt进行安装时,停止单个包上的pip失败...

    我正在安装requirements txt中的包 pip install r requirements txt requirements txt文件显示 Pillow lxml cssselect jieba beautifulsoup n
  • 外设驱动库开发笔记3:AD527x系列数字电位器驱动

    在一些时候我们需要使用精度更高的数字电位器来实现我们的应用 我们经常使用AD527x系列数字电位器来实现这类应用 在通常情况下 AD527x系列数字电位器完全能够满足要求 为了减少重复工作 在这里我们将分系并实现AD527x系列数字电位器的