STM32H750 RTC介紹及應用

第十一章 RTC介紹及應用

1. RTC 簡介

RTC(Real-Time Clock,實時時鐘)是 STM32H750VBT6 中用于提供日歷和時鐘功能的低功耗外設,即使主電源關閉,只要 VBAT(備份電源)供電,RTC 仍能持續運行,實現 年、月、日、時、分、秒 的精確計時。RTC 是嵌入式系統中實現 時間戳記錄、定時喚醒、鬧鐘提醒 等功能的核心組件,廣泛應用于數據記錄儀、智能電表、工業控制器等需要時間信息的場景。

🔍 核心定位

  • RTC ≠ 系統滴答定時器,而是獨立于 CPU 的“電子表”
  • 支持 BCD 編碼(Binary-Coded Decimal)存儲時間
  • 可由 LSE(32.768 kHz 晶體)LSI(內部 RC) 驅動
  • 支持 毫秒級時間戳捕獲(配合 TAMP 或 TIMESTAMP 功能)

1.1 RTC 核心特性(STM32H750VBT6)

特性參數說明應用場景
時鐘源LSE(32.768 kHz 外部晶振)
LSI(~32 kHz 內部 RC)
HSE 分頻
LSE 最精確(±20 ppm)工業級計時
日歷功能年(00–99)、月、日、星期、時、分、秒自動潤年處理數據日志記錄
鬧鐘(Alarm)Alarm A / B可設置日+時+分+秒匹配定時任務喚醒
周期性喚醒Wakeup Timer最高 17 位定時(秒級)低功耗輪詢
時間戳(Timestamp)外部引腳觸發捕獲事件發生時間故障記錄
入侵檢測(TAMP)TAMP1/2/3 引腳防拆/防篡改檢測安全設備
備份寄存器32 × 32-bit斷電保存用戶數據配置/狀態存儲
低功耗Stop/Standby 模式下運行電流 < 1 μA(LSE 驅動)電池供電設備

📌 STM32H750VBT6 專屬優勢

  • 雙備份域:RTC 和備份寄存器位于 D3 域,可獨立關閉主電源
  • 亞秒級時間戳:支持 RTC_SUBR(Sub-second Register)實現毫秒精度
  • 日歷自動校準:可通過 CALIBR 寄存器進行 ±488 ppm 校準
  • 安全功能:TAMP 事件可觸發 RTC_TAMPCR.TAMPFREQ 頻率檢測

1.2 RTC 工作原理詳解

1.2.1 時鐘樹結構
PREDIV_S = 127
PREDIV_A = 255
時鐘源
預分頻器
1 Hz 時鐘
用于亞秒計數
日歷計數器
亞秒寄存器
  • 關鍵公式

    • f<sub>RTC</sub> = f<sub>clk</sub> / ((PREDIV_A + 1) × (PREDIV_S + 1))
    • 默認配置:PREDIV_A = 255, PREDIV_S = 127f<sub>RTC</sub> = 32768 / (256 × 128) = 1 Hz
  • BCD 編碼示例

    • 時間:14:35:27
    • RTC_TR = 0x143527(BCD 格式)
    • 二進制:0001 0100 0011 0101 0010 0111
1.2.2 閏年處理
  • RTC 自動處理閏年(2024、2028 等)
  • 2 月 29 日自動識別,無需軟件干預
  • 世紀位由軟件維護(STM32 不支持 2100 年自動修正)
1.2.3 亞秒與時間戳
  • SUBR 寄存器:

    • 遞減計數器,從 PREDIV_S 到 0
    • 當秒更新時,SUBR 被重載
    • 毫秒計算ms = ((PREDIV_S + 1) - SUBR) × (1000 / (PREDIV_S + 1))
      示例:PREDIV_S=127 → ms = (128 - SUBR) × 7.8125
  • 時間戳捕獲

    • 上升沿觸發 RTC_TS 引腳
    • 自動鎖存 RTC_TRRTC_DR
    • 可通過 RTC_SR.TSF 標志讀取

1.3 關鍵寄存器操作

1.3.1 RTC 主要寄存器
寄存器功能說明
TRTime RegisterH[22:16], M[15:8], S[7:0], PM
DRDate RegisterYT[31:28], UT[27:24], DU[23:20], MT[19:16], MU[15:12], WDU[10:8], YT[7:4], UT[3:0]
CRControl Register允許寫保護、中斷使能
ISRStatus RegisterINITS, RSF, INITF, ALRAWF
PRERPrescaler RegisterPREDIV_S, PREDIV_A
ALRMxRAlarm Register設置鬧鐘時間
WUTRWakeup Timer Register喚醒計數值
TAMPCRTamper Control入侵檢測配置
1.3.2 RTC 初始化流程(寄存器級)
// 1. 使能備份域訪問
PWR->CR1 |= PWR_CR1_DBP;
while (!(PWR->CR1 & PWR_CR1_DBP)); // 等待就緒// 2. 選擇 LSE 作為 RTC 時鐘源
RCC->BDCR |= RCC_BDCR_LSEON; // 啟動 LSE
while (!(RCC->BDCR & RCC_BDCR_LSERDY)); // 等待穩定
RCC->BDCR &= ~RCC_BDCR_RTCSEL; // 清除選擇
RCC->BDCR |= RCC_BDCR_RTCSEL_0; // 01 = LSE
RCC->BDCR |= RCC_BDCR_RTCEN; // 使能 RTC// 3. 進入初始化模式
RTC->WPR = 0xCA; // 解鎖寫保護
RTC->WPR = 0x53;
RTC->ISR |= RTC_ISR_INIT; // 進入初始化模式
while (!(RTC->ISR & RTC_ISR_INITF)); // 等待進入// 4. 配置預分頻器(1 Hz)
RTC->PRER = (255 << 16) | 127; // PREDIV_A=255, PREDIV_S=127// 5. 設置初始時間(12:00:00)
RTC->TR = 0x120000; // BCD: 12:00:00
RTC->DR = 0x2401015 << 0; // 2024年1月1日,星期一// 6. 退出初始化模式
RTC->ISR &= ~RTC_ISR_INIT;
while (RTC->ISR & RTC_ISR_INIT); // 等待退出// 7. 鎖定寫保護
RTC->WPR = 0xFF;
1.3.3 HAL 庫簡化操作
RTC_TimeTypeDef sTime = {0};
RTC_DateTypeDef sDate = {0};sTime.Hours   = 12;
sTime.Minutes = 0;
sTime.Seconds = 0;
sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
sTime.StoreOperation = RTC_STOREOPERATION_RESET;sDate.WeekDay = RTC_WEEKDAY_MONDAY;
sDate.Month   = RTC_MONTH_JANUARY;
sDate.Date    = 1;
sDate.Year    = 24;if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK) {Error_Handler();
}
if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK) {Error_Handler();
}

