stm32——hal庫學習筆記(IIC)

一、IIC總線協議介紹(掌握)

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

二、AT24C02介紹(了解)

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

三、AT24C02讀寫時序(掌握)

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

四、AT24C02驅動步驟(掌握)

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

五、編程實戰(掌握)

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
myiic.c

#include "./BSP/IIC/myiic.h"
#include "./SYSTEM/delay/delay.h"/*** @brief       初始化IIC* @param       無* @retval      無*/
void iic_init(void)
{GPIO_InitTypeDef gpio_init_struct;IIC_SCL_GPIO_CLK_ENABLE();  /* SCL引腳時鐘使能 */IIC_SDA_GPIO_CLK_ENABLE();  /* SDA引腳時鐘使能 */gpio_init_struct.Pin = IIC_SCL_GPIO_PIN;gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP;        /* 推挽輸出 */gpio_init_struct.Pull = GPIO_PULLUP;                /* 上拉 */gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;      /* 高速 */HAL_GPIO_Init(IIC_SCL_GPIO_PORT, &gpio_init_struct);/* SCL */gpio_init_struct.Pin = IIC_SDA_GPIO_PIN;gpio_init_struct.Mode = GPIO_MODE_OUTPUT_OD;        /* 開漏輸出 */HAL_GPIO_Init(IIC_SDA_GPIO_PORT, &gpio_init_struct);/* SDA *//* SDA引腳模式設置,開漏輸出,上拉, 這樣就不用再設置IO方向了, 開漏輸出的時候(=1), 也可以讀取外部信號的高低電平 */iic_stop();     /* 停止總線上所有設備 */
}/*** @brief       IIC延時函數,用于控制IIC讀寫速度* @param       無* @retval      無*/
static void iic_delay(void)
{delay_us(2);    /* 2us的延時, 讀寫速度在250Khz以內 */
}/*** @brief       產生IIC起始信號* @param       無* @retval      無*/
void iic_start(void)
{IIC_SDA(1);IIC_SCL(1);iic_delay();IIC_SDA(0);     /* START信號: 當SCL為高時, SDA從高變成低, 表示起始信號 */iic_delay();IIC_SCL(0);     /* 鉗住I2C總線,準備發送或接收數據 */iic_delay();
}/*** @brief       產生IIC停止信號* @param       無* @retval      無*/
void iic_stop(void)
{IIC_SDA(0);     /* STOP信號: 當SCL為高時, SDA從低變成高, 表示停止信號 */iic_delay();IIC_SCL(1);iic_delay();IIC_SDA(1);     /* 發送I2C總線結束信號 */iic_delay();
}/*** @brief       等待應答信號到來* @param       無* @retval      1,接收應答失敗*              0,接收應答成功*/
uint8_t iic_wait_ack(void)
{uint8_t waittime = 0;uint8_t rack = 0;IIC_SDA(1);     /* 主機釋放SDA線(此時外部器件可以拉低SDA線) */iic_delay();IIC_SCL(1);     /* SCL=1, 此時從機可以返回ACK */iic_delay();while (IIC_READ_SDA)    /* 等待應答 */{waittime++;if (waittime > 250){iic_stop();rack = 1;break;}}IIC_SCL(0);     /* SCL=0, 結束ACK檢查 */iic_delay();return rack;
}/*** @brief       產生ACK應答* @param       無* @retval      無*/
void iic_ack(void)
{IIC_SDA(0);     /* SCL 0 -> 1  時 SDA = 0,表示應答 */iic_delay();IIC_SCL(1);     /* 產生一個時鐘 */iic_delay();IIC_SCL(0);iic_delay();IIC_SDA(1);     /* 主機釋放SDA線 */iic_delay();
}/*** @brief       不產生ACK應答* @param       無* @retval      無*/
void iic_nack(void)
{IIC_SDA(1);     /* SCL 0 -> 1  時 SDA = 1,表示不應答 */iic_delay();IIC_SCL(1);     /* 產生一個時鐘 */iic_delay();IIC_SCL(0);iic_delay();
}/*** @brief       IIC發送一個字節* @param       data: 要發送的數據* @retval      無*/
void iic_send_byte(uint8_t data)
{uint8_t t;for (t = 0; t < 8; t++){IIC_SDA((data & 0x80) >> 7);    /* 高位先發送 */iic_delay();IIC_SCL(1);iic_delay();IIC_SCL(0);data <<= 1;     /* 左移1位,用于下一次發送 */}IIC_SDA(1);         /* 發送完成, 主機釋放SDA線 */
}/*** @brief       IIC讀取一個字節* @param       ack:  ack=1時,發送ack; ack=0時,發送nack* @retval      接收到的數據*/
uint8_t iic_read_byte(uint8_t ack)
{uint8_t i, receive = 0;for (i = 0; i < 8; i++ )    /* 接收1個字節數據 */{receive <<= 1;  /* 高位先輸出,所以先收到的數據位要左移 */IIC_SCL(1);iic_delay();if (IIC_READ_SDA){receive++;}IIC_SCL(0);iic_delay();}if (!ack){iic_nack();     /* 發送nACK */}else{iic_ack();      /* 發送ACK */}return receive;
}

