單片機-STM32部分:12、I2C

飛書文檔https://x509p6c8to.feishu.cn/wiki/MsB7wLebki07eUkAZ1ec12W3nsh

一、簡介

IIC協議,又稱I2C協議,是由PHILP公司在80年代開發的兩線式串行總線,用于連接微控制器及其外圍設備,IIC屬于半雙工同步通信方式。

IIC是一種同步的串行通信總線協議它可以在多個設備之間傳輸數據。IIC總線由兩根線組成:數據線(SDA)和時鐘線(SCL)。它使用主從模式,其中一個設備作為主設備控制總線并向其他設備發出命令。IIC協議可以支持高速數據傳輸和多設備通信,但它的距離限制較短。
UART是一種異步的串行通信協議,它用于在兩個設備之間傳輸數據。UART協議使用兩根線:TX(發送)和RX(接收)。UART沒有時鐘線,數據傳輸的時序是通過發送和接收設備之間的協議約定實現的。UART協議通常用于短距離通信,例如在計算機和串口設備之間進行通信。
因此,IIC和UART協議在通信的方式、數據傳輸速度和距離限制等方面存在差異,根據具體的應用場景和需求選擇合適的協議更為重要。

多主控(multimastering)

其中任何能夠進行發送和接收的設備都可以成為主總線,一個主控能夠控制信號的傳輸和時鐘頻率。當然,在任何時間點上只能有一個主控。

特征:簡單性和有效性

兩根線,在標準模式下,I2C總線的最大長度為5米,最大速率為100 kbit/s。在快速模式下,I2C總線的最大長度為1米,最大速率為400 kbit/s。在高速模式下,I2C總線的最大長度為0.4米,最大速率為3.4 Mbit/s。需要注意的是,總線長度的實際限制還取決于總線上的電容負載和電纜質量等因素。

IIC完成的通訊過程如下:

IIC完整的通訊過程

  1. 1、總線是空閑狀態,SCL=1,SDA =1;
  2. 2、要開始傳輸數據了,此時SCL還是高電平,SCL=1,主機將SDA從1變成0;
  3. 3、跟哪個從機通訊,把從機的地址發出去。一般地址是8個bit(也有16個bit的),這8個bit其實真實的地址是7個bit,最后1個bit是用來表示讀或者寫的。1表示讀,0表示寫;這個過程相當于主機往SDA上發了8個bit的數據(地址也是數據啊);
  4. 4、主機發地址的過程,相當于在找從機,從機是要給應答信號的,就是ACK,你老板喊你,你也得先回答聲A吧;
  5. 5、應答之后,就是要傳輸數據了,如果第3步中發的地址是寫操作,那就由主機來控制SDA的電平變化,如果第3步中發的地址是讀操作,那就由從機來控制SDA的電平變化;
  6. 6、每次8bit的數據傳輸完成,都要有個應答信號,誰接收數據,誰來應答
  7. 7、完事之后,在SCL高電平時,主機把SDA從低電平拉高,表示結束。

STM32中的I2C

STM32 芯片有多個 I2C 外設,它們的 I2C 通訊信號引出到不同的 GPIO 引腳上,使用時必須配置到這些指定的引腳。

SMBus(系統管理總線—System Management Bus)

SMBus總線和I2C是比較類似的,所以STM32兼容了這兩種設計,一般場景比較少用SMBus,I2C則是非常多外設使用的接口,我們本節課以I2C為主,看看如何使用STM32的I2C功能。

選擇為I2C功能后,會自動選擇對應的IO作為I2C的IO,這里I2C是支持重映射的,我們可以根據需要手動修改。

然后,我們可以設置I2C的主從模式,這里我們設置主機模式,模式為Standard Mode,速率為100000Hz。

Master?features?主模式特性

Master 為主機模式相關參數,如果是驅動觸摸屏、傳感器、EEPROM等外設,只需配置這里的參數。

Slave 為從機模式相關參數,如果是開發觸摸屏,傳感器本身,則需要配置從機參數。


?

Standard Mode:標準模式

Fast Mode:高速模式