2. RTC使用示例-STM32IDE

2.1 STM32Cube配置

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

2.2 用戶代碼

#include "rtc.h"
#include "led.h"
#include "usart.h"
#include <stdio.h>RTC_HandleTypeDef hrtc;
/* 月修正數據表 */
uint8_t const table_week[12] = {0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5};// 寫入后備域SRAM
void rtc_write_bkr(uint32_t bkrx, uint32_t data)
{HAL_PWR_EnableBkUpAccess(); // 使能后備寄存器訪問HAL_RTCEx_BKUPWrite(&hrtc, bkrx, data); // 寫入數據
}// 讀取后備域SRAM
uint32_t rtc_read_bkr(uint32_t bkrx)
{uint32_t data;data = HAL_RTCEx_BKUPRead(&hrtc, bkrx); // 讀取數據return data;
}// 設置時間
void rtc_set_time(uint8_t hour, uint8_t min, uint8_t sec, uint8_t ampm)
{RTC_TimeTypeDef sTime = {0};sTime.Hours = hour;sTime.Minutes = min;sTime.Seconds = sec;sTime.TimeFormat = ampm;sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;sTime.StoreOperation = RTC_STOREOPERATION_RESET;if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK){Error_Handler();}
}// 設置日期
void rtc_set_date(uint8_t year, uint8_t month, uint8_t date, uint8_t week)
{RTC_DateTypeDef sDate = {0};sDate.Year = year;sDate.Month = month;sDate.Date = date;sDate.WeekDay = week;if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK){Error_Handler();}
}/* RTC init function */
uint8_t MX_RTC_Init(void)
{uint16_t bkp_flag = 0; // 檢查是不是第一次配置時鐘// RTC 初始化hrtc.Instance = RTC;hrtc.Init.HourFormat = RTC_HOURFORMAT_24; // 24小時制hrtc.Init.AsynchPrediv = 0x7F; // 異步分頻系數hrtc.Init.SynchPrediv = 0xFF;  // 同步分頻系數hrtc.Init.OutPut = RTC_OUTPUT_DISABLE; // 不輸出信號hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH; // 輸出極性hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN; // 輸出類型hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;bkp_flag = rtc_read_bkr(0); // 讀取后備寄存器0的值if (HAL_RTC_Init(&hrtc) != HAL_OK){Error_Handler();return 1;}if((bkp_flag != 0x5050) && (bkp_flag != 0x5051)){// 第一次配置RTC,手動設置初值rtc_set_time(12, 12, 12, RTC_HOURFORMAT12_AM); // 設置時間 上午12:12:12rtc_set_date(23, 3, 1, 3); // 設置日期 2023年3月1日 星期三}return 0;
}/*** @brief       RTC底層驅動,時鐘配置* @param       hrtc:RTC句柄* @note        此函數會被HAL_RTC_Init()調用* @retval      無*/
void HAL_RTC_MspInit(RTC_HandleTypeDef* hrtc)
{uint16_t retry = 200;RCC_OscInitTypeDef rcc_osc_init;RCC_PeriphCLKInitTypeDef rcc_periphclk_init;__HAL_RCC_RTC_CLK_ENABLE();     /* 使能RTC時鐘 */HAL_PWR_EnableBkUpAccess();     /* 取消備份區域寫保護 */__HAL_RCC_RTC_ENABLE();         /* RTC時鐘使能 *//* 使用寄存器的方式去檢測LSE是否可以正常工作 */RCC->BDCR |= 1 << 0;    /* 開啟外部低速振蕩器LSE */while (retry && ((RCC->BDCR & 0X02) == 0))  /* 等待LSE準備好 */{retry--;HAL_Delay(5);}if (retry == 0)     /* LSE起振失敗,使用LSI */{rcc_osc_init.OscillatorType = RCC_OSCILLATORTYPE_LSI;           /* 選擇要配置的振蕩器 */rcc_osc_init.LSEState = RCC_LSI_ON;                             /* LSI狀態:開啟 */rcc_osc_init.PLL.PLLState = RCC_PLL_NONE;                       /* PLL無配置 */HAL_RCC_OscConfig(&rcc_osc_init);                               /* 配置設置的rcc_oscinitstruct */rcc_periphclk_init.PeriphClockSelection = RCC_PERIPHCLK_RTC;    /* 選擇要配置的外設 RTC */rcc_periphclk_init.RTCClockSelection = RCC_RTCCLKSOURCE_LSI;    /* RTC時鐘源選擇 LSI */HAL_RCCEx_PeriphCLKConfig(&rcc_periphclk_init);                 /* 配置設置的rcc_periphClkInitStruct */rtc_write_bkr(0, 0X5051);}else{rcc_osc_init.OscillatorType = RCC_OSCILLATORTYPE_LSE;           /* 選擇要配置的振蕩器 */rcc_osc_init.PLL.PLLState = RCC_PLL_NONE;                       /* PLL不配置 */rcc_osc_init.LSEState = RCC_LSE_ON;                             /* LSE狀態:開啟 */HAL_RCC_OscConfig(&rcc_osc_init);                               /* 配置設置的rcc_oscinitstruct */rcc_periphclk_init.PeriphClockSelection = RCC_PERIPHCLK_RTC;    /* 選擇要配置外設 RTC */rcc_periphclk_init.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;    /* RTC時鐘源為LSE */HAL_RCCEx_PeriphCLKConfig(&rcc_periphclk_init);                 /* 配置設置的rcc_periphclkinitstruct */rtc_write_bkr(0, 0X5050);}
}void HAL_RTC_MspDeInit(RTC_HandleTypeDef* rtcHandle)
{if(rtcHandle->Instance==RTC){/* USER CODE BEGIN RTC_MspDeInit 0 *//* USER CODE END RTC_MspDeInit 0 *//* Peripheral clock disable */__HAL_RCC_RTC_DISABLE();/* RTC interrupt Deinit */HAL_NVIC_DisableIRQ(RTC_WKUP_IRQn);HAL_NVIC_DisableIRQ(RTC_Alarm_IRQn);/* USER CODE BEGIN RTC_MspDeInit 1 *//* USER CODE END RTC_MspDeInit 1 */}
}// 獲取RTC時間
void rtc_get_time(uint8_t* hour, uint8_t* min, uint8_t* sec, uint8_t* ampm)
{RTC_TimeTypeDef sTime = {0};HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN);*hour = sTime.Hours;*min = sTime.Minutes;*sec = sTime.Seconds;*ampm = sTime.TimeFormat;
}// 獲取RTC日期
void rtc_get_date(uint8_t* year, uint8_t* month, uint8_t* date, uint8_t* week)
{RTC_DateTypeDef sDate = {0};HAL_RTC_GetDate(&hrtc, &sDate, RTC_FORMAT_BIN);*year = sDate.Year;*month = sDate.Month;*date = sDate.Date;*week = sDate.WeekDay;
}/*** @breif       獲得現在是星期幾, 輸入公歷日期得到星期(只允許1901-2099年)* @param       year,month,day:公歷年月日* @retval      星期號(1~7,代表周1~周日)*/
uint8_t rtc_get_week(uint16_t year, uint8_t month, uint8_t day)
{uint16_t temp2;uint8_t yearH, yearL;yearH = year / 100;yearL = year % 100;/*  如果為21世紀,年份數加100 */if (yearH > 19)yearL += 100;/*  所過閏年數只算1900年之后的 */temp2 = yearL + yearL / 4;temp2 = temp2 % 7;temp2 = temp2 + day + table_week[month - 1];if (yearL % 4 == 0 && month < 3)temp2--;temp2 %= 7;if (temp2 == 0)temp2 = 7;return temp2;
}/*** @breif       設置鬧鐘時間(按星期鬧鈴,24小時制)* @param       week        : 星期幾(1~7)* @param       hour,min,sec: 小時,分鐘,秒鐘* @retval      無*/
void rtc_set_alarma(uint8_t week, uint8_t hour, uint8_t min, uint8_t sec)
{RTC_AlarmTypeDef rtc_alarm;rtc_alarm.AlarmTime.Hours = hour;                                /* 小時 */rtc_alarm.AlarmTime.Minutes = min;                               /* 分鐘 */rtc_alarm.AlarmTime.Seconds = sec;                               /* 秒 */rtc_alarm.AlarmTime.SubSeconds = 0;rtc_alarm.AlarmTime.TimeFormat = RTC_HOURFORMAT12_AM;rtc_alarm.AlarmMask = RTC_ALARMMASK_NONE;                        /* 精確匹配星期,時分秒 */rtc_alarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_NONE;rtc_alarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_WEEKDAY; /* 按星期 */rtc_alarm.AlarmDateWeekDay = week;                               /* 星期 */rtc_alarm.Alarm = RTC_ALARM_A;                                   /* 鬧鐘A */HAL_RTC_SetAlarm_IT(&hrtc, &rtc_alarm, RTC_FORMAT_BIN);HAL_NVIC_SetPriority(RTC_Alarm_IRQn, 1, 2);   /* 搶占優先級1,子優先級2 */HAL_NVIC_EnableIRQ(RTC_Alarm_IRQn);
}/*** @breif       周期性喚醒定時器設置* @param       wksel*   @arg       RTC_WAKEUPCLOCK_RTCCLK_DIV16        ((uint32_t)0x00000000)*   @arg       RTC_WAKEUPCLOCK_RTCCLK_DIV8         ((uint32_t)0x00000001)*   @arg       RTC_WAKEUPCLOCK_RTCCLK_DIV4         ((uint32_t)0x00000002)*   @arg       RTC_WAKEUPCLOCK_RTCCLK_DIV2         ((uint32_t)0x00000003)*   @arg       RTC_WAKEUPCLOCK_CK_SPRE_16BITS      ((uint32_t)0x00000004)*   @arg       RTC_WAKEUPCLOCK_CK_SPRE_17BITS      ((uint32_t)0x00000006)* @note        000,RTC/16;001,RTC/8;010,RTC/4;011,RTC/2;* @note        注意:RTC就是RTC的時鐘頻率,即RTCCLK!* @param       cnt: 自動重裝載值.減到0,產生中斷.* @retval      無*/
void rtc_set_wakeup(uint8_t wksel, uint16_t cnt)
{__HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(&hrtc, RTC_FLAG_WUTF);  /* 清除RTC WAKE UP的標志 */HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, cnt, wksel);          /* 設置重裝載值和時鐘 */HAL_NVIC_SetPriority(RTC_WKUP_IRQn, 2, 2);                       /* 搶占優先級2,子優先級2 */HAL_NVIC_EnableIRQ(RTC_WKUP_IRQn);
}/*** @brief This function handles RTC alarms (A and B) interrupt through EXTI line 17.*/
void RTC_Alarm_IRQHandler(void)
{HAL_RTC_AlarmIRQHandler(&hrtc);
}void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
{printf("AlarmA Wakeup\r\n");
}/*** @brief This function handles RTC wake-up interrupt through EXTI line 19.*/
void RTC_WKUP_IRQHandler(void)
{HAL_RTCEx_WakeUpTimerIRQHandler(&hrtc);
}void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc)
{HAL_GPIO_TogglePin(LED_RED_Port, LED_RED_Pin);printf("Wakeup\r\n");
}
#include "main.h"
#include "rtc.h"
#include "bsp_init.h"
#include "stdio.h" // For printf functionvoid SystemClock_Config(void);
static void MPU_Config(void);int main(void)
{uint8_t hour, min, sec, ampm;uint8_t year, month, date, week;uint8_t i = 0;MPU_Config();HAL_Init();SystemClock_Config();bsp_init();MX_RTC_Init();rtc_set_wakeup(RTC_WAKEUPCLOCK_CK_SPRE_16BITS, 0); // 每隔1秒鐘喚醒一次rtc_set_time(12, 12, 12, RTC_HOURFORMAT12_AM); // 設置時間 上午12:12:12rtc_set_date(23, 3, 1, 3); // 設置日期 2023年3月1日 星期三rtc_set_alarma(3, 12, 12, 50); // 設置鬧鐘 星期三 12:12:50while (1){i++;if((i % 10) == 0){rtc_get_time(&hour, &min, &sec, &ampm);printf("Time: %02d:%02d:%02d %s, ", hour, min, sec, (ampm == RTC_HOURFORMAT12_AM) ? "AM" : "PM");rtc_get_date(&year, &month, &date, &week);printf("Date: 20%02d-%02d-%02d, Weekday: %d\r\n", year, month, date, week);}HAL_Delay(100);}
}/*** @brief System Clock Configuration* @retval None*/
void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};/** Supply configuration update enable*/HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);/** Configure the main internal regulator output voltage*/__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0);while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}/** Initializes the RCC Oscillators according to the specified parameters* in the RCC_OscInitTypeDef structure.*/RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.LSIState = RCC_LSI_ON;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLM = 2;RCC_OscInitStruct.PLL.PLLN = 240;RCC_OscInitStruct.PLL.PLLP = 2;RCC_OscInitStruct.PLL.PLLQ = 2;RCC_OscInitStruct.PLL.PLLR = 2;RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2;RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;RCC_OscInitStruct.PLL.PLLFRACN = 0;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_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK){Error_Handler();}
}/* USER CODE BEGIN 4 *//* USER CODE END 4 *//* MPU Configuration */void MPU_Config(void)
{MPU_Region_InitTypeDef MPU_InitStruct = {0};/* Disables the MPU */HAL_MPU_Disable();/** Initializes and configures the Region and the memory to be protected*/MPU_InitStruct.Enable = MPU_REGION_ENABLE;MPU_InitStruct.Number = MPU_REGION_NUMBER0;MPU_InitStruct.BaseAddress = 0x0;MPU_InitStruct.Size = MPU_REGION_SIZE_4GB;MPU_InitStruct.SubRegionDisable = 0x87;MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;MPU_InitStruct.AccessPermission = MPU_REGION_NO_ACCESS;MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_DISABLE;MPU_InitStruct.IsShareable = MPU_ACCESS_SHAREABLE;MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;HAL_MPU_ConfigRegion(&MPU_InitStruct);/* Enables the MPU */HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);}/*** @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 */