myiic.h

#ifndef __MYIIC_H
#define __MYIIC_H
#include "./SYSTEM/sys/sys.h"
/******************************************************************************************/
/* 引腳 定義 */#define IIC_SCL_GPIO_PORT               GPIOB
#define IIC_SCL_GPIO_PIN                GPIO_PIN_6
#define IIC_SCL_GPIO_CLK_ENABLE()       do{ __HAL_RCC_GPIOB_CLK_ENABLE(); }while(0)   /* PB口時鐘使能 */#define IIC_SDA_GPIO_PORT               GPIOB
#define IIC_SDA_GPIO_PIN                GPIO_PIN_7
#define IIC_SDA_GPIO_CLK_ENABLE()       do{ __HAL_RCC_GPIOB_CLK_ENABLE(); }while(0)   /* PB口時鐘使能 *//******************************************************************************************//* IO操作 */
#define IIC_SCL(x)        do{ x ? \HAL_GPIO_WritePin(IIC_SCL_GPIO_PORT, IIC_SCL_GPIO_PIN, GPIO_PIN_SET) : \HAL_GPIO_WritePin(IIC_SCL_GPIO_PORT, IIC_SCL_GPIO_PIN, GPIO_PIN_RESET); \}while(0)       /* SCL */#define IIC_SDA(x)        do{ x ? \HAL_GPIO_WritePin(IIC_SDA_GPIO_PORT, IIC_SDA_GPIO_PIN, GPIO_PIN_SET) : \HAL_GPIO_WritePin(IIC_SDA_GPIO_PORT, IIC_SDA_GPIO_PIN, GPIO_PIN_RESET); \}while(0)       /* SDA */#define IIC_READ_SDA     HAL_GPIO_ReadPin(IIC_SDA_GPIO_PORT, IIC_SDA_GPIO_PIN) /* 讀取SDA *//* IIC所有操作函數 */
void iic_init(void);            /* 初始化IIC的IO口 */
void iic_start(void);           /* 發送IIC開始信號 */
void iic_stop(void);            /* 發送IIC停止信號 */
void iic_ack(void);             /* IIC發送ACK信號 */
void iic_nack(void);            /* IIC不發送ACK信號 */
uint8_t iic_wait_ack(void);     /* IIC等待ACK信號 */
void iic_send_byte(uint8_t txd);/* IIC發送一個字節 */
uint8_t iic_read_byte(unsigned char ack);/* IIC讀取一個字節 */#endif

24cxx.c