這兩種模式支持的通訊速率不同,在標準模式中,最大只能設置100KHz,作為主機時,速率大小要看從機支持的最大速率,一般來說100KHz可以滿足上述的觸摸屏、傳感器、EEPROM的驅動。

Slave features?從模式特性

作為主機使用時,這里無需修改

Clock?No?Stretch?Mode:?時鐘沒有擴展模式
IIC時鐘拉伸(Clock stretching):clock stretching通過將SCL線拉低來暫停一個傳輸.直到釋放SCL線為高電平,傳輸才繼續進行.clock stretching是可選的,實際上大多數從設備不包括SCL驅動,所以它們不能stretch時鐘.
Primary?Address?Length?selection:?從設備地址長度 設置從設備的地址是7bit還是10bit 大部分為7bit
Dual?Address?Acknowledged:?雙地址確認
Primary?slave?address:??從設備初始地址

然后就可以生成MDK工程,這里主要用的函數有四個:

?HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress,
???????????????????????? uint8_t *pData, uint16_t Size, uint32_t Timeout);
功能:IIC寫數據
參數:
??? *hi2c 設置使用的是那個IIC 例:&hi2c1
??? DevAddress 寫入的地址 設置寫入數據的地址 例 0xA0
??? *pData 需要寫入的數據
??? Size 要發送的字節數
??? Timeout 最大傳輸時間,超過傳輸時間將自動退出傳輸函數

HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress,
??????????????????????? uint8_t *pData, uint16_t Size, uint32_t Timeout);
功能:IIC讀一個字節
參數:
??? *hi2c: 設置使用的是那個IIC 例:&hi2c1
??? DevAddress: 寫入的地址 設置寫入數據的地址 例 0xA0
??? *pDat:a 存儲讀取到的數據
??? Size: 發送的字節數
??? Timeout: 最大讀取時間,超過時間將自動退出讀取函數


HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress,
????????????????? uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout);
- 功能:IIC寫多個數據,該函數適用于IIC外設里面還有子地址寄存器的地址,比如E2PROM,除了
?????? 設備地址,每個存儲字節都有其對應的地址。
- 參數:
? *hi2c????? 設置使用的是那個IIC 例:&hi2c1
? DevAddress 寫入的地址 設置寫入數據的地址 例:0xA0
? MemAddress 從機寄存器地址,每寫入一個字節數據,地址就會自動+1
? MemAddSize 從機寄存器地址字節長度 8位/16位
???????????? 寫入數據的字節類型 8位/16位
???????????? I2C_MEMADD_SIZE_8BIT
???????????? I2C_MEMADD_SIZE_16BIT
? *pData???? 需要寫入的數據的起始地址
? Size?????? 傳輸數據的大小,需要發送的字節數
? Timeout??? 最大傳輸時間,超過傳輸時間將自動退出傳輸函數
- 例如:HAL_I2C_Mem_Write(&hi2c1,ADDR,i,I2C_MEMADD_SIZE_8BIT,&(I2C_Buffer_Write[i]),8,1000);

HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress,
???????????????? uint16_t MemAddress, uint16_t MemAddSize,
???????????????? uint8_t *pData, uint16_t Size, uint32_t Timeout)
- 功能:IIC讀多個數據,該函數適用于IIC外設里面還有子地址寄存器的地址,比如E2PROM,除了
?????? 設備地址,每個存儲字節都有其對應的地址。
- 參數:
? *hi2c????? 設置使用的是那個IIC 例:&hi2c1
? DevAddress 讀設備的地址 設置讀數據的地址 例:0xA0
? MemAddress 從機寄存器地址,每讀出一個字節數據,地址就會自動+1
? MemAddSize 從機寄存器地址字節長度 8位/16位
???????????? 讀出數據的字節類型 8位/16位
???????????? I2C_MEMADD_SIZE_8BIT
???????????? I2C_MEMADD_SIZE_16BIT
? *pData???? 需要讀出的數據的起始地址
? Size?????? 傳輸數據的大小,需要讀出的字節數
? Timeout??? 最大傳輸時間,超過傳輸時間將自動退出傳輸函數


