主頁 >  其他 > 外設驅動庫開發筆記21:BME680環境傳感器驅動

外設驅動庫開發筆記21:BME680環境傳感器驅動

2020-12-28 12:17:57 其他

環境傳感器是一類我們很常用的傳感器,它可以方便我們獲取壓力、溫度、濕度以及空氣質量等資料,在這一篇中,我們將分析BME680環境傳感器的功能,并設計和實作BME680環境傳感器的驅動,

1、功能概述

BME680是一款專為移動應用和可穿戴設備開發的集成環境傳感器,其尺寸和低功耗是關鍵要求,

1.1、硬體介面

BME680由一個8針金屬蓋3.0 x 3.0 x0.93mm3LGA封裝組成,旨在根據特定的作業模式,長期穩定性和高EMC穩健性進行優化消耗,可以選擇采用I2C介面或者SPI介面,其管腳排布如下圖:

BME680環境傳感器可以選擇使用I2C介面或者SPI介面,在不同的介面模式及下各個引腳的定義及功能有一些差別,其具體分配及定義如下所示:

從上表中我們可以知道當CSB引腳接高電平VDDIO時,采用的是I2C介面,此時I2C的設備地址的最后一位由SDO引腳的電平決定,所以設備地址計7位為0x760x77,計8位則是0xEC0xEE

CSB引腳用作片選信號時,則使用SPI介面,SPI介面支持模式0CPOL=0CPHA=0)和模式3CPOL=1CPHA=1),同時支持3SPI4SPI,控制位元組的最高位為0時表示寫,為1時表示讀,

1.2、內置傳感器

BME680擴展了博世現有的環境傳感器系列,首次集成了高線性度和高精度的氣體,壓力,濕度和溫度傳感器,

1.2.1、氣體傳感器

BME680內的氣體傳感器可以檢測各種氣體,以測量個人健康的空氣質量,BME680可檢測到的氣體包括油漆(如甲醛),油漆,脫漆劑,清潔用品,家具等的揮發性有機化合物(VOC),大氣質量傳感器的特性引數如下:

BME680采用了博世軟體環境群組解決方案,該解決方案使用智能算術方法將空氣質量索引(IAQ)作為輸出,該指標將IAQ劃分為0500的索引數值用以指示IAQ,具體劃分如下所示:

1.2.2、濕度傳感器

BME680集成了濕度傳感器用于外部環境中濕度資料的采集,濕度傳感器的性能引數如下:

1.2.3、壓力傳感器

BME680集成有大氣壓力傳感器用于檢測外部環境的絕對壓力,壓力傳感器的性能引數如下:

1.2.4、溫度傳感器

BME680也集成了溫度傳感器用以檢測溫度資料,溫度資料除了指示環境溫度外,同時用于壓力和濕度的補償計算,溫度傳感器的性能引數如下:

1.3、資料存盤結構

BME680采用特定的存盤器區域來存盤控制及資料資訊,存盤的資料包括測量資料、控制資訊以及校準資料,

對于溫度傳感器,包括3個校準引數和一個ADC測量資料,其測量資料和校準資料的存盤結構及地址如下:

對于壓力傳感器,包括10個計算校準資料和一個ADC轉換資料,其測量資料的校準資料存盤結構及地址如下:

對于濕度傳感器,包括7個計算校準資料和一個ADC轉換資料,其測量資料的校準資料存盤結構及地址如下:

大氣質量傳感器,包括3個計算校準資料、一個加熱器范圍存盤資料、一個加熱器電阻校準因子存盤資料、氣體ADC測量資料、氣體范圍資料以及范圍轉換錯誤,其測量資料的校準資料存盤結構及地址如下:

BME680環境傳感器暫存器都是8位的,所有的操作均通過對暫存器的讀寫來實作,全部控制暫存器及資料暫存器的結構和地址如下:

這里我們需要說明一下,BME680的存盤器地址范圍是0x00~0xFF,在I2C介面通訊時,通訊采用的是8位暫存器地址正好符合對應的尋址范圍,但是采用SPI介面通訊時,暫存器地址的最高為被用于區分讀寫操作,所以地址只有7位,存盤空間被分為2頁,具體如下:

所以在使用SPI介面時需要分辨是哪一頁,當前操作的是哪一頁由Status暫存器來決定,

2、驅動設計與實作

我們對BME680環境傳感器的基本情況已經有了整體了解,接下來我們將為BME680環境傳感器設計并實作驅動程式,

2.1、物件定義