#include "./BSP/IIC/myiic.h"
#include "./BSP/24CXX/24cxx.h"
#include "./SYSTEM/delay/delay.h"/*** @brief       初始化IIC接口* @param       無* @retval      無*/
void at24cxx_init(void)
{iic_init();
}/*** @brief       在AT24CXX指定地址讀出一個數據* @param       readaddr: 開始讀數的地址* @retval      讀到的數據*/
uint8_t at24cxx_read_one_byte(uint16_t addr)
{uint8_t temp = 0;iic_start();                /* 發送起始信號 *//* 根據不同的24CXX型號, 發送高位地址* 1, 24C16以上的型號, 分2個字節發送地址* 2, 24C16及以下的型號, 分1個低字節地址 + 占用器件地址的bit1~bit3位 用于表示高位地址, 最多11位地址*    對于24C01/02, 其器件地址格式(8bit)為: 1  0  1  0  A2  A1  A0  R/W*    對于24C04,    其器件地址格式(8bit)為: 1  0  1  0  A2  A1  a8  R/W*    對于24C08,    其器件地址格式(8bit)為: 1  0  1  0  A2  a9  a8  R/W*    對于24C16,    其器件地址格式(8bit)為: 1  0  1  0  a10 a9  a8  R/W*    R/W      : 讀/寫控制位 0,表示寫; 1,表示讀;*    A0/A1/A2 : 對應器件的1,2,3引腳(只有24C01/02/04/8有這些腳)*    a8/a9/a10: 對應存儲整列的高位地址, 11bit地址最多可以表示2048個位置,可以尋址24C16及以內的型號*/    if (EE_TYPE > AT24C16)      /* 24C16以上的型號, 分2個字節發送地址 */{iic_send_byte(0XA0);    /* 發送寫命令, IIC規定最低位是0, 表示寫入 */iic_wait_ack();         /* 每次發送完一個字節,都要等待ACK */iic_send_byte(addr >> 8);/* 發送高字節地址 */}else {iic_send_byte(0XA0 + ((addr >> 8) << 1));   /* 發送器件 0XA0 + 高位a8/a9/a10地址,寫數據 */}iic_wait_ack();             /* 每次發送完一個字節,都要等待ACK */iic_send_byte(addr % 256);  /* 發送低位地址 */iic_wait_ack();             /* 等待ACK, 此時地址發送完成了 */iic_start();                /* 重新發送起始信號 */ iic_send_byte(0XA1);        /* 進入接收模式, IIC規定最低位是0, 表示讀取 */iic_wait_ack();             /* 每次發送完一個字節,都要等待ACK */temp = iic_read_byte(0);    /* 接收一個字節數據 */iic_stop();                 /* 產生一個停止條件 */return temp;
}/*** @brief       在AT24CXX指定地址寫入一個數據* @param       addr: 寫入數據的目的地址* @param       data: 要寫入的數據* @retval      無*/
void at24cxx_write_one_byte(uint16_t addr, uint8_t data)
{/* 原理說明見:at24cxx_read_one_byte函數, 本函數完全類似 */iic_start();                /* 發送起始信號 */if (EE_TYPE > AT24C16)      /* 24C16以上的型號, 分2個字節發送地址 */{iic_send_byte(0XA0);    /* 發送寫命令, IIC規定最低位是0, 表示寫入 */iic_wait_ack();         /* 每次發送完一個字節,都要等待ACK */iic_send_byte(addr >> 8);/* 發送高字節地址 */}else {iic_send_byte(0XA0 + ((addr >> 8) << 1));   /* 發送器件 0XA0 + 高位a8/a9/a10地址,寫數據 */}iic_wait_ack();             /* 每次發送完一個字節,都要等待ACK */iic_send_byte(addr % 256);  /* 發送低位地址 */iic_wait_ack();             /* 等待ACK, 此時地址發送完成了 *//* 因為寫數據的時候,不需要進入接收模式了,所以這里不用重新發送起始信號了 */iic_send_byte(data);        /* 發送1字節 */iic_wait_ack();             /* 等待ACK */iic_stop();                 /* 產生一個停止條件 */delay_ms(10);               /* 注意: EEPROM 寫入比較慢,必須等到10ms后再寫下一個字節 */
}/*** @brief       檢查AT24CXX是否正常*   @note      檢測原理: 在器件的末地址寫如0X55, 然后再讀取, 如果讀取值為0X55*              則表示檢測正常. 否則,則表示檢測失敗.** @param       無* @retval      檢測結果*              0: 檢測成功*              1: 檢測失敗*/
uint8_t at24cxx_check(void)
{uint8_t temp;uint16_t addr = EE_TYPE;temp = at24cxx_read_one_byte(addr); /* 避免每次開機都寫AT24CXX */if (temp == 0X55)   /* 讀取數據正常 */{return 0;}else    /* 排除第一次初始化的情況 */{at24cxx_write_one_byte(addr, 0X55); /* 先寫入數據 */temp = at24cxx_read_one_byte(255);  /* 再讀取數據 */if (temp == 0X55)return 0;}return 1;
}/*** @brief       在AT24CXX里面的指定地址開始讀出指定個數的數據* @param       addr    : 開始讀出的地址 對24c02為0~255* @param       pbuf    : 數據數組首地址* @param       datalen : 要讀出數據的個數* @retval      無*/
void at24cxx_read(uint16_t addr, uint8_t *pbuf, uint16_t datalen)
{while (datalen--){*pbuf++ = at24cxx_read_one_byte(addr++);}
}/*** @brief       在AT24CXX里面的指定地址開始寫入指定個數的數據* @param       addr    : 開始寫入的地址 對24c02為0~255* @param       pbuf    : 數據數組首地址* @param       datalen : 要寫入數據的個數* @retval      無*/
void at24cxx_write(uint16_t addr, uint8_t *pbuf, uint16_t datalen)
{while (datalen--){at24cxx_write_one_byte(addr, *pbuf);addr++;pbuf++;}
}