如果只往某個外設中寫數據,則用Master_Transmit。 
如果是外設里面還有子地址,例如我們的E2PROM,有設備地址,還有每個數據的寄存器存儲地址。則用Mem_Write。
Mem_Write是2個地址,Master_Transmit只有從機地址。
HAL_I2C_Mem_Write(&hi2c1,
0xA0, 0, I2C_MEMADD_SIZE_8BIT,WriteBuffer,BufferSize, 0xff);
HAL_I2C_Mem_Read(&hi2c1,
0xA1, 0, I2C_MEMADD_SIZE_8BIT,ReadBuffer,BufferSize, 0xff);
?

EEPROM

EEPROM (Electrically Erasable Programmable read only memory)是指帶電可擦可編程存儲器。是一種掉電后數據不丟失的存儲芯片。

https://item.szlcsc.com/320744.html

BL24C02是一個2Kbit的EEPROM, 內部含有256個字節可以存儲數據,總共有32頁,每頁8Byte。

設備讀寫地址說明

其中設備地址如下,A2 A1 A0對應芯片硬件接的電平


?

如果我們把A2 A1 A0都接到GND,這時候,

寫數據時,設備地址字節應該是0b1010 0000=0xA0

讀數據時,設備地址字節應該是0b1010 0001=0xA1

參考飛書文檔

字節寫

每次寫入一個Byte數據

  • 先發送起始信號
  • 發送從設備地址+寫入標志數據(Wbit=0),等待應答
  • 發送寫入地址,等待應答
  • 發送數據,等待應答
  • 發送結束信號。

頁寫

每次可以寫入一頁(8Byte)的數據

讀字節

連續讀

連續讀操作可通過立即讀或選擇性讀操作啟動。在 24C02 發送完一個 8 位字節數據后,主器件產生一個應答信號來響應,告知 24C02? 主器件要求更多的數據,對應每個主機產生的應答信號 24C02 將發送一個 8 位數據字節。當主器件不發送應答信號而發送停止位時結束此操作。

STM32CUBEMX開啟I2C1,對應PB6 PB7

然后打開USART1用于打印日志,方便查看

注意,要勾選MicroLIB哦,否則printf打印不了數據

然后添加代碼如下:

main.c/* USER CODE BEGIN Includes */
#include <stdio.h>
/* USER CODE END Includes *//* USER CODE BEGIN 0 */
#define ADDR_24LCxx_Write 0xA0
#define ADDR_24LCxx_Read 0xA1
#define BufferSize 8
uint8_t WriteBuffer[BufferSize] = {1,2,3,4,5,6,7,8};
uint8_t ReadBuffer[BufferSize] = {0};
/* USER CODE END 0 */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */printf("start to test i2c eeprom\n");if(HAL_I2C_Mem_Write(&hi2c1, ADDR_24LCxx_Write, 0, I2C_MEMADD_SIZE_8BIT, WriteBuffer, sizeof(WriteBuffer), 0xff) == HAL_OK){printf("EEPROM 24C02 Write Test OK \r\n");}HAL_Delay(10);??????????/* read date from EEPROM */HAL_I2C_Mem_Read(&hi2c1, ADDR_24LCxx_Read, 0, I2C_MEMADD_SIZE_8BIT, ReadBuffer, sizeof(ReadBuffer), 0xff);for(int i = 0; i < sizeof(ReadBuffer); i++){printf("0x%02X? ",ReadBuffer[i]);}HAL_Delay(1000);}/* USER CODE END 3 *//* USER CODE BEGIN 4 */
int fputc(int ch, FILE *f)
{HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);return ch;
}

打印如下

溫濕度傳感器

溫濕度傳感器:CJ-GXHT3L

GXHT3L-DIS 是中科銀河芯開發的新一代單芯片集成溫濕度一 體傳感器。

★ I2C 接口,通信速度高達 1MHz

★ 兩個用戶可選擇的地址

★ GXHT3L 典型精度為±4%RH 和±0.5°C

★ GXHT30 典型精度為±3%RH 和±0.3°C

★ GXHT31 典型精度為±2%RH 和±0.3°C

★ 單芯片集成溫濕傳感器

★ 高可靠性和長期穩定性

★ 測量 0-100%范圍相對濕度

★ 測量-45-130℃范圍內溫度