3. RTC相關函數總結(HAL庫)

3.1 初始化與配置

  • 核心配置流程(五步關鍵操作):

    1. 使能時鐘(PWR + RTC + LSE/LSI)
    2. 配置備份域訪問
    3. 選擇時鐘源(LSE/LSI/HSE)
    4. 初始化RTC參數
    5. 配置NVIC中斷
  • HAL_RTC_Init(RTC_HandleTypeDef *hrtc)
    基礎配置示例(LSE 32.768kHz):

    // 1. 使能電源和備份域時鐘
    __HAL_RCC_PWR_CLK_ENABLE();
    HAL_PWR_EnableBkUpAccess();  // 使能備份域訪問// 2. 配置LSE時鐘源
    RCC_OscInitTypeDef RCC_OscInitStruct = {0};
    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE;
    RCC_OscInitStruct.LSEState = RCC_LSE_ON;
    HAL_RCC_OscConfig(&RCC_OscInitStruct);// 3. 配置RTC時鐘源
    __HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_LSE);
    __HAL_RCC_RTC_ENABLE();// 4. 初始化RTC
    hrtc.Instance = RTC;
    hrtc.Init.HourFormat = RTC_HOURFORMAT_24;           // 24小時制
    hrtc.Init.AsynchPrediv = 127;                       // 異步預分頻 (128分頻)
    hrtc.Init.SynchPrediv = 255;                        // 同步預分頻 (256分頻)
    hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;             // 禁用輸出
    hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
    hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
    HAL_RTC_Init(&hrtc);
    
  • RTC_InitTypeDef 結構體成員說明

    成員說明有效值H750特殊說明
    HourFormat時間格式RTC_HOURFORMAT_12, RTC_HOURFORMAT_24推薦24小時制
    AsynchPrediv異步預分頻0-0x7FLSE/LSI頻率-1
    SynchPrediv同步預分頻0-0xFFFFRTCCLK/(Asynch+1)-1
    OutPut輸出使能RTC_OUTPUT_ENABLE, RTC_OUTPUT_DISABLE可輸出秒脈沖
    OutPutPolarity輸出極性RTC_OUTPUT_POLARITY_HIGH, LOW
    OutPutType輸出類型RTC_OUTPUT_TYPE_OPENDRAIN, PUSHPULL開漏需上拉
  • 時鐘源選擇與配置

    時鐘源頻率精度配置方法
    LSE32.768kHz±20ppmRCC_RTCCLKSOURCE_LSE
    LSI32kHz±5000ppmRCC_RTCCLKSOURCE_LSI
    HSE1-25MHz±25ppmRCC_RTCCLKSOURCE_HSE (分頻后)
  • 預分頻值計算公式(核心!):

    AsynchPrediv = RTCCLK / (1Hz × (SynchPrediv+1)) - 1
    

    H750典型配置(LSE=32.768kHz):

    AsynchPrediv = 12732768 / 128 = 256Hz
    SynchPrediv  = 255256 / 256 = 1Hz (精確秒脈沖)
    

