STM32中的RTC(實時時鐘)詳解

前言:為什么需要RTC?

在嵌入式系統中,時間記錄是一項基礎且關鍵的功能。想象一下:智能家居設備需要按時間觸發開關燈,工業儀表需要記錄傳感器數據的采集時刻,物聯網終端需要同步服務器時間戳……這些場景都離不開實時時鐘(RTC)

STM32的RTC外設本質是一個獨立運行的定時器,但與普通定時器相比,它有三個核心優勢:

  • 獨立供電:即使主電源掉電,也能通過備用電池維持運行,確保時間不丟失
  • 日歷功能:直接支持年/月/日/時/分/秒記錄,無需軟件額外換算
  • 低功耗特性:工作電流極低(僅幾微安),配合備用電池可維持數年運行

本文將從硬件原理到軟件實戰,全面講解STM32 RTC的工作機制、配置方法和高級應用,幫助大家徹底掌握這一核心外設。

一、RTC核心原理:獨立運行的"時間管家"

1.1 RTC的基本概念

RTC(Real-Time Clock)即實時時鐘,其核心功能是持續跟蹤時間,并提供與時間相關的服務(如日歷、鬧鐘)。與系統時鐘(如SYSCLK)相比,RTC的最大特點是:

  • 獨立于主系統:擁有專屬的低功耗時鐘源和供電回路
  • 掉電不丟失:主電源斷開后,由備用電源(VBAT引腳)供電,時間繼續運行
  • 時間連續性:從斷電到重新上電,時間無縫銜接,不會重置

1.2 RTC的硬件組成

STM32的RTC模塊主要由以下部分組成(以STM32F103為例):

  • 時鐘源:支持3種時鐘輸入(LSE、LSI、HSE_RTC),其中LSE(外部低速晶振,32.768kHz)是最常用的選擇(精度高、功耗低)
  • 預分頻器:將時鐘源分頻至1Hz,作為秒計數基準
  • 計數器:包括一個32位的秒計數器(RTC_CNT)和兩個16位的預分頻寄存器(RTC_PRLH/RTC_PRLL)
  • 日歷寄存器:存儲年、月、日、時、分、秒等信息(部分型號需通過計數器換算)
  • 鬧鐘模塊:支持設置鬧鐘時間,當RTC時間與鬧鐘時間匹配時觸發中斷或喚醒
  • 備份寄存器(BKP):共10個16位寄存器,用于存儲用戶數據(如最后一次設置的時間),由VBAT供電,掉電不丟失

1.3 獨立供電機制

RTC的獨立供電是其核心特性,硬件上通過VBAT引腳實現:

  • 正常工作時,主電源(VDD)為系統供電,同時通過內部二極管為VBAT引腳的備用電源充電(如CR2032紐扣電池)
  • 當主電源掉電(VDD < VBAT),自動切換到備用電源供電,RTC和BKP寄存器繼續工作
  • 重新上電后,自動切換回主電源,RTC時間保持連續

硬件設計注意:VBAT引腳需外接備用電源(推薦3V紐扣電池),并串聯一個10kΩ限流電阻和0.1μF濾波電容,防止電壓波動影響RTC穩定性。

二、RTC時鐘源:選擇與配置

RTC的精度和穩定性很大程度上取決于時鐘源,STM32提供三種可選時鐘源:

2.1 時鐘源對比

時鐘源頻率精度功耗適用場景
LSE(外部)32.768kHz高(±20ppm)低(≈1μA)對時間精度要求高的場景(推薦)
LSI(內部)≈40kHz低(±5%)中(≈10μA)無外部晶振,精度要求低的場景
HSE_RTCHSE分頻需與主時鐘同步的場景

為什么32.768kHz是RTC專用頻率?
因為32768 = 2^15,通過15次分頻可精確得到1Hz的秒脈沖(32768 / 32768 = 1Hz),無需復雜計算,這是電子時鐘的標準頻率。

2.2 時鐘源配置步驟

