STM32CubeMX + HAL 庫:用硬件IIC接口實現AT24C02 EEPROM芯片的讀寫操作

1 概述

1.1 實驗目的

????????本實驗旨在通過?STM32 微控制器的硬件 I2C 接口,對?AT24C02 外部 EEPROM 存儲芯片?進行讀寫操作。實驗演示了芯片地址配置、單字節/多字節讀寫、跨頁寫入(Page Write)功能。并提供完整的驅動代碼,幫助讀者深入理解?STM32 硬件 I2C 通信協議?的工作機制,并掌握基于?I2C 總線的低速存儲設備?的數據存儲與訪問方法。

????????通過本實驗,讀者不僅可以掌握?I2C 接口的基本使用技巧,還能夠熟悉?AT24C02 的命令結構、存儲特性及應用方法。這對于日后在嵌入式系統開發中涉及?小容量數據存儲(如配置參數、掉電保存數據、傳感器校準值等)?提供了技術積累和實踐基礎,具有良好的工程指導意義。

1.2 IIC協議

????????I2C(Inter-Integrated Circuit)是一種同步、半雙工、多主多從的串行通信協議。它通過兩根信號線(SCL時鐘線、SDA數據線)實現設備間通信,廣泛應用于傳感器、存儲器、顯示器等低速外設與主控制器(如MCU)的連接。接口引腳

引腳名稱全稱功能說明方向特點
SCLSerial Clock串行時鐘信號,由主設備(Master)產生,用于同步數據傳輸主輸出從輸入開漏/開集電極輸出,需要上拉電阻
SDASerial Data串行數據信號,雙向傳輸數據(主、從設備之間共用)雙向開漏/開集電極輸出,需要上拉電阻

1.3 AT24C02介紹

1.3.1 芯片引腳

引腳號名稱功能說明
1A0器件地址選擇引腳(Address Input 0),用于設定 I2C 從機地址的低位。可接 GND 或 VCC。
2A1器件地址選擇引腳(Address Input 1),作用同 A0。
3A2器件地址選擇引腳(Address Input 2),作用同 A0。
4GND電源地。
5SDA串行數據線(Serial Data)。I2C 雙向數據線,開漏輸出,需要上拉電阻。
6SCL串行時鐘線(Serial Clock)。由 I2C 主機產生,開漏輸出,需要上拉電阻。
7WP寫保護(Write Protect)。高電平時禁止寫操作(只讀),低電平時可讀可寫。
8VCC電源正極(常用 2.7V–5.5V)。

1.3.2 芯片地址

????????AT24C 系列 EEPROM 的 I2C 從機地址由固定的高 4 位(1010)和由引腳 A2、A1、A0 決定的 3 位地址位組成,最后一位是讀寫控制位(R/W)。A0~A2 引腳可接高電平(VCC)或低電平(GND)來改變芯片地址,從而在同一總線上使用多個 EEPROM 設備。

  • 寫操作地址:R/W = 0

  • 讀操作地址:R/W = 1

因此,芯片最多可以有8種地址,枚舉如下

A2A1A07 位地址(十六進制)寫地址(8 位)讀地址(8 位)
0000x500xA00xA1
0010x510xA20xA3
0100x520xA40xA5
0110x530xA60xA7
1000x540xA80xA9
1010x550xAA0xAB
1100x560xAC0xAD
1110x570xAE0xAF

1.3.3?其他型號

型號尋址范圍頁大小(Byte)頁數量總容量(Byte)總容量(Kbit)
AT24C010x00 – 0x7F8161281 Kbit
AT24C020x00 – 0xFF8322562 Kbit
AT24C040x000 – 0x1FF16325124 Kbit
AT24C080x000 – 0x3FF166410248 Kbit
AT24C160x000 – 0x7FF16128204816 Kbit
AT24C320x0000 – 0x0FFF32128409632 Kbit
AT24C640x0000 – 0x1FFF32256819264 Kbit
AT24C1280x0000 – 0x3FFF6425616384128 Kbit
AT24C2560x0000 – 0x7FFF6451232768256 Kbit
AT24C5120x0000 – 0xFFFF12851265536512 Kbit