3.2 時間與鬧鐘配置

  • 時間配置函數

    // 設置當前時間
    RTC_TimeTypeDef sTime = {0};
    sTime.Hours = 14;
    sTime.Minutes = 30;
    sTime.Seconds = 0;
    sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
    sTime.StoreOperation = RTC_STOREOPERATION_RESET;
    HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN);// 設置當前日期
    RTC_DateTypeDef sDate = {0};
    sDate.WeekDay = RTC_WEEKDAY_THURSDAY;
    sDate.Month = RTC_MONTH_JULY;
    sDate.Date = 25;
    sDate.Year = 24;  // 2024年
    HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN);
    
  • 鬧鐘配置函數

    // 配置鬧鐘A(每分鐘觸發)
    RTC_AlarmTypeDef sAlarm = {0};
    sAlarm.AlarmTime.Seconds = 0;
    sAlarm.AlarmTime.Minutes = RTC_ALARMMASK_ALL;  // 每分鐘
    sAlarm.AlarmTime.Hours = RTC_ALARMMASK_ALL;
    sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
    sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET;
    sAlarm.AlarmMask = RTC_ALARMMASK_NONE;
    sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_NONE;
    sAlarm.Alarm = RTC_ALARM_A;
    sAlarm.AlarmTime.TimeFormat = RTC_HOURFORMAT12_AM;
    sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;
    sAlarm.AlarmDateWeekDay = 1;
    HAL_RTC_SetAlarm(&hrtc, &sAlarm, RTC_FORMAT_BIN);// 啟動鬧鐘中斷
    HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN);
    
  • 時間格式說明

    格式說明示例應用場景
    RTC_FORMAT_BIN二進制Hours=14推薦使用
    RTC_FORMAT_BCDBCD碼Hours=0x14兼容舊系統
  • 鬧鐘掩碼控制

    掩碼宏效果典型應用
    RTC_ALARMMASK_NONE秒/分/時/日都匹配精確時間觸發
    RTC_ALARMMASK_DATEWEEKDAY僅時/分/秒匹配每天同一時間
    RTC_ALARMMASK_HOURS僅分/秒匹配每小時整點
    RTC_ALARMMASK_ALL僅秒匹配每分鐘觸發