以最常用的LSE為例,配置步驟如下:

  1. 使能備份域時鐘:RTC和BKP屬于備份域,需先使能PWR和BKP時鐘
  2. 解鎖備份域:備份域默認鎖定,需通過PWR寄存器解鎖
  3. 啟動LSE:使能外部低速晶振,等待穩定
  4. 選擇RTC時鐘源:通過RCC寄存器配置RTC時鐘為LSE

代碼實現(HAL庫):

// 1. 使能PWR和BKP時鐘
__HAL_RCC_PWR_CLK_ENABLE();
__HAL_RCC_BKP_CLK_ENABLE();// 2. 解鎖備份域(PWR_CR寄存器的DBP位)
HAL_PWR_EnableBkUpAccess();// 3. 啟動LSE并等待穩定
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE;
RCC_OscInitStruct.LSEState = RCC_LSE_ON;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{Error_Handler(); // LSE啟動失敗(可能晶振未接或損壞)
}// 4. 配置RTC時鐘源為LSE
RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC;
PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
{Error_Handler();
}

三、RTC日歷功能:從秒計數器到年月日

RTC的核心功能是記錄日歷時間,但其底層本質是一個32位秒計數器(RTC_CNT),從某個基準時間(如2000年1月1日00:00:00)開始累加秒數。我們需要通過軟件將秒數轉換為年/月/日/時/分/秒。

3.1 日歷時間的表示方法

在STM32中,日歷時間通常用結構體表示:

typedef struct
{uint8_t Year;   // 年(0-99,代表2000-2099)uint8_t Month;  // 月(1-12)uint8_t Date;   // 日(1-31)uint8_t Hour;   // 時(0-23)uint8_t Minute; // 分(0-59)uint8_t Second; // 秒(0-59)uint8_t WeekDay;// 星期(1-7,1=周一)
} RTC_DateTypeDef;

3.2 秒計數器與日歷的轉換

(1)從日歷到秒數(設置時間)

當用戶設置時間(如2023年10月1日12:00:00)時,需轉換為秒計數器的值:

  1. 計算從基準時間到目標時間的總天數(考慮閏年、每月天數)
  2. 總秒數 = 總天數×86400 + 小時×3600 + 分鐘×60 + 秒
(2)從秒數到日歷(讀取時間)

讀取RTC_CNT的值后,反向轉換為日歷:

  1. 總天數 = 總秒數 / 86400,剩余秒數 = 總秒數 % 86400
  2. 從基準時間開始累加總天數,計算年/月/日
  3. 剩余秒數轉換為小時/分鐘/秒

3.3 閏年與每月天數計算

轉換的核心是處理閏年和每月天數,規則如下:

  • 閏年判斷:能被4整除且不能被100整除,或能被400整除
  • 每月天數:1/3/5/7/8/10/12月31天,4/6/9/11月30天,2月平年28天、閏年29天

示例代碼(判斷閏年):

static uint8_t IsLeapYear(uint16_t year)
{// 年份以2000為基準,實際年份=2000+yearyear += 2000;if((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))return 1; // 閏年elsereturn 0; // 平年
}

示例代碼(獲取某月天數):

static uint8_t GetDaysInMonth(uint8_t month, uint8_t isLeapYear)
{const uint8_t daysInMonth[] = {31,28,31,30,31,30,31,31,30,31,30,31};if(month == 2 && isLeapYear)return 29;elsereturn daysInMonth[month-1];
}

3.4 HAL庫中的日歷配置

HAL庫封裝了日歷配置函數,無需手動計算秒數:

// 初始化RTC
RTC_HandleTypeDef hrtc;
hrtc.Instance = RTC;
hrtc.Init.HourFormat = RTC_HOURFORMAT_24; // 24小時制
hrtc.Init.AsynchPrediv = 0x7F; // 異步預分頻值(LSE=32768Hz時,0x7F=127)
hrtc.Init.SynchPrediv = 0xFF;  // 同步預分頻值(0xFF=255),總分頻=128×256=32768
hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
if (HAL_RTC_Init(&hrtc) != HAL_OK)
{Error_Handler();
}// 設置時間(12:30:00)
RTC_TimeTypeDef sTime = {0};
sTime.Hours = 12;
sTime.Minutes = 30;
sTime.Seconds = 0;
sTime.TimeFormat = RTC_HOURFORMAT12_AM; // 若用24小時制,此參數無效
if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK)
{Error_Handler();
}// 設置日期(2023年10月1日,周日)
RTC_DateTypeDef sDate = {0};
sDate.WeekDay = RTC_WEEKDAY_SUNDAY;
sDate.Month = RTC_MONTH_OCTOBER;
sDate.Date = 1;
sDate.Year = 23; // 2023年
if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK)
{Error_Handler();
}