注:在閱讀芯片資料時,AT24C02的頁大小是8字節,但在實際測試過程中,我發現芯片頁大小其實是16字節。其實是芯片版本不同導致的,我芯片具體型號是Atmel327 24C02BN 其中?“24C02BN” 里的 B 版本,就是 16 Byte 頁大小的版本。而 N 一般表示封裝(SOIC、PDIP、TSSOP 等)及無鉛環保版本,不影響存儲結構。

版本標識頁大小總容量備注
AT24C02A / AT24C02C8 Byte256 Byte經典版本,很多資料引用這個
AT24C02B / AT24C02BN16 Byte256 Byte后期改進版,頁寫效率更高

1.3.4 與flash區別

對比項AT24C02(I2C EEPROM)W25Q32(SPI NOR Flash)
總容量256 Byte4 MByte
接口I2C(2 線)SPI(4 線)
最小寫入單元1 Byte(頁寫一次最多 8 Byte)1 Byte(頁編程一次最多 256 Byte)
最小擦除單元無需擦除,自動覆蓋4KB 扇區
擦寫機制自動擦寫,直接覆蓋擦除→寫入(1→0,0→1 需擦除)
寫入延遲固定 5ms 左右/頁寫擦除慢(50~150ms),寫快(<1ms)
壽命100 萬次寫/字節10 萬次擦/扇區
斷電數據保持典型 100 年典型 20 年
使用場景小容量配置存儲大容量固件、資源存儲

????????AT24C02芯片是EEPROM類型芯片,寫入不用擦除,相對方便,字節在對應地址中寫入數據即可,如果原來有就覆蓋。

2. STM32CubeMX 配置

2.1 SYS配置

不管你用的是STLink 還是JLink,都屬于并行調試下載,所以在配置SYS時,均以下圖為準。

2.2 RCC配置

2.3 USART配置

用于串口打印日志,調試用

2.4 IIC配置

????????由于芯片連接的是stm32通用引腳PB10和PB11,這兩個引腳的復用接口是stm32第二個IIC的接口,所以此處配置要選IIC2和硬件連線相匹配。

2.5 project配置

3. Keil MDK配置

3.1 debug配置

?根據自己的下載器選擇debug現象,作者用的JLink

避免每次下載完程序后,還要按復位鍵才能跑最新程序

3.2 target配置

為了使用串口進行調試重定向打印調試信息,在target設置卡中引入LIB包

3.3 新增文件夾及文件

3.4 配置工程目錄

3.5 配置工程文件

4. VSCode代碼

4.1 驅動文件