我們依然是采用基于物件的操作,所以我們需要定義物件,所以我們需要抽象出物件型別,并對我們想要操作的物件進行初始化,

2.1.1、物件抽象

對于一個物件來說,一般包括有屬性和操作兩方面的內容,接下來我們就從這兩個方面分析BME680環境傳感器的物件,

我們需要從BME680物件抽象出其屬性,這些屬性能夠定義一個物件的特點并將其與其它物件區別開來,BME680支持SPI通訊和I2C通訊,所以我們將通訊埠作為屬性以規定物件的通訊方式,在使用I2C時,設備有地址以區別不同的設備,所以我們將I2C設備地址也定義為屬性,每臺BME680都有一個ID用以區別于其它設備,所以我們將它定義為物件的屬性,還有配置暫存器、測量控制暫存器、濕度控制暫存器、氣體控制暫存器都記錄了設備的配置狀態,所以我們也將它們作為屬性,每臺設備都有特定的校準資料,這些校準資料每次資料檢測都是需要的,所以我們用屬性將它們記錄下來,還有測量資料,它們標識了設備當前的作業狀態,所以我們將它們也作為屬性,

接下來我們分析BME680的操作,首先來講,我們肯定要與BME680互動,但我們對BME680的讀寫依賴于具體的硬體平臺,所以我們將它們作為物件的操作,在進行相關操作時,我們需要控制時序,則需要使用延時操作,但延時處理總是依賴于具體的軟硬體平臺,所以我們將延時處理作為物件的操作,而使用SPI時,沒有設備地址但有片選信號,如何操作片選信號依賴于硬體平臺,我們將對片選的操作定義為物件的操作函式,

根據上述的分析,我們可以得到BME680環境傳感器的物件型別如下:

/*定義BME680操作物件*/
typedef struct BME680Object{
       uint8_t chipID;       //芯片ID
       uint8_t bmeAddress;         //I2C通訊時的設備地址
       uint8_t memeryPage;       //用于在SPI介面時記錄當前所處的記憶體頁
       uint8_t config;                         //配置暫存器
       uint8_t ctrlMeas;                 //測量控制暫存器
       uint8_t ctrlHumi;              //濕度測量控制暫存器
       uint8_t ctrlGas0;               //氣體控制暫存器0
       uint8_t ctrlGas1;               //氣體控制暫存器1
       uint8_t resHeat;
       uint8_t gasWait;
      
       BME680PortType port;                                              //介面選擇
       BME680CalibParamType caliPara;   //校準引數

#if BME680_COMPENSATION_SELECTED > (0)
       int32_t temperature;         //溫度值
       int32_t pressure;                      //壓力值
       int32_t humidity;                     //濕度值
       int32_t gasResistence;      //大氣質量電阻值
       int32_t iaq;                                      //空氣質量水平
#else
       float temperature;             //溫度值
       float pressure;                          //壓力值
       float humidity;                         //濕度值
       float gasResistence;   //大氣質量電阻值
       float iaq;                                          //空氣質量水平
#endif

       void (*Read)(struct BME680Object *bme,uint8_t regAddress,uint8_t *rData,uint16_t rSize);       //讀資料操作指標
       void (*Write)(struct BME680Object *bme,uint8_t regAddress,uint8_t command);    //謝資料操作指標
       void (*Delayms)(volatile uint32_t nTime);       //延時操作指標
       void (*ChipSelect)(BME680CSType cs);    //使用SPI介面時,片選操作
}BME680ObjectType;

片選操作有一點需要注意,如果片選信號在硬體電路上固定有效時,可以將NULL給它,同樣在SPI介面時也需要將NULL給它,

2.1.2、物件初始化函式

一個物件必須對其進行初始化才可使用,初始化物件主要有四個方面的內容:檢查物件賦值的合法性;屬性賦初值;為物件操作指定函式指標;物件所指向設備的初始配置,據此我們可以撰寫BME680環境傳感器的初始化函式如下:

/*實作BME680初始化配置*/
void BME680Initialization(BME680ObjectType *bme,       //BMP280物件
                          uint8_t bmeAddress,         //I2C介面是設備地址
                          BME680PortType port,    //介面選擇
                          BME680IIRFilterType filter,                //過濾器
                          BME680SPI3wUseType spi3W_en,   //3線SPI控制
                          BME680TempSampleType osrs_t,       //溫度精度
                          BME680PresSampleType osrs_p,         //壓力精度
                          BME680SPI3wIntType spi3wint_en,//3線SPI中斷控制
                          BME680HumiSampleType osrs_h,       //濕度精度
                          BME680GasRunType run_gas,      //氣體運行設定
                          BME680HeaterSPType nb_conv,  //加熱器設定點選擇
                          BME680HeaterOffType heat_off, //加熱器關閉
                          uint16_t duration,      //TPHG測量回圈周期,ms單位
                          uint8_t tempTarget,   //加熱器的目標溫度
                          BME680Read Read,  //讀資料操作指標
                          BME680Write Write,       //寫資料操作指標
                          BME680Delayms Delayms,           //延時操作指標
                          BME680ChipSelect ChipSelect     //片選操作指標
                          )
{
       uint8_t try_count = 5;
       uint8_t regValue=0;
      
       if((bme==NULL)||(Read==NULL)||(Write==NULL)||(Delayms==NULL))
       {
              return;
       }
       bme->Read=Read;
       bme->Write=Write;
       bme->Delayms=Delayms;
      
       bme->port=port;
       if(bme->port==BME680_I2C)
       {
              if((bmeAddress==0xEC)||(bmeAddress==0xEE))
              {
                     bme->bmeAddress=bmeAddress;
              }
              else if((bmeAddress==0x76)||(bmeAddress==0x77))
              {
                     bme->bmeAddress=(bmeAddress<<1);
              }
              else
              {
                     return;
              }
              bme->ChipSelect=NULL;
       }
       else
       {
              if(ChipSelect!=NULL)
              {
                     bme->ChipSelect=ChipSelect;
              }
              else
              {
                     bme->ChipSelect=BME680ChipSelectDefault;
              }
       }
      
       bme->chipID=0x00;
       bme->pressure=0.0;
       bme->temperature=25.0;
       bme->humidity=0.0;
       bme->bmeAddress=0x00;
       bme->caliPara.t_fine=0;
             
       if(!ObjectIsValid(bme))
       {
             return;
       }
    
       while(try_count--)
       {
             ReadBME680Register(bme,REG_BME680_ID,&regValue,1);
             bme->chipID=regValue;
             if(0x61==bme->chipID)
             {
                   BME680SoftReset(bme);
     
                   break;
             }
       }
 
       if(try_count)
       {
              uint8_t waitTime;
              waitTime=CalcProfileDuration(bme,duration,osrs_t,osrs_p,osrs_h);
             
              //控制暫存器配置
              ConfigControlRegister(bme,filter,spi3W_en,osrs_t,osrs_p,spi3wint_en,osrs_h,run_gas,nb_conv,heat_off,waitTime,tempTarget);
             
             //讀取校準值
             GetBME680CalibrationData(bme);
       }
}

2.2、物件操作

每一個物件都有操作,我們使用物件的目的當然是通過操作物件來獲取我們需要的資料,所以開發驅動時,物件的操作才是我們主要的作業內容,在這里對BME680的操作就是對其暫存器的操作,

2.2.1、寫暫存器操作

我們已經說過了,對BME680的操作都是通過讀寫暫存器實作的,這里我們先來看寫暫存器,在I2C介面方式下,寫暫存器操作是在從站地址的最后一位來識別的,再加上要寫的暫存器地址和資料來實作的,這也是I2C協議的標準做法,其時序圖如下所示:

而在SPI介面方式下,由于SPI并未有設備地址,也不存在用從還在那地址最后為來標記讀寫的模式,通常一些設備需要定義操作碼來實作讀寫區分,但BME680采取了將暫存器地址的最高位置零表示為寫,之所以可以這樣定義,是因為BME680暫存器地址分配的特殊性決定的,改變暫存器地址的最高位也能區分不同的暫存器,絕不會重復,在SPI介面方式下,寫暫存器的時序圖如下所示:

根據上述描述和時序圖,我們可以實作寫BME680環境傳感器暫存器的程式,

/* 向BME680暫存器寫一個位元組 */
static void WriteBME680Register(BME680ObjectType *bme,uint8_t regAddress,uint8_t command)
{
       if(ObjectIsValid(bme))
       {
              if(bme->port==BME680_SPI)
              {
                     bme->ChipSelect(BME680CS_Enable);
                     bme->Delayms(1);
                     SetMemeryPageNumber(bme,regAddress);
                     regAddress&=0x7F;
                     bme->Delayms(1);
                     bme->Write(bme,regAddress,command);
                     bme->Delayms(1);
                     bme->ChipSelect(BME680CS_Disable);
              }
              else
              {
                     bme->Write(bme,regAddress,command);
              }
       }
}