注意:HAL庫中AsynchPredivSynchPrediv的和需滿足:(AsynchPrediv + 1) × (SynchPrediv + 1) = 時鐘源頻率(LSE=32768時,128×256=32768)。

四、RTC鬧鐘功能:定時喚醒與中斷

RTC的鬧鐘功能允許設置一個特定時間,當RTC時間與鬧鐘時間匹配時,觸發中斷或喚醒信號,適用于定時任務(如每天8點采集數據)或低功耗喚醒。

4.1 鬧鐘的工作機制

STM32的RTC通常支持1~2個鬧鐘(如STM32F103有ALRMA和ALRMB),每個鬧鐘可獨立配置:

  • 匹配條件:可設置匹配年、月、日、時、分、秒中的部分字段(如僅匹配時/分/秒,實現每天同一時間觸發)
  • 觸發輸出:可產生中斷(RTC_Alarm_IRQn)或喚醒信號(用于低功耗模式喚醒)

4.2 鬧鐘配置參數

以ALRMA為例,關鍵配置參數包括:

  • RTC_AlarmTime:鬧鐘時間(時/分/秒)
  • RTC_AlarmDateWeekDay:鬧鐘日期或星期(若設置為星期,則每周觸發)
  • RTC_AlarmMask:屏蔽不需要匹配的字段(如屏蔽年/月/日,僅匹配時/分/秒)

4.3 鬧鐘中斷與低功耗喚醒

(1)鬧鐘中斷配置
  1. 配置鬧鐘時間和匹配條件
  2. 使能RTC鬧鐘中斷(通過NVIC配置)
  3. 在中斷服務程序中處理鬧鐘事件
(2)低功耗喚醒

當系統進入停機模式(Stop Mode)時,RTC鬧鐘可將其喚醒:

  1. 配置鬧鐘為喚醒源
  2. 進入停機模式前使能RTC喚醒功能
  3. 鬧鐘觸發時,系統從停機模式喚醒,執行中斷服務程序后繼續運行

4.4 鬧鐘配置示例代碼

// 配置鬧鐘A:每天12:30:05觸發
void RTC_AlarmConfig(void)
{RTC_AlarmTypeDef sAlarm = {0};// 禁用鬧鐘A(配置前需先禁用)HAL_RTC_DeactivateAlarm(&hrtc, RTC_ALARM_A);// 配置鬧鐘時間sAlarm.AlarmTime.Hours = 12;sAlarm.AlarmTime.Minutes = 30;sAlarm.AlarmTime.Seconds = 5;sAlarm.AlarmTime.TimeFormat = RTC_HOURFORMAT12_AM;// 配置日期/星期匹配(此處屏蔽日期,即每天觸發)sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;sAlarm.AlarmDateWeekDay = 1; // 日期(因屏蔽,實際無效)sAlarm.AlarmMask = RTC_ALARMMASK_DATEWEEKDAY; // 屏蔽日期匹配// 使能鬧鐘Aif (HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) != HAL_OK){Error_Handler();}// 配置NVIC中斷HAL_NVIC_SetPriority(RTC_Alarm_IRQn, 0, 0);HAL_NVIC_EnableIRQ(RTC_Alarm_IRQn);
}// 鬧鐘中斷服務程序
void RTC_Alarm_IRQHandler(void)
{HAL_RTC_AlarmIRQHandler(&hrtc);
}// 鬧鐘回調函數
void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
{// 鬧鐘觸發,執行任務(如翻轉LED)HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);printf("Alarm triggered!\r\n");
}