#include "at24c02.h"
#include "string.h"
/**
特性	    M24C02 (2Kbit)	        M24C32 (32Kbit)
容量	    256字節 (0x00-0xFF)	    4096字節 (0x000-0xFFF)
地址位寬	8位地址	                16位地址(需2字節)
頁大小	    16字節/頁	            32字節/頁
頁數量      16頁                    128頁
設備地址	固定(A2-A0=0)	        固定(A2-A0=0)24C32
第 0 頁:0x0000 ~ 0x001F(32 字節)
第 1 頁:0x0020 ~ 0x003F(32 字節)
第 2 頁:0x0040 ~ 0x005F(32 字節)
...
第 127 頁:0x0F80 ~ 0x0FFF(32 字節)
總字節數:128 頁 × 32 字節/頁 = 4,096 字節(與 AT24C32 容量一致)。24C02
第 0 頁:0x00 ~ 0x0F(16 字節)
第 1 頁:0x10 ~ 0x1F(16 字節)
第 2 頁:0x20 ~ 0x2F(16 字節)
...
第 15 頁:0xF0 ~ 0xFF(16 字節)
總字節數:16 頁 × 16 字節/頁 = 256 字節(與 AT24C02 容量一致)。*///向EEPROM寫入一個字節
void AT24C02_WriteByte(uint8_t innerAddr, uint8_t byte){HAL_I2C_Mem_Write(&hi2c2, W_ADDR, innerAddr, I2C_MEMADD_SIZE_8BIT , &byte , 1 , 1000);// 延遲等待寫入周期結束HAL_Delay(5);
}
//讀取EEPROM一個字節
uint8_t AT24C02_ReadByte(uint8_t innerAddr){uint8_t byte;HAL_I2C_Mem_Read(&hi2c2, R_ADDR, innerAddr, I2C_MEMADD_SIZE_8BIT , &byte , 1 ,1000);return byte;
}
//連續寫入多個字節(頁寫入)
void AT24C02_WriteBytes(uint8_t innerAddr, uint8_t *bytes, uint8_t size){HAL_I2C_Mem_Write(&hi2c2, W_ADDR, innerAddr, I2C_MEMADD_SIZE_8BIT , bytes, size , 1000);// 延遲等待寫入周期結束HAL_Delay(5);
}
//連續讀出多個字節(頁讀出 等價于 跨頁讀出)
void AT24C02_ReadBytes(uint8_t innerAddr, uint8_t *buffer, uint8_t size){HAL_I2C_Mem_Read(&hi2c2, R_ADDR, innerAddr, I2C_MEMADD_SIZE_8BIT , buffer , size ,1000);
}
//跨頁寫入
void AT24C02_WriteBytesPro(uint8_t innerAddr, uint8_t *data, uint8_t size) {while (size > 0) {uint8_t page_offset = innerAddr % EEPROM_PAGE_SIZE;  // AT24C02 頁大小通常是 8 或 16uint8_t page_space = EEPROM_PAGE_SIZE - page_offset;uint8_t bytes_to_write = (size < page_space) ? size : page_space;// 使用 HAL_I2C_Mem_Write 自動處理地址HAL_I2C_Mem_Write(&hi2c2, W_ADDR, innerAddr, I2C_MEMADD_SIZE_8BIT,data, bytes_to_write, HAL_MAX_DELAY);HAL_Delay(5);  // AT24C02 寫入需要 5ms// 更新指針和剩余長度innerAddr += bytes_to_write;  // 確保這里正確遞增data += bytes_to_write;size -= bytes_to_write;}
}
#ifndef __AT24C02_H__
#define __AT24C02_H__#include "i2c.h"#define W_ADDR 0xA0
#define R_ADDR 0xA1
// 每頁寫入限制大小16字節
#define EEPROM_PAGE_SIZE 16//向EEPROM寫入一個字節
void AT24C02_WriteByte(uint8_t innerAddr, uint8_t byte);
//讀取EEPROM一個字節
uint8_t AT24C02_ReadByte(uint8_t innerAddr);
//連續寫入多個字節(頁寫入)
void AT24C02_WriteBytes(uint8_t innerAddr, uint8_t * bytes, uint8_t size);
//連續讀出多個字節(可跨頁讀出)
void AT24C02_ReadBytes(uint8_t innerAddr, uint8_t * buffer, uint8_t size);//跨頁寫入函數
void AT24C02_WriteBytesPro(uint8_t innerAddr, uint8_t *data, uint8_t size);
#endif

4.2 usart重定向代碼

/* USER CODE BEGIN Header */
/********************************************************************************* @file    usart.c* @brief   This file provides code for the configuration*          of the USART instances.******************************************************************************* @attention** Copyright (c) 2025 STMicroelectronics.* All rights reserved.** This software is licensed under terms that can be found in the LICENSE file* in the root directory of this software component.* If no LICENSE file comes with this software, it is provided AS-IS.********************************************************************************/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "usart.h"/* USER CODE BEGIN 0 *//* USER CODE END 0 */UART_HandleTypeDef huart1;/* USART1 init function */void MX_USART1_UART_Init(void)
{/* USER CODE BEGIN USART1_Init 0 *//* USER CODE END USART1_Init 0 *//* USER CODE BEGIN USART1_Init 1 *//* USER CODE END USART1_Init 1 */huart1.Instance = USART1;huart1.Init.BaudRate = 115200;huart1.Init.WordLength = UART_WORDLENGTH_8B;huart1.Init.StopBits = UART_STOPBITS_1;huart1.Init.Parity = UART_PARITY_NONE;huart1.Init.Mode = UART_MODE_TX_RX;huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;huart1.Init.OverSampling = UART_OVERSAMPLING_16;if (HAL_UART_Init(&huart1) != HAL_OK){Error_Handler();}/* USER CODE BEGIN USART1_Init 2 *//* USER CODE END USART1_Init 2 */}void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
{GPIO_InitTypeDef GPIO_InitStruct = {0};if(uartHandle->Instance==USART1){/* USER CODE BEGIN USART1_MspInit 0 *//* USER CODE END USART1_MspInit 0 *//* USART1 clock enable */__HAL_RCC_USART1_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();/**USART1 GPIO ConfigurationPA9     ------> USART1_TXPA10     ------> USART1_RX*/GPIO_InitStruct.Pin = GPIO_PIN_9;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);GPIO_InitStruct.Pin = GPIO_PIN_10;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_NOPULL;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);/* USART1 interrupt Init */HAL_NVIC_SetPriority(USART1_IRQn, 4, 0);HAL_NVIC_EnableIRQ(USART1_IRQn);/* USER CODE BEGIN USART1_MspInit 1 *//* USER CODE END USART1_MspInit 1 */}
}void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle)
{if(uartHandle->Instance==USART1){/* USER CODE BEGIN USART1_MspDeInit 0 *//* USER CODE END USART1_MspDeInit 0 *//* Peripheral clock disable */__HAL_RCC_USART1_CLK_DISABLE();/**USART1 GPIO ConfigurationPA9     ------> USART1_TXPA10     ------> USART1_RX*/HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10);/* USART1 interrupt Deinit */HAL_NVIC_DisableIRQ(USART1_IRQn);/* USER CODE BEGIN USART1_MspDeInit 1 *//* USER CODE END USART1_MspDeInit 1 */}
}/* USER CODE BEGIN 1 */
int fputc(int ch, FILE * file){ //打印重定向HAL_UART_Transmit(&huart1,(uint8_t*)&ch,1,1000);return ch;
}
/* USER CODE END 1 */
/* USER CODE BEGIN Header */
/********************************************************************************* @file    usart.h* @brief   This file contains all the function prototypes for*          the usart.c file******************************************************************************* @attention** Copyright (c) 2025 STMicroelectronics.* All rights reserved.** This software is licensed under terms that can be found in the LICENSE file* in the root directory of this software component.* If no LICENSE file comes with this software, it is provided AS-IS.********************************************************************************/
/* USER CODE END Header */
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __USART_H__
#define __USART_H__#ifdef __cplusplus
extern "C" {
#endif/* Includes ------------------------------------------------------------------*/
#include "main.h"/* USER CODE BEGIN Includes */
#include "stdio.h" 
/* USER CODE END Includes */extern UART_HandleTypeDef huart1;/* USER CODE BEGIN Private defines *//* USER CODE END Private defines */void MX_USART1_UART_Init(void);/* USER CODE BEGIN Prototypes *//* USER CODE END Prototypes */#ifdef __cplusplus
}
#endif#endif /* __USART_H__ */