3.3 RTC操作核心函數

  • 基礎控制函數

    函數原型功能應用場景
    HAL_RTC_GetTime()(hrtc, *sTime, Format)讀取當前時間顯示時間
    HAL_RTC_GetDate()(hrtc, *sDate, Format)讀取當前日期日歷功能
    HAL_RTC_SetTime()(hrtc, *sTime, Format)設置時間時間同步
    HAL_RTC_SetDate()(hrtc, *sDate, Format)設置日期
    HAL_RTC_WaitForSynchro()(hrtc)等待同步初始化后調用
    HAL_RTCEx_BKUPWrite()(hrtc, No, Data)寫備份寄存器保存狀態
    HAL_RTCEx_BKUPRead()(hrtc, No)讀備份寄存器恢復狀態
  • 備份寄存器操作(H750有32個):

    // 寫備份寄存器
    HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR1, 0x1234);// 讀備份寄存器
    uint32_t data = HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR1);// 保存復位原因
    if (__HAL_RCC_GET_FLAG(RCC_FLAG_PINRST)) {HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR0, 1);
    }
    
  • 日歷同步處理

    // 讀取時間前等待同步
    HAL_RTC_WaitForSynchro(&hrtc);RTC_TimeTypeDef sTime = {0};
    RTC_DateTypeDef sDate = {0};
    HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
    HAL_RTC_GetDate(&hrtc, &sDate, RTC_FORMAT_BIN);
    