關鍵參數說明RTC_AlarmMask的取值決定匹配精度:

  • RTC_ALARMMASK_NONE:完全匹配(年/月/日/時/分/秒)
  • RTC_ALARMMASK_DATEWEEKDAY:屏蔽日期,每天同一時間觸發
  • RTC_ALARMMASK_HOURS:屏蔽日期和小時,每天每分鐘匹配秒時觸發

五、備份寄存器(BKP):掉電不丟失的數據存儲

RTC模塊附帶的備份寄存器(BKP)用于存儲用戶數據,由VBAT供電,主電源掉電后數據不丟失,常見用途包括:

  • 存儲RTC的基準時間(如最后一次同步的NTP時間)
  • 記錄設備運行狀態(如開機次數、故障碼)
  • 保存用戶配置參數(如鬧鐘設置)

5.1 BKP的基本特性

  • 數量:STM32F103有10個16位寄存器(BKP_DR1~BKP_DR10)
  • 訪問權限:需先解鎖備份域(同RTC)
  • 寫保護:可通過軟件設置寫保護,防止誤修改

5.2 BKP讀寫示例

// 寫入BKP數據(DR1)
void BKP_WriteData(uint16_t data)
{// 解鎖備份域(已在RTC初始化時完成)// HAL_PWR_EnableBkUpAccess();BKP->DR1 = data; // 寫入數據到DR1
}// 讀取BKP數據(DR1)
uint16_t BKP_ReadData(void)
{return BKP->DR1; // 從DR1讀取數據
}// 應用示例:記錄開機次數
void RecordBootCount(void)
{uint16_t bootCount = BKP_ReadData();bootCount++; // 次數+1BKP_WriteData(bootCount); // 保存printf("Boot count: %d\r\n", bootCount);
}

注意:BKP寄存器復位后仍保留數據,只有VBAT掉電才會重置,因此適合存儲需要長期保存的數據。

六、RTC低功耗設計:延長備用電源壽命

RTC的低功耗特性是其核心優勢之一,合理設計可顯著延長備用電池壽命(如CR2032電池可支持數年)。

6.1 影響功耗的因素

  • 時鐘源:LSE(1μA)比LSI(10μA)更省電
  • 工作模式:RTC在停機模式下功耗最低
  • 外圍電路:VBAT引腳的限流電阻和濾波電容會增加漏電,需選擇低漏電器件

6.2 低功耗配置技巧

  1. 選擇LSE時鐘源:相比LSI,功耗降低90%
  2. 關閉不必要的功能:如未使用鬧鐘,禁用鬧鐘模塊
  3. 優化VBAT電路
    • 限流電阻選擇10kΩ(太小增加功耗,太大影響充電)
    • 濾波電容選擇0.1μF陶瓷電容(低漏電)
    • 備用電池選擇CR2032(容量220mAh,適合長期供電)
  4. 進入停機模式:系統空閑時進入停機模式,僅RTC運行

6.3 停機模式與RTC喚醒示例

// 進入停機模式,等待RTC鬧鐘喚醒
void EnterStopMode(void)
{// 配置RTC鬧鐘為喚醒源(已在鬧鐘配置中完成)// 關閉所有不必要的外設時鐘__HAL_RCC_GPIOA_CLK_DISABLE();__HAL_RCC_GPIOB_CLK_DISABLE();// ...(其他外設)// 進入停機模式HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);// 喚醒后重新配置系統時鐘(停機模式會關閉主時鐘)SystemClock_Config();
}// 主循環中調用
while (1)
{// 執行任務...// 任務完成后進入停機模式,等待鬧鐘喚醒EnterStopMode();
}

喚醒后時鐘配置:停機模式會關閉PLL和HSE,喚醒后需重新初始化系統時鐘(調用SystemClock_Config)。

七、RTC常見問題與解決方案

7.1 時間不準(走時偏快/偏慢)

原因

  • LSE晶振精度不足(劣質晶振或未加負載電容)
  • 溫度變化導致晶振頻率偏移
  • 未進行RTC校準