https://item.szlcsc.com/3199174.html

關于設備地址與ADDR管腳說明:

這里要注意的是,0x44指的是I2C地址的高7位,第八位為讀寫標志位。


?

0x44 = 0b0100 0100,把最高位去掉 = 0b100 0100

寫數據時,設備地址字節應該是0b1000 1000=0x88

讀數據時,設備地址字節應該是0b1000 1001=0x89

高重復率和周期轉換頻率,例如0x2130中,21代表每秒轉換一次,30代表高重復率。

設置進入連續轉換模式的命令

* USER CODE BEGIN Includes */
#include <stdio.h>
#define??? GXHT3L_ADDR_WRITE??? 0x44<<1???????? //10001000
#define??? GXHT3L_ADDR_READ???? (0x44<<1)+1???? //10001001typedef enum
{/* 軟件復位命令 */SOFT_RESET_CMD = 0x30A2,???/* 加熱使能/禁能命令 */PREHEAT_ENABLE_CMD = 0x306D,PREHEAT_DISENABLE_CMD = 0x3066,/* 芯片狀態命令 */DEVICE_STATUS_CMD = 0xF32D,/*單次測量模式命名格式:Repeatability_CS_CMDCS:Clock stretching*/HIGH_ENABLED_CMD??? = 0x2C06,MEDIUM_ENABLED_CMD? = 0x2C0D,LOW_ENABLED_CMD???? = 0x2C10,HIGH_DISABLED_CMD?? = 0x2400,MEDIUM_DISABLED_CMD = 0x240B,LOW_DISABLED_CMD??? = 0x2416,/*周期測量模式命名格式:Repeatability_MPS_CMDMPS:measurement per second*/HIGH_0_5_CMD?? = 0x2032,MEDIUM_0_5_CMD = 0x2024,LOW_0_5_CMD??? = 0x202F,HIGH_1_CMD???? = 0x2130,MEDIUM_1_CMD?? = 0x2126,LOW_1_CMD????? = 0x212D,HIGH_2_CMD???? = 0x2236,MEDIUM_2_CMD?? = 0x2220,LOW_2_CMD????? = 0x222B,HIGH_4_CMD???? = 0x2334,MEDIUM_4_CMD?? = 0x2322,LOW_4_CMD????? = 0x2329,HIGH_10_CMD??? = 0x2737,MEDIUM_10_CMD? = 0x2721,LOW_10_CMD???? = 0x272A,/* 周期測量模式讀取數據命令 */READOUT_FOR_PERIODIC_MODE = 0xE000,
} GXHT3L_CMD;
/* USER CODE END Includes *//* USER CODE BEGIN 0 */
/*** @brief??? 向GXHT3L發送一條指令(16bit)* @param??? cmd —— GXHT3L指令(在GXHT3L_MODE中枚舉定義)* @retval??? 成功返回HAL_OK
*/
static uint8_t GXHT3L_Send_Cmd(GXHT3L_CMD cmd)
{uint8_t cmd_buffer[2];cmd_buffer[0] = cmd >> 8;cmd_buffer[1] = cmd;return HAL_I2C_Master_Transmit(&hi2c2, GXHT3L_ADDR_WRITE, (uint8_t*) cmd_buffer, 2, 0xFFFF);
}/*** @brief??? 復位GXHT3L* @param??? none* @retval??? none
*/
static void GXHT3L_Reset(void)
{GXHT3L_Send_Cmd(SOFT_RESET_CMD);HAL_Delay(20);
}void GXHT3L_Preheat_Disable(void)
{GXHT3L_Send_Cmd(PREHEAT_DISENABLE_CMD);HAL_Delay(20);
}uint8_t GXHT3L_Read_Status(uint8_t* dat)
{GXHT3L_Send_Cmd(DEVICE_STATUS_CMD);return HAL_I2C_Master_Receive(&hi2c2, GXHT3L_ADDR_READ, dat, 3, 0xFFFF);
}/*** @brief??? 初始化GXHT3L* @param??? none* @retval??? 成功返回HAL_OK* @note??? 周期測量模式
*/
uint8_t GXHT3L_Init(void)
{return GXHT3L_Send_Cmd(MEDIUM_2_CMD);
}/*** @brief??? 從GXHT3L讀取一次數據* @param??? dat —— 存儲讀取數據的地址(6個字節數組)* @retval??? 成功 —— 返回HAL_OK
*/
uint8_t GXHT3L_Read_Dat(uint8_t* dat)
{GXHT3L_Send_Cmd(READOUT_FOR_PERIODIC_MODE);return HAL_I2C_Master_Receive(&hi2c2, GXHT3L_ADDR_READ, dat, 6, 0xFFFF);
}#define CRC8_POLYNOMIAL 0x31uint8_t CheckCrc8(uint8_t* const message, uint8_t initial_value)
{uint8_t? remainder;??????? //余數uint8_t? i = 0, j = 0;? //循環變量/* 初始化 */remainder = initial_value;for(j = 0; j < 2;j++){remainder ^= message[j];/* 從最高位開始依次計算? */for (i = 0; i < 8; i++){if (remainder & 0x80){remainder = (remainder << 1)^CRC8_POLYNOMIAL;}else{remainder = (remainder << 1);}}}/* 返回計算的CRC碼 */return remainder;
}/*** @brief??? 將GXHT3L接收的6個字節數據進行CRC校驗,并轉換為溫度值和濕度值* @param??? dat? —— 存儲接收數據的地址(6個字節數組)* @retval??? 校驗成功? —— 返回0*???????????? 校驗失敗? —— 返回1,并設置溫度值和濕度值為0
*/
uint8_t GXHT3L_Dat_To_Float(uint8_t* const dat, float* temperature, float* humidity)
{uint16_t recv_temperature = 0;uint16_t recv_humidity = 0;/* 校驗溫度數據和濕度數據是否接收正確 */if(CheckCrc8(dat, 0xFF) != dat[2] || CheckCrc8(&dat[3], 0xFF) != dat[5])return 1;/* 轉換溫度數據 */recv_temperature = ((uint16_t)dat[0]<<8)|dat[1];*temperature = -45 + 175*((float)recv_temperature/65535);/* 轉換濕度數據 */recv_humidity = ((uint16_t)dat[3]<<8)|dat[4];*humidity = 100 * ((float)recv_humidity / 65535);return 0;
}/* USER CODE BEGIN 1 */uint8_t recv_dat[6] = {0};uint8_t recv_status[3] = {0};float temperature = 0.0;float humidity = 0.0;/* USER CODE END 1 *//* USER CODE BEGIN 2 */GXHT3L_Reset();if(GXHT3L_Init() == HAL_OK)printf("GXHT3L init ok.\n");elseprintf("GXHT3L init fail.\n");if(GXHT3L_Read_Status(recv_status) == HAL_OK){printf("GXHT3L Read Status ok. Status = 0x%x%x\n",recv_status[0],recv_status[1]);}elseprintf("GXHT3L Read Status fail.\n");/* USER CODE END 2 */while (1){/* USER CODE BEGIN 3 */HAL_Delay(1000);if(GXHT3L_Read_Dat(recv_dat) == HAL_OK){if(GXHT3L_Dat_To_Float(recv_dat, &temperature, &humidity)==0){printf("temperature = %f, humidity = %f\n", temperature, humidity);}else{printf("crc check fail.\n");}}else{printf("read data from GXHT3L fail.\n");}}/* USER CODE END 3 *//* USER CODE BEGIN 4 */
int fputc(int ch, FILE *f)
{HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);return ch;
}
/* USER CODE END 4 */