4.3 主函數

/* USER CODE BEGIN Header */
/********************************************************************************* @file           : main.c* @brief          : Main program body******************************************************************************* @attention** Copyright (c) 2025 STMicroelectronics.* All rights reserved.** This software is licensed under terms that can be found in the LICENSE file* in the root directory of this software component.* If no LICENSE file comes with this software, it is provided AS-IS.********************************************************************************/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "i2c.h"
#include "usart.h"
#include "gpio.h"/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "at24c02.h"
/* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD *//* USER CODE END PTD *//* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD *//* USER CODE END PD *//* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ---------------------------------------------------------*//* USER CODE BEGIN PV *//* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP *//* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 *//* USER CODE END 0 *//*** @brief  The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_USART1_UART_Init();MX_I2C2_Init();/* USER CODE BEGIN 2 */printf("hello my at24c02\t\n");//讀寫單個字節AT24C02_WriteByte(0x00,'A');uint8_t byte1 = AT24C02_ReadByte(0x00);printf("byte1= %c\t" , byte1);// 讀寫多個字節AT24C02_WriteBytes(0x00,"123456",6);uint8_t buffer[100] = {0};AT24C02_ReadBytes(0x00,buffer,6);printf("buffer= %s\n" , buffer);// 跨頁讀寫uint8_t bufferPro[256] = {0};AT24C02_WriteBytesPro(0x00,"Hello darkness, my old friend,I've come to talk with you again,Because a vision softly creeping, Left its seeds while I was sleeping, And the vision that was planted in my brain Still remains Within the sound of silence.",255);AT24C02_ReadBytes(0x00,bufferPro,255);printf("bufferPro= %s\n" , bufferPro);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */HAL_Delay(3000);}/* USER CODE END 3 */
}/*** @brief System Clock Configuration* @retval None*/
void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};/** Initializes the RCC Oscillators according to the specified parameters* in the RCC_OscInitTypeDef structure.*/RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;RCC_OscInitStruct.HSIState = RCC_HSI_ON;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}/** Initializes the CPU, AHB and APB buses clocks*/RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK){Error_Handler();}
}/* USER CODE BEGIN 4 *//* USER CODE END 4 *//*** @brief  This function is executed in case of error occurrence.* @retval None*/
void Error_Handler(void)
{/* USER CODE BEGIN Error_Handler_Debug *//* User can add his own implementation to report the HAL error return state */__disable_irq();while (1){}/* USER CODE END Error_Handler_Debug */
}#ifdef  USE_FULL_ASSERT
/*** @brief  Reports the name of the source file and the source line number*         where the assert_param error has occurred.* @param  file: pointer to the source file name* @param  line: assert_param error line source number* @retval None*/
void assert_failed(uint8_t *file, uint32_t line)
{/* USER CODE BEGIN 6 *//* User can add his own implementation to report the file name and line number,ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) *//* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

5. 結論

????????本次實驗?成功驗證了 AT24C02 EEPROM 的基本讀寫功能,包括單字節、多字節連續讀寫和跨頁讀寫。通過STM32硬件I2C 協議與芯片通信,確保了數據存儲的準確性和可靠性。實驗結果符合預期,為后續?數據掉電存儲、傳感器數據記錄?等應用奠定了基礎。注意事項:

  • I2C 地址參數:AT24C02 必須使用?I2C_MEMADD_SIZE_8BIT
  • 頁邊界處理:跨頁寫入需分頁處理,避免數據丟失,芯片24C02帶后綴B版本頁大小為16字節。
  • 寫入延遲:EEPROM 寫入后需等待?5ms?確保數據固化。
  • 芯片地址:注意查看芯片地址引腳接線,判斷地址。

????????如果讀者采用AT24C32芯片,那么上述驅動文件是不可共用的,因為AT24C32的地址是兩個字節,且頁存儲為32字節,共128頁,總存儲32Kbit,是AT24C02的16倍,存儲空間結構完全不同。如果讀者感興趣,可以評論區留言,作者提供AT24C32相關的驅動文件。

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

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

相關文章

基于Android的音樂播放器/基于android studio的音樂系統/音樂管理系統

原生APP安卓開發設計之基于Android的音樂播放器/音樂系統/音樂管理系統[springboot]android studio

OmniHuman:字節推出的AI項目,支持單張照片生成逼真全身動態視頻

本文轉載自&#xff1a;OmniHuman&#xff1a;字節推出的AI項目&#xff0c;支持單張照片生成逼真全身動態視頻 - Hello123。 ** 一、核心產品定位 OmniHuman 是字節跳動研發的 AI 視頻生成技術&#xff0c;通過單張圖像&#xff08;真人 / 動漫 / 3D 角色&#xff09;和音頻…

5種無需USB線將照片從手機傳輸到筆記本電腦的方法

Android手機和平板電腦非常適合查看照片&#xff0c;因為這些移動設備可以隨身攜帶&#xff0c;隨時隨地查看文件。然而&#xff0c;移動設備的存儲空間非常有限&#xff0c;而且很容易丟失或損壞。因此&#xff0c;將重要的照片從Android設備傳輸到電腦進行備份是非常明智的決…

2025年滲透測試面試題總結-14(題目+回答)

安全領域各種資源&#xff0c;學習文檔&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各種好玩的項目及好用的工具&#xff0c;歡迎關注。 目錄 九十一、Android APP 逆向分析步驟 九十二、SQL注入分類 九十三、SQL注入防御 九十四、序列化與反序列化…

PG靶機 - Flu

一、初步偵察與服務識別 1.1 端口掃描 首先對目標主機 192.168.122.41 進行全端口掃描&#xff0c;以發現其上開放的網絡服務。 sudo nmap 192.168.122.41 -p- --min-rate5000 -A圖1: Nmap掃描結果&#xff0c;顯示開放22, 8090, 和 8091端口 掃描結果顯示&#xff0c;目標開放…

【Leetcode】隨筆

文章目錄題目一&#xff1a;路徑總和 II&#xff08;LeetCode 113&#xff09;題目分析&#xff1a;解題思路&#xff1a;示例代碼&#xff1a;代碼解析&#xff1a;題目二&#xff1a;顏色分類&#xff08;LeetCode 75&#xff09;題目分析&#xff1a;解題思路&#xff1a;示…

深入 FastMCP 源碼:認識 tool()、resource() 和 prompt() 裝飾器

在使用 FastMCP 開發 MCP 服務器時經常會用到 mcp.tool() 等裝飾器。雖然它們用起來很簡單&#xff0c;但當作黑匣子總讓人感覺"不得勁"。接下來我們將深入相關的源碼實現&#xff0c;別擔心&#xff0c;不會鉆沒有意義的“兔子洞”&#xff0c;你可以通過這篇文章了…

Spring Boot 2.0 升級至 3.5 JDK 1.8 升級至 17 全面指南

一、版本升級背景升級動機 Spring Boot 2.0 到 3.5 的重大更新&#xff08;如Jakarta EE 9包路徑變更、GraalVM支持等&#xff09;JDK 1.8 到 17 的語言特性升級&#xff08;如sealed class、record等&#xff09;安全性與性能優化需求升級目標 兼容性驗證依賴庫版本適配代碼兼…

級數學習筆記

級數學習筆記 一、數學基礎 1. 數項級數&#xff08;Number Series&#xff09; 數項級數是指形如&#xff1a; ∑(n1 to ∞) a? a? a? a? ...的無窮和。 1.1 收斂性判別法 比較判別法比值判別法根值判別法積分判別法萊布尼茨判別法&#xff08;交錯級數&#xff09; 2…

Linux811 YUM;SHELL:if else fi,for

vsftpdok [rootweb ~]# vim vsftpdok.sh 您在 /var/spool/mail/root 中有新郵件 [rootweb ~]# cat vsftpdok.sh rpm -ql vsftpd >/dev/null 2>&1 if [ $? -eq 0 ];then echo "OK" else yum install vsftpd -y if [ $? -eq 0 ];then echo "install o…

運維學習Day20——MariaDB數據庫管理

文章目錄MariaDB 數據庫管理介紹 MariaDB數據庫介紹數據庫種類關系數據庫MariaDB 介紹部署 MariaDB安裝 MariaDB加固 MariaDB連接 MariaDB配置 MariaDBMariaDB 中 SQL描述 SQL連接數據庫數據庫操作查詢數據庫列表使用數據庫創建數據庫刪除數據庫表操作環境準備查詢表查詢表列表…

itertools:迭代器函數

文章目錄一、合并和分解迭代器1、chain&#xff1a;首尾相接2、zip / zip_longest&#xff1a;對齊取數3、islice&#xff1a;切片4、tee&#xff1a;分裂二、轉換輸入1、map / starmap&#xff1a;函數映射三、生成新值1、count&#xff1a;生成連續整數2、repeat&#xff1a;…

【AI論文】序列標注任務廣義化研究(SFT廣義化):基于獎勵修正的強化學習視角

摘要&#xff1a;我們針對大語言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;的監督微調&#xff08;Supervised Fine-Tuning&#xff0c;SFT&#xff09;提出了一種簡單但具有理論依據的改進方法&#xff0c;以解決其與強化學習&#xff08;Reinforcemen…

(已解決)Mac 終端上配置代理

說明&#xff1a;為了便于理解&#xff0c;本文描述略顯“抽象”與“潦草”&#xff0c;為了過審&#xff0c;僅供學習交流使用。&#x1f680; 簡潔流程版啟動工具 點擊圖標&#xff0c;復制它給出的終端命令將這段內容粘貼進你的配置文件中&#xff08;~/.zshrc 或 ~/.bash_p…

Anti-Aliasing/Mip-NeRF/Zip-NeRF/multi-scale representation

前言 CSDN的文章寫太多&#xff0c;都不記得之前寫的有什么了&#xff0c;但習慣了在這里記錄&#xff0c;先寫上吧。關于multi-scale representation又是看著忘著&#xff0c;還是寫下點什么比較啊。時看時新&#xff0c;還是想吐槽自己看論文太不認真了。下面直接按照文章順序…

板塊三章節3——NFS 服務器

NFS 服務器 NFS 服務介紹 NFS 是Network File System的縮寫&#xff0c;即網絡文件系統&#xff0c;最早由Sun公司開發&#xff0c;**用來在UNIX&Linux系統間實現磁盤文件共享的一種方法。**它的主要功能是通過網絡讓不同的主機系統之間可以共享文件或目錄。NFS客戶端&…

數學建模——最大最小化模型

1.概念最大最小化模型&#xff08;Maximin Model&#xff09;是一種優化方法&#xff0c;旨在最大化最壞情況下的收益或最小化最壞情況下的損失。常見的現實問題有&#xff1a;求最大值的最小化問題最大風險的最低限度最小化最壞情況下的損失等2.一般數學模型 (找最大值里面最小…

【JAVA】使用系統音頻設置播放音頻

代碼直接可以運行 import javax.sound.sampled.*; import java.io.File; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.nio.charset.StandardCharsets;public class SystemDefaultAudioPlayer {// 強制使用的通用音頻格式private st…

[CSP-J 2021] 小熊的果籃

題目 12代碼 #include <bits/stdc.h> using namespace std; const int N2e55; struct node{int pre,//上一個水果塊(對于水果就是上個水果)l,//塊開始的序號&#xff0c;左邊界 d,//塊類型&#xff0c;0/1id,//水果序號 r,//塊結束的序號&#xff0c;右邊界 next;//下一塊…

【C++】STL二叉搜索樹——map與set容器的基礎結構

目錄 前言 1.二叉搜索樹的概念 1.1基本結構 1.2性能分析 2.二叉搜索樹的實現 2.1創建 2.2插入 2.3查找與遍歷 2.4刪除 3.二叉搜索樹類代碼 前言 C中STL的map與set容器廣泛應用于實踐過程中&#xff0c;本文將詳細分析容器最基礎的二叉搜索樹結構&#xff0c;為后續map…