解決方案

  1. 選用高精度32.768kHz晶振(如EPSON、Abracon品牌),并匹配12.5pF負載電容
  2. 進行RTC校準:通過RTC的校準寄存器(RTC_CALIBR)微調頻率
    // 校準示例:每32秒增加1個脈沖(補償偏慢)
    RTC->CALIBR = RTC_CALIBR_PLUS | 0x1F;
    
  3. 定期通過NTP或GPS同步時間(聯網設備)

7.2 掉電后時間丟失

原因

  • VBAT引腳未接備用電池或電池電量耗盡
  • 備份域未解鎖,導致RTC配置未保存
  • 硬件電路問題(如VBAT引腳短路)

解決方案

  1. 檢查VBAT電路:用萬用表測量VBAT引腳電壓(應為3V左右)
  2. 確認初始化時已調用HAL_PWR_EnableBkUpAccess()解鎖備份域
  3. 檢查BKP寄存器數據:若BKP數據也丟失,說明VBAT供電中斷

7.3 鬧鐘不觸發

原因

  • 鬧鐘時間設置錯誤(如設置為過去的時間)
  • 鬧鐘中斷未使能(NVIC配置錯誤)
  • 鬧鐘掩碼設置不當(匹配條件未滿足)

解決方案

  1. 讀取當前RTC時間,確認鬧鐘時間在未來
  2. 檢查NVIC配置:HAL_NVIC_EnableIRQ(RTC_Alarm_IRQn)是否調用
  3. 簡化鬧鐘掩碼:先測試RTC_ALARMMASK_NONE(完全匹配),再逐步調整

7.4 初始化失敗(HAL_RTC_Init返回錯誤)

原因

  • 備份域未解鎖
  • LSE啟動失敗(晶振未接或損壞)
  • 時鐘源配置錯誤

解決方案

  1. 確保HAL_PWR_EnableBkUpAccess()在RTC初始化前調用
  2. 檢查LSE晶振焊接:用示波器測量晶振引腳是否有正弦波(幅度約0.5V峰峰值)
  3. 若LSE無法啟動,臨時改用LSI時鐘源排查問題:
    PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSI;
    

八、RTC實戰項目:多功能時鐘系統

下面結合前面的知識,實現一個包含日歷顯示、鬧鐘提醒和低功耗功能的時鐘系統。

8.1 硬件設計

  • 主控制器:STM32F103C8T6
  • 顯示模塊:OLED12864(I2C接口)
  • 輸入模塊:4個按鍵(設置時間、設置鬧鐘、加、減)
  • 電源:USB供電(5V)+ CR2032備用電池(VBAT引腳)
  • 指示:LED指示燈(鬧鐘觸發時閃爍)

8.2 軟件設計框架

// main.c
int main(void)
{// 初始化HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_I2C1_Init(); // OLED初始化MX_USART1_UART_Init(); // 調試串口MX_RTC_Init(); // RTC初始化BKP_Init(); // 備份寄存器初始化// 檢查是否首次上電(BKP_DR1為0則是首次)if (BKP_ReadData() == 0){// 首次上電,設置初始時間(2023-10-01 00:00:00)RTC_SetTime(0, 0, 0);RTC_SetDate(23, 10, 1, RTC_WEEKDAY_SUNDAY);BKP_WriteData(1); // 標記為已設置}// 配置鬧鐘(每天8:00:00)RTC_AlarmConfig(8, 0, 0);// 主循環while (1){// 讀取當前時間RTC_DateTypeDef date;RTC_TimeTypeDef time;HAL_RTC_GetTime(&hrtc, &time, RTC_FORMAT_BIN);HAL_RTC_GetDate(&hrtc, &date, RTC_FORMAT_BIN);// 在OLED上顯示OLED_DisplayTime(date, time);// 按鍵處理(設置時間/鬧鐘)Key_Process();// 無操作時進入低功耗if (Key_IdleTime() > 5000) // 5秒無操作{EnterStopMode();}HAL_Delay(100);}
}

8.3 關鍵功能模塊