24cxx.h

#ifndef __24CXX_H
#define __24CXX_H#include "./SYSTEM/sys/sys.h"#define AT24C01     127
#define AT24C02     255
#define AT24C04     511
#define AT24C08     1023
#define AT24C16     2047
#define AT24C32     4095
#define AT24C64     8191
#define AT24C128    16383
#define AT24C256    32767/* 開發板使用的是24c02,所以定義EE_TYPE為AT24C02 */#define EE_TYPE     AT24C02void at24cxx_init(void);        /* 初始化IIC */
uint8_t at24cxx_check(void);    /* 檢查器件 */
uint8_t at24cxx_read_one_byte(uint16_t addr);                       /* 指定地址讀取一個字節 */
void at24cxx_write_one_byte(uint16_t addr,uint8_t data);            /* 指定地址寫入一個字節 */
void at24cxx_write(uint16_t addr, uint8_t *pbuf, uint16_t datalen); /* 從指定地址開始寫入指定長度的數據 */
void at24cxx_read(uint16_t addr, uint8_t *pbuf, uint16_t datalen);  /* 從指定地址開始讀出指定長度的數據 */#endif

main.c

#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./USMART/usmart.h"
#include "./BSP/LED/led.h"
#include "./BSP/LCD/lcd.h"
#include "./BSP/KEY/key.h"
#include "./BSP/24CXX/24cxx.h"/* 要寫入到24c02的字符串數組 */
const uint8_t g_text_buf[] = {"STM32 IIC TEST"};
#define TEXT_SIZE       sizeof(g_text_buf)  /* TEXT字符串長度 */int main(void)
{uint8_t key;uint16_t i = 0;uint8_t datatemp[TEXT_SIZE];HAL_Init();                                 /* 初始化HAL庫 */sys_stm32_clock_init(RCC_PLL_MUL9);         /* 設置時鐘, 72Mhz */delay_init(72);                             /* 延時初始化 */usart_init(115200);                         /* 串口初始化為115200 */usmart_dev.init(72);                        /* 初始化USMART */led_init();                                 /* 初始化LED */lcd_init();                                 /* 初始化LCD */key_init();                                 /* 初始化按鍵 */at24cxx_init();                             /* 初始化24CXX */lcd_show_string(30, 50, 200, 16, 16, "STM32", RED);lcd_show_string(30, 70, 200, 16, 16, "IIC TEST", RED);lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);lcd_show_string(30, 110, 200, 16, 16, "KEY1:Write  KEY0:Read", RED);    /* 顯示提示信息 */while (at24cxx_check()) /* 檢測不到24c02 */{lcd_show_string(30, 130, 200, 16, 16, "24C02 Check Failed!", RED);delay_ms(500);lcd_show_string(30, 130, 200, 16, 16, "Please Check!      ", RED);delay_ms(500);LED0_TOGGLE();      /* 紅燈閃爍 */}lcd_show_string(30, 130, 200, 16, 16, "24C02 Ready!", RED);while (1){key = key_scan(0);if (key == KEY1_PRES)   /* KEY1按下,寫入24C02 */{lcd_fill(0, 150, 239, 319, WHITE);  /* 清除半屏 */lcd_show_string(30, 150, 200, 16, 16, "Start Write 24C02....", BLUE);at24cxx_write(0, (uint8_t *)g_text_buf, TEXT_SIZE);lcd_show_string(30, 150, 200, 16, 16, "24C02 Write Finished!", BLUE);   /* 提示傳送完成 */}if (key == KEY0_PRES)   /* KEY0按下,讀取字符串并顯示 */{lcd_show_string(30, 150, 200, 16, 16, "Start Read 24C02.... ", BLUE);at24cxx_read(0, datatemp, TEXT_SIZE);lcd_show_string(30, 150, 200, 16, 16, "The Data Readed Is:  ", BLUE);   /* 提示傳送完成 */lcd_show_string(30, 170, 200, 16, 16, (char *)datatemp, BLUE);          /* 顯示讀到的字符串 */}i++;if (i == 20){LED0_TOGGLE();  /* 紅燈閃爍 */i = 0;}delay_ms(10);}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/714340.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/714340.shtml
英文地址,請注明出處:http://en.pswp.cn/news/714340.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