3.4 高級功能與特性

  • 喚醒定時器(Wake-up Timer):

    // 配置周期性喚醒(每4秒)
    HAL_RTCEx_SetWakeUpTimer(&hrtc, 4-1, RTC_WAKEUPCLOCK_RTCCLK_DIV16);// 啟動喚醒中斷
    HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 4-1, RTC_WAKEUPCLOCK_RTCCLK_DIV16);// 喚醒回調
    void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc)
    {sensor_sampling();  // 喚醒后執行采樣
    }
    
  • 時間戳功能

    // 使能時間戳
    HAL_RTCEx_SetTimeStamp(&hrtc, RTC_TIMESTAMPEDGE_RISING, RTC_TIMESTAMPPIN_DEFAULT);// 讀取時間戳
    RTC_TimeTypeDef sTimeStampTime = {0};
    RTC_DateTypeDef sTimeStampDate = {0};
    HAL_RTCEx_GetTimeStamp(&hrtc, &sTimeStampTime, &sTimeStampDate, RTC_FORMAT_BIN);
    
  • 日歷亞秒處理

    // 讀取亞秒值(用于高精度時間戳)
    uint32_t subsecond = READ_REG(hrtc->Instance->SSR) & RTC_SSR_SS;
    uint32_t fraction = (hrtc->Init.SynchPrediv - subsecond);
    
  • 低功耗模式喚醒

    // STOP2模式下RTC喚醒
    HAL_PWREx_EnableInternalWakeUpLine();
    HAL_SuspendTick();
    HAL_PWR_EnterSTOP2Mode(PWR_STOPENTRY_WFI);// 喚醒后恢復
    SystemClock_Config();
    HAL_ResumeTick();
    

3.5 使用示例(完整流程)

3.5.1 示例1:RTC初始化與鬧鐘配置
RTC_HandleTypeDef hrtc = {0};void RTC_Config(void)
{// 1. 使能PWR時鐘并開啟備份域訪問__HAL_RCC_PWR_CLK_ENABLE();HAL_PWR_EnableBkUpAccess();// 2. 配置LSE時鐘RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE;RCC_OscInitStruct.LSEState = RCC_LSE_ON;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {Error_Handler();}// 3. 配置RTC時鐘源__HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_LSE);__HAL_RCC_RTC_ENABLE();// 4. 初始化RTChrtc.Instance = RTC;hrtc.Init.HourFormat = RTC_HOURFORMAT_24;hrtc.Init.AsynchPrediv = 127;   // 32768/128=256Hzhrtc.Init.SynchPrediv = 255;    // 256/256=1Hzhrtc.Init.OutPut = RTC_OUTPUT_DISABLE;if (HAL_RTC_Init(&hrtc) != HAL_OK) {Error_Handler();}// 5. 等待日歷同步HAL_RTC_WaitForSynchro(&hrtc);// 6. 設置初始時間RTC_TimeTypeDef sTime = {0};sTime.Hours = 0;sTime.Minutes = 0;sTime.Seconds = 0;HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN);RTC_DateTypeDef sDate = {0};sDate.WeekDay = RTC_WEEKDAY_MONDAY;sDate.Month = RTC_MONTH_JANUARY;sDate.Date = 1;sDate.Year = 24;HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN);// 7. 配置鬧鐘(每分鐘觸發)RTC_AlarmTypeDef sAlarm = {0};sAlarm.AlarmTime.Seconds = 0;sAlarm.AlarmMask = RTC_ALARMMASK_HOURS | RTC_ALARMMASK_DATEWEEKDAY;sAlarm.Alarm = RTC_ALARM_A;HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN);// 8. 配置NVICHAL_NVIC_SetPriority(RTC_Alarm_IRQn, 1, 0);HAL_NVIC_EnableIRQ(RTC_Alarm_IRQn);
}// 鬧鐘中斷服務函數
void RTC_Alarm_IRQHandler(void)
{HAL_RTC_AlarmIRQHandler(&hrtc);
}// 鬧鐘回調函數
void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
{static uint8_t minute_count = 0;minute_count++;// 每10分鐘記錄一次if(minute_count >= 10) {log_data_to_sdcard();minute_count = 0;}
}
3.5.2 示例2:備份寄存器保存運行狀態
// 定義狀態枚舉
typedef enum {STATE_INIT = 0,STATE_RUNNING = 1,STATE_STOPPED = 2
} SystemState;void Save_System_State(SystemState state)
{// 寫入備份寄存器HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR0, (uint32_t)state);// 保存運行時間(小時)uint32_t runtime = get_total_runtime_hours();HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR1, runtime);
}SystemState Read_System_State(void)
{return (SystemState)HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR0);
}// 系統啟動時檢查狀態
void System_Init(void)
{SystemState last_state = Read_System_State();switch(last_state) {case STATE_RUNNING:// 上次異常關機,執行恢復程序recovery_procedure();break;case STATE_STOPPED:// 正常關機,繼續啟動break;default:// 首次啟動factory_reset();break;}// 更新狀態為運行中Save_System_State(STATE_RUNNING);
}

4. 關鍵注意事項

  1. 備份域訪問權限
  • 必須調用HAL_PWR_EnableBkUpAccess()

  • 否則所有RTC配置將失敗(返回HAL_ERROR

  • 錯誤示例

    // 忘記使能備份域訪問
    __HAL_RCC_PWR_CLK_ENABLE();
    // ... 直接調用HAL_RTC_Init() → 失敗!
    
  1. 時鐘源穩定性
  • LSE啟動時間:典型500ms,需等待穩定

    // 檢查LSE是否就緒
    while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) {HAL_Delay(10);
    }
    
  • LSI精度問題:±5000ppm → 每天誤差±432秒

  • HSE分頻配置

    // HSE分頻后作為RTC時鐘
    __HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_HSE_DIV32);
    
  1. 低功耗模式陷阱
模式RTC行為H750特殊處理
RUN正常工作
SLEEP繼續運行
STOP0繼續運行需保持VDD/VBAT
STOP1/2繼續運行可喚醒系統
STANDBY繼續運行主要喚醒源
  1. 初始化同步要求
  • 必須調用HAL_RTC_WaitForSynchro()

  • 否則讀取的時間可能不準確

  • 執行時機

    HAL_RTC_Init(&hrtc);
    HAL_RTC_WaitForSynchro(&hrtc);  // 立即調用
    HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN); // 再設置時間
    
  1. 備份寄存器限制
  • H750提供32個32位備份寄存器(RTC_BKP_DR0-DR31)
  • RTC_BKP_DR0可被侵入檢測清除
  • 推薦用途:
    • DR0-DR5:系統狀態/運行時間
    • DR6-DR10:校準參數
    • DR11-DR15:故障記錄