(1)OLED顯示時間
void OLED_DisplayTime(RTC_DateTypeDef date, RTC_TimeTypeDef time)
{char buf[32];// 顯示日期:2023-10-01 Sunsprintf(buf, "20%02d-%02d-%02d ", date.Year, date.Month, date.Date);OLED_ShowString(0, 0, buf);// 顯示星期const char* weekday[] = {"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"};OLED_ShowString(80, 0, (char*)weekday[date.WeekDay-1]);// 顯示時間:12:30:05sprintf(buf, "%02d:%02d:%02d", time.Hours, time.Minutes, time.Seconds);OLED_ShowString(0, 2, buf);
}
(2)按鍵處理(設置時間)
void Key_Process(void)
{if (Key_Pressed(KEY_SET)) // 設置鍵按下{// 進入時間設置模式,通過加減鍵調整RTC_EnterSetMode();}
}void RTC_EnterSetMode(void)
{// 禁用鬧鐘,防止設置時觸發HAL_RTC_DeactivateAlarm(&hrtc, RTC_ALARM_A);// 循環調整時間(省略具體邏輯,通過按鍵增減時分秒)// ...// 退出時保存設置HAL_RTC_SetTime(&hrtc, &newTime, RTC_FORMAT_BIN);HAL_RTC_SetDate(&hrtc, &newDate, RTC_FORMAT_BIN);// 重新使能鬧鐘RTC_AlarmConfig();
}

九、總結與擴展

RTC作為STM32的核心外設,其獨立供電、日歷記錄和低功耗喚醒功能使其在嵌入式系統中不可或缺。本文從原理到實戰,詳細講解了:

  • RTC的獨立供電機制與硬件設計
  • 日歷時間的設置與讀取(秒計數器與日歷轉換)
  • 鬧鐘功能的配置與中斷處理
  • 備份寄存器的掉電數據存儲
  • 低功耗模式下的RTC喚醒應用

擴展學習

  • RTC校準:深入研究RTC_CALIBR寄存器,實現高精度時間同步
  • 多鬧鐘管理:在支持雙鬧鐘的型號上實現多任務定時(如ALRMA用于每日任務,ALRMB用于每周任務)
  • 與NTP服務器同步:通過網絡獲取標準時間,自動校準RTC(適用于物聯網設備)

掌握RTC的使用,不僅能實現基礎的時間記錄,更能為低功耗系統設計和定時任務調度提供核心支撐,是嵌入式工程師必備技能。

附錄:RTC相關寄存器速查表

寄存器功能關鍵位/字段
RTC_CRH控制寄存器高位ALRAE(鬧鐘A使能)、CNF(配置模式)
RTC_CRL控制寄存器低位RTOFF(寄存器同步標志)、ALRAF(鬧鐘A標志)
RTC_PRLH/PRLL預分頻裝載寄存器16位預分頻值
RTC_CNT計數器寄存器32位秒計數
RTC_ALRH/ALRL鬧鐘寄存器鬧鐘時間值
BKP_DRx備份數據寄存器16位用戶數據
RCC_CSR控制/狀態寄存器LSERDY(LSE就緒標志)
PWR_CR電源控制寄存器DBP(備份域訪問使能)

(注:具體寄存器定義請參考對應型號的《參考手冊》)

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

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

相關文章

Python技巧記錄

空格拼接數組格式化顯示 一維數組 arr [1, 2, 3, 4, 5] print( .join(map(str, arr))) # 直接轉換并連接二維數組 for row in arr:print( .join(map(str, row)))for row in arr: 此循環會遍歷矩陣arr中的每一行。這里的arr是一個二維列表&#xff0c;每一行代表一個子列表。m…

next.js打包后的前端資源如何進行部署和訪問,為什么沒有index.html

在 Next.js 項目中&#xff0c;打包后的部署方式和傳統單頁應用&#xff08;SPA&#xff09;有所不同&#xff0c;尤其是沒有直接生成 index.html 這一點。以下是詳細解釋和部署指南&#xff1a;為什么沒有 index.html 文件&#xff1f; Next.js 采用 混合渲染策略&#xff0c;…