最終工程,可以參考淘寶旺旺發送的源碼部分哦

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

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

相關文章

Virtualized Table 虛擬化表格 el-table-v2 表頭分組 多級表頭的簡單示例

注意添加這個屬性,會影響到有多少個層級的表頭: :header-height“[50, 40]”,即后面的columnIndex 如果有fix的列CustomizedHeader會被調用多次,如果有多個層級的表頭,也會被調用多次, 實際被調用次數是(fix數 1 * 表頭層級數量) 以下代碼均刪除了JSX TS版本代碼 <templ…

防御保護-----第十二章:VPN概述

文章目錄 第二部分&#xff0c;數據安全第十二章&#xff1a;VPN概述VPN概述VPN分類VPN關鍵技術隧道技術身份認證技術加解密技術數據認證技術 數據的安全傳輸密碼學發展史 對稱加密算法 --- 傳統密碼算法密鑰解釋流加密分組加密 --- 塊加密算法填充算法PKCS7算法分組模式 公鑰密…

前端項目打包部署流程j

1.打包前端項目(運行build這個文件) 2.打包完成后&#xff0c;控制臺如下所示:(沒有報錯即代表成功) 3.左側出現dist文件夾 4.準備好我們下載的nginx(可以到官網下載一個),然后在一個沒有中文路徑下的文件夾里面解壓。 5.在繼承終端內打開我們的項目&#xff0c;找到前面打包好…