汽車虛擬仿真技術的實現、應用和未來

汽車虛擬仿真技術是一種利用計算機模擬汽車運行的技術&#xff0c;以實現對汽車行為的分析、評估和改進。汽車虛擬仿真技術是汽車工業中重要的開發設計和測試工具&#xff0c;可以大大縮短產品研發周期、降低研發成本和提高產品質量。本文將從汽車虛擬仿真技術的實現過程、應用…

Ubuntu18.04 系統上配置并運行SuperGluePretrainedNetwork(僅使用CPU)

SuperGlue是Magic Leap在CVPR 2020上展示的研究項目&#xff0c;它是一個圖神經網絡&#xff08;Graph Neural Network&#xff09;和最優匹配層&#xff08;Optimal Matching layer&#xff09;的結合&#xff0c;訓練用于對兩組稀疏圖像特征進行匹配。這個項目提供了PyTorch代…

前端的文字的字體應該如何設置

要設置文字的字體&#xff0c;在CSS中使用font-family屬性。這個屬性可以接受一個或多個字體名稱作為其值&#xff0c;瀏覽器會按照列表中的順序嘗試使用這些字體渲染文本。如果第一個字體不可用&#xff0c;瀏覽器會嘗試使用列表中的下一個字體&#xff0c;依此類推。 字體設…

iOS消息發送流程

Objc的方法調用基于消息發送機制。即Objc中的方法調用&#xff0c;在底層實際都是通過調用objc_msgSend方法向對象消息發送消息來實現的。在iOS中&#xff0c; 實例對象的方法主要存儲在類的方法列表中&#xff0c;類方法則是主要存儲在原類中。 向對象發送消息&#xff0c;核心…

推薦一個屏幕上鼠標高亮顯示的小工具

在視頻錄制等特定場景下&#xff0c;很多人希望在點擊鼠標時能夠在屏幕上及時進行顯示&#xff0c;便于別人發現&#xff0c;提高別人的注意力。 因此&#xff0c;很多錄屏軟件中都內含顯示鼠標點擊功能。那如果不支持該怎么辦呢&#xff1f;其實&#xff0c;也是可以通過其他工…

Python 實現Excel自動化辦公(上)

在Python 中你要針對某個對象進行操作&#xff0c;是需要安裝與其對應的第三方庫的&#xff0c;這里對于Excel 也不例外&#xff0c;它也有對應的第三方庫&#xff0c;即xlrd 庫。 什么是xlrd庫 Python 操作Excel 主要用到xlrd和xlwt這兩個庫&#xff0c;即xlrd是讀Excel &am…

算法刷題day20:二分系列

目錄 引言概念一、借教室二、分巧克力三、管道四、技能升級五、冶煉金屬六、數的范圍七、最佳牛圍欄 引言 這幾天一直在做二分的題&#xff0c;都是上了難度的題目&#xff0c;本來以為自己的二分水平已經非常熟悉了&#xff0c;沒想到還是糊涂了一兩天才重新想清楚&#xff0…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的口罩識別系統(Python+PySide6界面+訓練代碼)

摘要&#xff1a;開發口罩識別系統對于提升公共衛生安全和疫情防控具有重要意義。本篇博客詳細介紹了如何利用深度學習構建一個口罩識別系統&#xff0c;并提供了完整的實現代碼。該系統基于強大的YOLOv8算法&#xff0c;并結合了YOLOv7、YOLOv6、YOLOv5的對比&#xff0c;給出…

Linux:syslog()的使用和示例

man手冊 命令行man openlog即可查看;寫的非常詳細&#xff0c;看完其實就懂了。 NAME closelog, openlog, syslog, vsyslog - send messages to the system logger SYNOPSIS #include <syslog.h> void openlog(const char *ident, int option, int facili…

刷題筆記day27-回溯算法2

216. 組合總和 III 這個思路還是&#xff0c;三部曲&#xff1a; 終止條件處理單層節點回溯節點 題中說的是&#xff0c;1到9的數&#xff0c;不能有重復。 k個數&#xff0c;和為n。 那么只要 len(path) k 的時候&#xff0c;判斷 n 為0&#xff0c;就可以入切片了。 fun…