4.1 H750特有優化技巧

場景解決方案優勢實現要點
高精度時間戳亞秒+毫秒計數微秒級精度SSR + DWT_CYCCNT
電池供電優化STOP2 + RTC喚醒功耗<10μAHAL_PWR_EnterSTOP2Mode()
時間同步NTP + RTC備份掉電不丟時間HAL_RTC_SetTime()定期校準
安全啟動備份寄存器防篡改防止非法修改RTC_BKP_DR0存儲哈希值

避坑指南

  1. H750時鐘樹特殊性
  • RTC時鐘源選擇通過RCC->BDCR寄存器
  • 一旦選擇不能更改(除非系統復位)
  1. 亞秒計算陷阱
// 正確的亞秒計算(從0到1秒)
uint32_t subsecond = hrtc.Init.SynchPrediv - READ_REG(RTC->SSR);
float seconds = sTime.Seconds + ((float)subsecond / (hrtc.Init.SynchPrediv + 1));
  1. 鬧鐘中斷優先級
  • 鬧鐘中斷(RTC_Alarm_IRQn)優先級必須高于SysTick
  • 否則在中斷中調用HAL_Delay()會導致死鎖
  1. 備份電源設計
  • VBAT引腳必須接3V鋰電池超級電容
  • 電源紋波 < 50mV,否則可能導致RTC復位
  1. 多實例競爭
  • 同一時間只能有一個RTC操作

  • 在RTOS中使用互斥鎖:

    osMutexWait(rtc_mutex, osWaitForever);
    HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
    osMutexRelease(rtc_mutex);
    

4.2 RTC工作模式對比

┌───────────────┬───────────────┬───────────────┬───────────────┐
│    功能       │   LSE模式     │   LSI模式     │   HSE模式     │
├───────────────┼───────────────┼───────────────┼───────────────┤
│ 精度          │ ±20ppm        │ ±5000ppm      │ ±25ppm        │
│ 啟動時間      │ 500ms         │ 10ms          │ 100ms         │
│ 功耗          │ 1μA           │ 3μA           │ 10μA          │
│ 外部元件      │ 32.768kHz晶振 │ 無            │ 高速晶振      │
│ 場景          │ 高精度計時    │ 快速啟動      │ 高頻源利用    │
└───────────────┴───────────────┴───────────────┴───────────────┘

文中代碼下載:https://github.com/hazy1k/STM32H7-Quick-Start-Guide-CubeIDE/tree/main/2.code

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

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

相關文章

飛網自適應通信:IPv4 與 IPv6 環境下的高效互聯

一、網絡連接的難題與飛網的解決方案 在日常生活中&#xff0c;我們常常會碰到這樣的場景&#xff1a;在家用手機訪問公司電腦里的重要文件&#xff0c;或者遠程連接家里的NAS設備查看照片和視頻。這些操作都需要設備之間建立起安全又穩定的連接。然而&#xff0c;現實中的網絡…

拉格朗日多項式

最近打的幾個比賽沒意思&#xff0c;不是不會就是不會。不過比賽完后看到別人的WP&#xff0c;感覺受益匪淺。先看一個多項式&#xff1a;當輸入Xi時會得到一個Si,要求輸入一定數量的xi 來求[c] 當可以輸入的x個數與c的個數相同時&#xff0c;可以用矩陣直接求解。&#xff08;…

Vue3 + TypeScript 實現文件拖拽上傳

應用效果&#xff1a;實例代碼&#xff1a;CommonApplyBasicInfoForm.vue<script setup lang"ts" name"CommonApplyBasicInfoForm"> ...... // 選擇文件列表 const selectedFiles ref<FileList | null>(null); // 通過 FormData 對象實現文件…

2025全國大學生數學建模C題保姆級思路模型(持續更新):NIPT 的時點選擇與胎兒的異常判定

2025全國大學生數學建模C題保姆級思路模型&#xff08;持續更新&#xff09;&#xff1a;NIPT 的時點選擇與胎兒的異常判定&#xff0c;完整持續更新內容見文末名片 胎兒遺傳信息檢測與臨床決策數學建模分析講義 問題一&#xff1a;Y染色體濃度的影響因素探索——線性回歸的“偵…

【筆記】Software Engineering at Google

聚焦核心原則&#xff0c;挑取最讓我眼前一亮的實踐點&#xff0c;特別是那些能直接啟發或解決我當前工作中痛點的部分。0. 序言 最近集中精力速讀了關于 ?Google 軟件工程實踐? 的諸多資料&#xff08;包括官方出版物、工程博客、技術演講以及社區討論&#xff09;。面對 G…

無人機防風技術難點解析

防風防御模塊的技術難點主要體現在以下幾個方面風場感知與精準建模1.復雜風場的實時感知&#xff1a;風&#xff0c;尤其是近地面的風&#xff0c;常常是無規則、瞬息萬變的陣風、湍流或風切變。無人機需要通過各種傳感器&#xff08;如空速計、慣性測量單元&#xff08;IMU&am…

HarmonyOS 應用開發深度解析:ArkTS 聲明式 UI 與精細化狀態管理

好的&#xff0c;請看這篇關于 HarmonyOS 應用開發中聲明式 UI 狀態管理的技術文章。 HarmonyOS 應用開發深度解析&#xff1a;ArkTS 聲明式 UI 與精細化狀態管理 引言 隨著 HarmonyOS 4、5 的廣泛應用和 HarmonyOS NEXT 的發布&#xff0c;基于 API 12 及以上的應用開發已成為…