2.2.2、讀暫存器操作

讀暫存器的處理方式與寫暫存器是類似,在I2C介面方式下,將從站地址的最低位置1來表示讀,在I2C介面方式下,讀暫存器的時序圖如下所示:

而在SPI介面方式下,通過將暫存器地址的最改為置1來標識為讀操作,事實上,所有暫存器地址的最高為都是1,所以在讀操作時實際不需要做處理,在SPI介面方式下,讀暫存器的時序圖如下所示:

根據上述描述和時序圖,我們可以實作讀BME680環境傳感器暫存器的程式,

/*從BME680暫存器讀取資料*/
static uint8_t ReadBME680Register(BME680ObjectType *bme,uint8_t regAddress,uint8_t *rDatas,uint16_t rSize)
{
      uint8_t bmeError=0xFF;
 
      if(ObjectIsValid(bme))
      {
              if(bme->port==BME680_SPI)
              {
                     bme->ChipSelect(BME680CS_Enable);
                     bme->Delayms(1);
                     SetMemeryPageNumber(bme,regAddress);
                     regAddress |= 0x80;
                     bme->Delayms(1);
                     bme->Read(bme,regAddress,rDatas,rSize);
                     bme->Delayms(1);
                     bme->ChipSelect(BME680CS_Disable);
              }
              else
              {
                     bme->Read(bme,regAddress,rDatas,rSize);
              }
             
              bmeError=0x00;
      }

      return bmeError;
}

3、驅動的使用

上一節我們設計并實作了BME680環境傳感器的驅動程式,但這個驅動設計的是否合理還不確定,所以我們來設計一個簡單的應用驗證BME680環境傳感器的驅動,

3.1、宣告并初始化物件

使用基于物件的操作我們需要先得到這個物件,所以我們先要使用前面定義的BME680環境傳感器物件型別宣告一個BME680環境傳感器物件變數,具體操作格式如下:

BME680ObjectType bme680;

宣告了這個物件變數并不能立即使用,我們還需要使用驅動中定義的初始化函式對這個變數進行初始化,這個初始化函式所需要的輸入引數如下:

BME680ObjectType *bmeBMP680物件

uint8_t bmeAddressI2C介面是設備地址

BME680PortType port,介面選擇

BME680IIRFilterType filter,過濾器

BME680SPI3wUseType spi3W_en3SPI控制

BME680TempSampleType osrs_t,溫度精度

BME680PresSampleType osrs_p,壓力精度

BME680SPI3wIntType spi3wint_en3SPI中斷控制

BME680HumiSampleType osrs_h,濕度精度

BME680GasRunType run_gas,氣體運行設定

BME680HeaterSPType nb_conv,加熱器設定點選擇

BME680HeaterOffType heat_off,加熱器關閉

uint16_t durationTPHG測量回圈周期,ms單位

uint8_t tempTarget,加熱器的目標溫度

BME680Read Read,讀資料操作指標

BME680Write Write,寫資料操作指標

BME680Delayms Delayms,延時操作指標

BME680ChipSelect ChipSelect,片選操作指標

對于這些引數,物件變數我們已經定義了,其他的引數基本都是配置引數,我們根據實際使用需求選擇輸入就好了,主要的是我們需要定義幾個函式,并將函式指標作為引數,這幾個函式的型別如下:

/* 定義讀資料操作函式指標型別 */
typedef void (*BME680Read)(struct BME680Object *bme,uint8_t regAddress,uint8_t *rData,uint16_t rSize);
/* 定義寫資料操作函式指標型別 */
typedef void (*BME680Write)(struct BME680Object *bme,uint8_t regAddress,uint8_t command);
/* 定義延時操作函式指標型別 */
typedef  void (*BME680Delayms)(volatile uint32_t nTime);
/* 定義使用SPI介面時,片選操作函式指標型別 */
typedef  void (*BME680ChipSelect)(BME680CSType cs);

對于這幾個函式我們根據樣式定義就可以了,具體的操作可能與使用的硬體平臺有關系,若采用的SPI介面則需注意片選操作,片選操作函式用于多設備需要軟體操作時,如采用硬體片選可以傳入NULL即可,同樣如果采用的是I2C介面,則片選可以傳入NULL即可,具體函式定義如下:

/*讀BME680暫存器值*/
static void ReadDataFromBME680(BME680ObjectType *bme680,uint8_t regAddress,uint8_t *rData,uint16_t rSize)
{
  HAL_I2C_Master_Transmit(&bme680hi2c, bme680->bmeAddress,&regAddress,1,1000);
 
  HAL_I2C_Master_Receive(&bme680hi2c, bme680->bmeAddress+1,rData, rSize, 1000);
}

/*寫BME680暫存器值*/
static void WriteDataToBME680(BME680ObjectType *bme680,uint8_t regAddress,uint8_t command)
{
  uint8_t pData[2];
 
  pData[0]=regAddress;
  pData[1]=command;
 
  HAL_I2C_Master_Transmit(&bme680hi2c,bme680->bmeAddress, pData, 2,1000);
}

對于延時函式我們可以采用各種方法實作,我們采用的STM32平臺和HAL庫則可以直接使用HAL_Delay()函式,于是我們可以呼叫初始化函式如下:

BME680Initialization(&bme680,  //BME280物件
                     0xEC,           //I2C介面是設備地址
                     BME680_I2C,    //介面選擇
                     BME680_IIR_FILTER_COEFF_X127,      //過濾器
                     BME680_SPI3W_DISABLE,        //3線SPI控制
                     BME680_TEMP_SAMPLE_X16, //溫度精度
                     BME680_PRES_SAMPLE_X16,          //壓力精度
                     BME680_SPI3W_INT_DISABLE,       ///3線SPI中斷使能
                     BME680_HUMI_SAMPLE_X16,         //濕度精度
                     BME680_GAS_RUN_ENABLE,//氣體運行設定
                     BME680_HEATER_SP0,//加熱器設定點選擇
                     BME680_HEATER_DISABLE,//加熱器關閉
                     20,//TPHG測量回圈周期,ms單位
                     200,//加熱器的目標溫度
                     ReadDataFromBME680,  //讀資料操作指標
                     WriteDataToBME680,     //寫資料操作指標
                     HAL_Delay,                     //延時操作指標
                     NULL                                //片選操作指標
                     );

3.2、基于物件進行操作

我們定義了物件變數并使用初始化函式給其作了初始化,接著我們就來考慮操作這一物件獲取我們想要的資料,我們在驅動中已經將獲取資料并轉換為轉換值的比例值,接下來我們使用這一驅動開發我們的應用實體,

/*獲取環境資料*/
void BME680GetEnvironmentalData(void)
{
       float pressure;                //壓力值
       float temperature;             //溫度值
       float humidity;                //濕度值
       float gasResistance;           //氣體電阻
      
       GetBME680Measure(&bme680);

       pressure=bme680.pressure;
       temperature=bme680.temperature;
       humidity=bme680.humidity;
       gasResistance=bme680.gasResistence;
}

4、應用總結

我們設計并實作了BME680環境傳感器的驅動程式,并基于這一驅動程式設計了簡單的應用,我們獲得了BME680檢測的全部環境資料,結果也是令我們滿意的,這說明我們的驅動設計是正確的,

在使用驅動時需注意,采用SPI介面的器件需要考慮片選操作的問題,如果片選信號是通過硬體電路來實作的,我們在初始化時給其傳遞NULL值,如果是軟體操作片選則傳遞我們撰寫的片選操作函式,而如果采用I2C介面,那么在初始化時也應傳遞NULL值,

BME680環境傳感器支持SPII2C兩種介面,而且SPI也支持3線和4線模式,但我們在測驗應用中只使用了I2C介面,SPI介面還有待測驗,BME680環境傳感器在使用SPI介面時,支持SPI模式0CPOL=CPHA=0)和模式3CPOL=CPHA=1),而在使用I2C介面時,支持標準模式、快速模式以及高速模式,而且在使用I2C介面時,SDO引腳必須接高電平或低電平,以確定設備地址,

BME680環境傳感器有2種作業模式:休眠模式和強制模式,在設備上電后就進入休眠模式,在這種模式下設備不執行測量作業,一旦啟動強制模式則執行一遍TPHG回圈檢測,模式設定的具體定義如下:

對于BME680環境傳感器有一個測量范圍暫存器,這個暫存器的值對應兩組計算常數,這下常數用于測量值的計算,具體如下:

總的來說對BME680環境傳感器的讀寫操作本身并不復雜,但其計算與修正關系卻相對復雜,特別是氣體質量資料更應注意,

原始碼下載:https://github.com/foxclever/ExPeriphDriver

歡迎關注:

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/241413.html

標籤:其他

上一篇:stm32上基于SPI介面的OLED資料顯示

下一篇:YS13-3熒光管時鐘設計

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more