如何更好的引導大語言模型進行編程的高效開發流程?

這張圖片展示了一種如何更好地引導大語言模型進行編程的方法。 首先&#xff0c;最簡單也是最有效的方法是讓大語言模型重復運行多次&#xff0c;每次增加一些額外的信息&#xff0c;直到獲得想要的結果。這種方法雖然簡單&#xff0c;但可能需要多次嘗試才能得到滿意的結果。…

2024綠色能源、城市規劃與環境國際會議(ICGESCE 2024)

2024綠色能源、城市規劃與環境國際會議(ICGESCE 2024) 一、【會議簡介】 隨著全球氣候變化和環境問題日益嚴重&#xff0c;綠色能源和可持續發展已成為全球關注的焦點。本次會議旨在匯聚全球在綠色能源、城市規劃與環境領域的專家、學者和實踐者&#xff0c;共同探討和分享關于…

Vue.js大師: 構建動態Web應用的全面指南

VUE ECMAScript介紹什么是ECMAScriptECMAScript 和 JavaScript 的關系ECMAScript 6 簡介 ES6新特性let基本使用const不定參數箭頭函數對象簡寫模塊化導出導入a.jsb.jsmain.js Vue簡介MVVM 模式的實現者——雙向數據綁定模式 Vue環境搭建在頁面引入vue的js文件即可。創建div元素…

1、jQuery介紹、css()、選擇器、事件、動畫

一、jQuery介紹&#xff1f; 1、什么是jQuery&#xff1f; 是一個JavaScript函數庫 2、jQuery特點 寫的少&#xff0c;做的多 3、jQuery的安裝 直接下載引入 <script src"jquery-1.10.2.min.js"></script>通過cdn引入 <script src"https…

python自動化之項目架構搭建與思路講解(第二天)

1.自動化測試的概念 自動化測試是指使用自動化工具和腳本來執行測試任務,以驗證軟件或系統的正確性和穩定性。它可以提高測試的效率和準確性,并節約時間和成本。 2.自動化腳本編寫的思路 xmind文檔如有需要,可在資源里自行下載 3.項目代碼工程創建 lib :基本代碼庫包 …

[滲透教程]-013-嗅探工具-wireshark操作

文章目錄 tor下載wireshark抓包類型啟動場景實戰tor下載 tor下載鏈接 zlibary暗網地址 2681506@gmail.com YanErrol123@wireshark Wireshark是網絡封包分析軟件,可以抓包.可以 使用winpcap與網卡直接進行數據交換.作用: 網絡管理員使用wireshark來檢測網絡問題,網絡工程師使用…

瑞_Redis_Redis命令

文章目錄 1 Redis命令Redis數據結構Redis 的 key 的層級結構1.0 Redis通用命令1.0.1 KEYS1.0.2 DEL1.0.3 EXISTS1.0.4 EXPIRE1.0.5 TTL 1.1 String類型1.1.0 String類型的常見命令1.1.1 SET 和 GET1.1.2 MSET 和 MGET1.1.3 INCR和INCRBY和DECY1.1.4 SETNX1.1.5 SETEX 1.2 Hash類…

Android 12.0 framework關于systemUI定制之導航欄透明背景的功能實現

1.概述 在12.0的系統rom產品定制化開發中,在對于系統原生SystemUI的導航欄背景在沉浸式導航欄的 情況下默認是會隨著背景顏色的變化而改變的,在一些特定背景下導航欄的背景也是會改變的,所以由于產品開發需要 要求需要設置導航欄背景為透明的,所以就需要在Activity創建的時…

《秦時明月》IP新高度:與陜西歷史博物館共同書寫文化傳承新篇章!

在IP產業風起云涌的今天&#xff0c;如何以創意和匠心為傳統文化注入新的活力&#xff0c;成為了擺在每一位文化工作者面前的重要課題。近日&#xff0c;《秦時明月》作為一部深受觀眾喜愛的國產動畫IP&#xff0c;在迎來其十七周年之際&#xff0c;聯手陜西歷史博物館&#xf…

c++11 標準模板(STL)(std::tuple)(二)

定義于頭文件 <tuple> template< class... Types > class tuple; (C11 起) 類模板 std::tuple 是固定大小的異類值匯集。它是 std::pair 的推廣。 若 (std::is_trivially_destructible_v<Types> && ...) 為 true &#xff0c;則 tuple 的析構函數是…