Go語言標識符

文章目錄 標識符的組成規則Go語言關鍵字預定義標識符標識符命名慣例 特殊標識符標識符訪問權限控制 在Go語言中&#xff0c;標識符(Identifier)是用來命名變量、函數、類型、常量等程序實體的名稱。 標識符的組成規則 1、必須以字母或下劃線(_)開頭&#xff1a; 字母包括Unico…

CST軟件對OPERACST軟件聯合仿真汽車無線充電站對人體的影響

上海又收緊了新能源車的免費上牌政策。所以年前一些伙伴和我探討過買新能源汽車的問題&#xff0c;小伙伴們基本糾結的點是買插電還是純電&#xff1f;我個人是很抗拒新能源車的&#xff0c;也開過坐過。個人有幾個觀點&#xff1a; 溢價過高&#xff0c;不保值。實際并不環保…

吳恩達機器學習筆記:多變量梯度下降

1.多維特征 之前我們探討了單變量/特征的回歸模型&#xff0c;現在我們對房價模型增加更多的特征&#xff0c;例如房間數樓層等&#xff0c;構成一個含有多個變量的模型&#xff0c;模型中的特征為 &#xff08; x 1 &#xff0c; x 2 &#xff0c; x 3... x n &#xff09; &…

【Linux Nano Vim快捷鍵大全】

Nano 快捷鍵大全 常用高頻操作 功能描述快捷鍵組合替代按鍵/備注使用頻率顯示幫助CtrlGF1高保存文件CtrlOF3高退出編輯器CtrlXF2高剪切當前行CtrlKF9高粘貼內容CtrlUF10高搜索文本CtrlWF6高替換文本Ctrl\AltR高撤銷操作AltU無中重做操作AltE無中跳轉到行號Ctrl_AltG中插入文件…

uniapp vue 沉浸式窗體如何獲取并排除外部手機瀏覽器底部菜單欄工具欄高度

這個問題可以簡稱為&#xff1a;uniapp vue 獲取可視窗口高度 第一種方案&#xff0c;只改變css樣式 /* 不考慮瀏覽器UI的最小視口高度 */ .element {height: 100svh; /* small viewport height */ }/* 考慮瀏覽器UI變化的動態視口高度 */ .element {height: 100dvh; /* dyna…

React Native告別圖標體積大手動更換慢的噩夢:讓圖標更新像修改文字一樣簡單

寫在前面:凌晨三點的圖標戰爭 “所有圖標都要換成圓角風格,明天上線!”——產品經理這條消息彈出時,我的保溫杯差點從手中滑落。掃了一眼項目中的347個圖標文件,我知道今晚又是個不眠夜。但就在絕望之際,同事發來一個GIF:他只是在終端輸入了iconfont-rn --update,所有…

自然語言處理與BI融合實戰:ChatBI動態語義解析技術架構剖析

在數字經濟時代&#xff0c;數據已成為企業核心競爭力的關鍵要素。如何高效挖掘數據價值、實現智能化決策&#xff0c;成為企業數字化轉型的核心命題。傳統商業智能&#xff08;BI&#xff09;工具雖具備強大的數據處理能力&#xff0c;但其技術門檻高、交互方式復雜等局限性日…

鴻蒙OSUniApp開發支持多語言的國際化組件#三方框架 #Uniapp