Qt+FFmpeg網絡視頻流播放

init 函數用于初始化 FFmpeg&#xff0c;包括設置參數、打開輸入、初始化視頻和音頻等。initOption 函數用于設置 FFmpeg 的參數選項。bool FFmpegThread::init() {if (url.isEmpty()) {return false;}//判斷該攝像機是否能聯通if (checkConn && isRtsp) {if (!checkUr…

【SpringBoot】Spring Boot 高并發優化終極指南,涵蓋線程模型、JVM 調優、數據庫訪問、緩存策略等 15+ 核心模塊

Spring Boot 高并發優化終極指南&#xff0c;涵蓋線程模型、JVM 調優、數據庫訪問、緩存策略等 15 核心模塊一、線程模型深度調優&#xff08;核心瓶頸突破&#xff09;1. Tomcat 線程池原子級配置2. 異步任務線程池隔離策略二、JVM 層終極調參&#xff08;G1GC 深度優化&#…

linux(CentOS-7-x86_64:NAT模式下解決yum無法使用:更新yum源的詳細操作步驟2025)

目錄 一、CentOS-7-x86_64的NAT模式下解決yum無法使用。&#xff08;更新可用的yum&#xff09; &#xff08;1&#xff09;首先保證能夠ping通&#xff0c;也就是NAT模式下虛擬機有網絡。 &#xff08;2&#xff09;錯誤&#xff1a;無法使用yum。比如我現在無法yum search if…

C++11的整理筆記

Lambda 表達式Lambda 表達式是 C11 引入的一種強大的功能&#xff0c;它允許你在代碼中直接定義匿名函數對象。Lambda 表達式可以捕獲上下文中的變量&#xff0c;并在需要時使用它們。它們通常用于簡化代碼&#xff0c;尤其是那些需要傳遞函數對象作為參數的場景&#xff08;如…

MS1826+MS9332 4K@30Hz HD4×2視頻分割器

MS1826MS9332是一款支持4K30Hz分辨率的HD42視頻分割器方案。支持四路HD輸入兩路HD輸出&#xff0c;最高支持4K30Hz分辨率。該方案具有Scaler、OSD、畫面分割、無縫切換、淡入淡出及旋轉等功能。該方案現已實現量產&#xff0c;并提供完善的技術支持&#xff0c;適用于各類高清視…

用 MATLAB 模擬傳染病傳播:從 SI 模型到 SIS 模型的可視化之旅

在公共衛生研究中&#xff0c;數學模型是理解傳染病傳播規律的重要工具。通過數值模擬&#xff0c;我們能直觀看到 “易感人群” 和 “感染人群” 隨時間的變化趨勢&#xff0c;甚至能預測疫情發展的關鍵節點。今天就帶大家用 MATLAB 實現兩個經典的傳染病模型 ——SI 模型和SI…

Ruby如何采集直播數據源地址

在當今數字化的時代&#xff0c;實時獲取并處理信息變得尤為重要。特別是在體育賽事、新聞報道等領域&#xff0c;及時獲取最新的直播數據源對于提升用戶體驗至關重要。本文將介紹如何使用Ruby語言來采集特定網站的數據源地址 一、準備工作 首先&#xff0c;確保你的環境中已…

【fitz+PIL】PDF圖片文字顏色加深

文章目錄0 引言1 解決思路及流程1.1 思路1.2 代碼實現2 完整代碼與效果3 總結0 引言 沒錯&#xff0c;這是連續劇。女友對上一篇【fitzOpenCV】去除PDF圖片中的水印得到的去水印效果很滿意&#xff0c;于是問我可不可以再幫她處理一下另一個PDF文件&#xff0c;我二話不說答應…

tp8.0\jwt接口安全驗證

環境&#xff1a;php8.3\tp8.1\firebase-jwt6.1app\middleware\JwtAuth<?php namespace app\middleware;use app\common\library\JwtHandler; use think\Request; use think\facade\Env;class JwtAuth {public function handle(Request $request, \Closure $next){// 獲取當…