機器學習入門,第一個MCP示例

前面我們已經搭建了屬于自己的AI大模型&#xff1a;詳情見 https://blog.csdn.net/hl_java/article/details/150591424?spm1001.2014.3001.5501 近期MCP概念這么火&#xff0c;那么它到底是什么呢&#xff0c;借一個例子為你講解 第一步&#xff1a;理解MCP的核心價值 MCP (Mo…

flutter 中間組件自適應寬度

使用Flexible IntrinsicWidth Row(children: [Text(第一個text),IntrinsicWidth(child: ConstrainedBox(constraints: BoxConstraints(maxWidth: 200), // 最大寬度限制child: Text(中間的text可能很長也可能很短,overflow: TextOverflow.ellipsis,maxLines: 1,),),),Text(第三…

TDengine 時間函數 DAYOFWEEK 用戶手冊

DAYOFWEEK 函數使用手冊 函數描述 DAYOFWEEK 函數用于返回指定日期是一周中的第幾天。該函數遵循標準的星期編號約定&#xff0c;返回值范圍為 1-7&#xff0c;其中&#xff1a; 1 星期日 (Sunday)2 星期一 (Monday)3 星期二 (Tuesday)4 星期三 (Wednesday)5 星期四 (T…

【STM32】貪吃蛇 [階段 3] 增強模塊結構(架構優化)

這篇博客是 承接&#xff1a;【項目思維】貪吃蛇&#xff08;嵌入式進階方向&#xff09;中 聚焦于 &#x1f9f1; 階段 3&#xff1a;增強模塊結構&#xff08;架構優化&#xff09; 中的 菜單系統&#xff08;Menu System&#xff09;&#xff0c;這部分的結構優化可以學到的…

江協科技STM32學習筆記補充之004

STM32 ISP 一鍵下載電路&#xff08;按功能、邏輯與時序拆解&#xff09;

數據庫小冊(1)

1. 關系型數據庫主要考點關系型數據庫&#xff1a;架構索引鎖語法理論規范2. 如何設計一個關系型數據庫設計即模塊劃分。數據庫最主要的功能是存儲我們的數據&#xff0c;所以需要一個存儲的文件系統。我們要把涉及到的物流數據提供邏輯的形式給組織和表示出來&#xff0c;這是…

記錄收入最高的一次私活 選號網,需要大量賣號的人可能需要,比如游戲腳本批量跑的號

選號網管理后臺(上傳游戲信息、賬號信息、 查看記錄) http://124.223.214.5:180/admin1 選號網客戶端(PC/H5頁面 給客戶篩選商品用) http://124.223.214.5:181/ 該在線地址僅供低頻率測試&#xff0c;正式使用需要另外部署。 功能不滿足可以聯系開發者定制 一、項目的由來 …

熱烈慶祝“中國抗戰勝利80周年”,織信低代碼助力國之重器砥礪前行!

“從保家衛國到科技強軍&#xff0c;織信低代碼平臺為軍工企業數字化轉型注入新動能。”80年后的今天&#xff0c;國人記憶從未褪色。2025年9月3日&#xff0c;正值中國抗戰勝利80周年閱兵之際&#xff0c;我國國防軍工力量在經歷長期的艱苦奮斗后&#xff0c;現今終于迎來了曙…

PostgreSQL與SQL Server:B樹索引差異及去重的優勢

PostgreSQL與SQL Server&#xff1a;B樹索引差異及去重的優勢 在優化查詢性能方面&#xff0c;索引是數據庫工程師可使用的最強大工具之一。PostgreSQL和Microsoft SQL Server&#xff08;或Azure SQL&#xff09;都將B樹索引用作其默認索引結構&#xff0c;但每個系統實現、維…

【微實驗】使用MATLAB制作一張賽博古琴?

當一個理工音樂人沒錢去買古琴&#xff0c;我直接用代碼畫一個古琴&#xff01;目錄 零、總腳本&#xff1a; 一、核心功能&#xff1a;交互模塊拆解 二、核心價值 一、初始化腳本&#xff1a;參數配置與啟動界面 ①廢話不說&#xff0c;直接上代碼 ②代碼模塊拆解與詳細解…

畢業項目推薦:67-基于yolov8/yolov5/yolo11的大棚黃瓜檢測識別系統(Python+卷積神經網絡)

文章目錄 項目介紹大全&#xff08;可點擊查看&#xff0c;不定時更新中&#xff09;概要一、整體資源介紹技術要點功能展示&#xff1a;功能1 支持單張圖片識別功能2 支持遍歷文件夾識別功能3 支持識別視頻文件功能4 支持攝像頭識別功能5 支持結果文件導出&#xff08;xls格式…

無人機小尺寸RFSOC ZU47DR板卡

整板尺寸&#xff1a;120*120mmFPGA: XCZU47DR-2FFVE1156I;DDR&#xff1a;PS側8GB 2400Mhz*64bit / PL側 4GB 2400Mhz*32bit&#xff1b;2路(QSP0QSPI1)/單片512Mb、共計1Gb&#xff1b;千兆以太網&#xff1a;1路&#xff08;PS側&#xff09;&#xff1b;主要接口資源如下&a…

LangGraph(一):入門從0到1(零基礎)

文章目錄LangGraph入門從0到10?? 安裝 & 確認環境1?? 把 LangGraph 想象成「自動化的做菜流水線」2?? 最小可運行例子&#xff1a;一句話復讀機3?? 加一個小節點&#xff1a;把用戶輸入變大寫4?? 條件邊&#xff1a;如果用戶說 quit 就結束&#xff0c;否則復讀5…