使用UniApp開發支持多語言的國際化組件 在全球化的今天&#xff0c;一個優秀的應用往往需要支持多種語言以滿足不同地區用戶的需求。本文將詳細講解如何在UniApp框架中實現一套完整的國際化解決方案&#xff0c;從而輕松實現多語言切換功能。 前言 去年接手了一個面向國際市場…

SpringBoot的外部化配置

一、什么是外部化配置 外部化配置是指把應用程序中各種可配置的參數、屬性等信息&#xff0c;從代碼內部提取出來&#xff0c;放置在外部的配置文件、數據庫或配置中心等地方&#xff08;比如使用.properties、.yml 或.xml 等格式的文件&#xff09;進行管理。提高應用程序的可…

SQL中聯表的運用

當出現要大量數據去查詢時&#xff0c;不要一個個去SQL查詢&#xff0c;應該要批量的去查詢。 def batch_cavity_query(self, fuseids): “”“批量查詢cavity信息”“” if not fuseids: return {} # 創建臨時表批量查詢 try:# 創建臨時表self.cursor.execute("CREATE …

React面試常問問題詳解

以下是30個React面試中常見的問題及簡要解析&#xff0c;涵蓋基礎概念、核心原理、性能優化、Hooks、狀態管理等方面&#xff0c;適用于初中高級開發者準備面試時參考&#xff1a; 一、React 基礎與核心概念 React 是什么&#xff1f; React 是由 Facebook 開發的用于構建用戶界…

【vite好用的配置】自動導入組件、vue中的hook、路徑解析、打包配置、本地運行反向代理配置

前言 之前出了一篇自己搭建 后臺管理系統的文章&#xff0c;今天順便把vite配置&#xff0c;涉及到的一些給大家分享吧。 按需食用哈。 文章目錄 前言一、 自動導入vue中的hook、ref等1. 安裝插件2. 配置 Vite&#xff08;vite.config.ts 或 vite.config.js&#xff09;1&…

思科(Cisco ASA/Firepower)、華三(H3C)、華為(Huawei USG)防火墻 的基礎配置

以下是針對 思科&#xff08;Cisco ASA/Firepower&#xff09;、華三&#xff08;H3C&#xff09;、華為&#xff08;Huawei USG&#xff09;防火墻 的基礎配置指南&#xff0c;涵蓋 區域劃分、安全策略、NAT、路由 等核心功能。配置示例基于通用場景&#xff0c;實際部署時需根…

mac latex vscode 配置

mac latex vscode 配置 安裝mactex.pkg 這里有個快速下載的鏡像 https://mirrors.aliyun.com/CTAN/systems/mac/mactex/ 可以檢查是否將 PATH 寫入 export PATH"/Library/TeX/texbin:$PATH"vscode 下載插件 Latex Workshop 在配置文件 settings.json 中輸入如下的…

AI日報 · 2025年5月14日|Android 生態大型更新與多端 Gemini 集成

1、Google “Android?Show:?I/O?Edition” 匯總&#xff1a;設計、安全、Gemini 三線并進 北京時間 5?月?14?日凌晨&#xff08;原文標注 5?月?13?日 PDT&#xff09;&#xff0c;Google 在 I/O 前夕舉辦的 Android?Show 一口氣公布四大方向更新&#xff1a;① Mater…

MySQL入門指南:環境搭建與服務管理全流程

引言 各位開發者朋友們好&#xff01;今天我們將開啟MySQL的學習之旅 &#x1f31f; 作為世界上最流行的開源關系型數據庫&#xff0c;MySQL在Web應用、企業系統等領域占據著舉足輕重的地位。無論你是剛入行的新手&#xff0c;還是想系統復習的老鳥&#xff0c;這篇教程都將為…

LLM 論文精讀(四)LLM Post-Training: A Deep Dive into Reasoning Large Language Models

這是一篇2025年發表在arxiv中的LLM領域論文&#xff0c;是一篇非常全面的綜述類論文&#xff0c;介紹了當前主流的強化學習方法在LLM上的應用&#xff0c;文章內容比較長&#xff0c;但建議LLM方面的從業人員反復認真閱讀。 寫在最前面 為了方便你的閱讀&#xff0c;以下幾點的…