ReactNative【實戰系列教程】我的小紅書 5 -- 文章詳情(含輪播圖 ImageSlider,點亮紅心動畫 Heart,嵌套評論等)

最終效果 安裝依賴 npm i dayjs用于對時間進行格式化 必備組件 輪播圖 ImageSlider https://blog.csdn.net/weixin_41192489/article/details/149224510 點亮紅心動畫 Heart components/Heart.tsx import AntDesign from "expo/vector-icons/AntDesign"; import …

嗶哩嗶哩第三方TV-BBLL最新版

—————【下 載 地 址】——————— 【?本章下載一】&#xff1a;https://pan.xunlei.com/s/VOUtUcaymd9rpgurgDKS9pswA1?pwdp76n# 【?本章下載二】&#xff1a;https://pan.xunlei.com/s/VOUtUcaymd9rpgurgDKS9pswA1?pwdp76n# 【百款黑科技】&#xff1a;https://uc…

用YOLOv5系列教程(1)-用YOLOv5輕松實現設備狀態智能監控!工業級教程來了

用YOLOv5輕松實現設備狀態智能監控&#xff01;工業級教程來了設備運維革命&#xff1a;15分鐘教會你的攝像頭看懂指示燈狀態工業現場各種設備狀態指示燈是工程師的"眼睛"——紅燈報警、綠燈運行、黃燈待機。但人工巡檢耗時費力&#xff0c;關鍵故障容易漏檢&#xf…

筆記-分布式計算基礎

Distributed Computing 劃分數據并行&#xff08;DataParallelism&#xff09;將數據分為n份&#xff0c;發送到n個GPU上&#xff0c;每個GPU上都存在一個完整的大模型 缺點&#xff1a; 模型太大Pipeline Parallelism&#xff08;串行的&#xff09;將模型做split,每個GPU負責…

Android Studio 2024,小白入門喂飯級教程

一、下載Android Studio 1、從安卓官網安卓官網下載Android Studio。 ? ? 二、安裝Android Studio 1、雙擊android-studio-2024.3.2.15-windows.exe。 ? ?? ? ? ? ? 三、新建工程 1、雙擊桌面圖標? 打開Android Studio。 ? 選“Empty Views Activity…

AI智能體 | 使用Coze制作一鍵生成單詞洗腦循環視頻,一天批量生成100條視頻不是夢!(附保姆級教程)

目錄 一、整體工作流設計 二、制作工作流 2.1 開始節點 2.2 大模型-單詞 2.3 大模型_圖像生成 2.4 輸出 2.5 圖像生成_1 2.6 輸出_2 2.7 畫板_2 2.8 文本處理 2.9 輸出_3 2.10 speech_synthesis_1x5 2.11 get_audio_duration_1 2.12 代碼 2.13 get_audio_durati…

質量屬性場景(Quality Attribute Scenario)深度解析

本質定義:質量屬性場景(Quality Attribute Scenario)是精確描述軟件系統質量要求的結構化方法,通過標準化的場景模板將抽象的質量屬性轉化為可測量、可驗證的具體行為描述,為架構設計提供客觀評估基準。 一、質量屬性場景核心結構 1. 六元組標準模板 #mermaid-svg-AGbvPVRu…

Java_Springboot技術框架講解部分(一)

首先講解一下&#xff1a;Java技術棧中&#xff0c;目前Spring Boot在國內的關注趨勢也日漸超過Spring。Spring Boot是Spring家族中的一個全新的框架&#xff0c;它用來簡化Spring應用程序的創建和開發過程。采用Spring Boot可以非常容易和快速的構建基于Spring框架的應用程序&…

從OpenMV到執行器:當PID算法開始“調教”舵機

如果到現在還不會驅動舵機——朋友&#xff0c;電賽的元器件清單每年都在對你“明示”&#xff0c;二維云臺都快成祖傳考題了&#xff01;補課&#xff1f;現在&#xff01;立刻&#xff01;&#xff08;當然&#xff0c;如果你臉皮夠厚&#xff0c;也可以私信騷擾作者&#xf…