增加了一些架构图片
This commit is contained in:
+21
-13
@@ -95,21 +95,29 @@ static volatile uint32_t s_base_unix_secs = UINT32_MAX; /* 基准对应的 Unix
|
||||
|
||||
## 6. 初始化流程(`sys_clock_init`)
|
||||
|
||||
```
|
||||
Step 1 从 SD2506 读取初始时间 sd2506_get_time(&sd_time)
|
||||
├─ 注意:sd_time.year 已是完整年份(驱动内已 +2000),
|
||||
│ 后续换算【不得】再加 2000,否则年份虚增 → Unix 秒数超 uint32 回绕
|
||||
└─ 可选校时(见第 9 节 RTC_DEFAULT_INIT_* 宏)
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
autonumber
|
||||
participant SC as sys_clock_init
|
||||
participant RTC as SD2506 RTC
|
||||
participant HAL as HAL Tick
|
||||
|
||||
Step 2 将 RTC 时间换算为 Unix epoch 秒数
|
||||
├─ 累计 1970 至当前年份的整年天数(含闰年 366 天判定)
|
||||
├─ 加上当年 1 月至当前月的累计天数
|
||||
├─ 加当月已过天数、时/分/秒
|
||||
└─ 用 int64_t 累加,避免中间溢出;结果截断存入 uint32_t(受 2038 限制,见第 12 节)
|
||||
Note over SC,RTC: Step 1 从 SD2506 读取初始时间
|
||||
SC->>RTC: sd2506_get_time(sd_time)
|
||||
RTC-->>SC: sd_time(year 已是完整年份)
|
||||
Note right of SC: 后续换算【不得】再加 2000<br>否则年份虚增 → Unix 秒数超 uint32 回绕
|
||||
Note right of SC: 可选校时(见第 9 节 RTC_DEFAULT_INIT_* 宏)
|
||||
|
||||
Step 3 建立基准
|
||||
s_base_tick = HAL_GetTick();
|
||||
s_base_unix_secs = (uint32_t)unix_secs;
|
||||
Note over SC: Step 2 将 RTC 时间换算为 Unix epoch 秒数
|
||||
SC->>SC: 累计 1970 至当前年份的整年天数(含闰年 366 天判定)
|
||||
SC->>SC: 加上当年 1 月至当前月的累计天数
|
||||
SC->>SC: 加当月已过天数、时/分/秒
|
||||
SC->>SC: 用 int64_t 累加,避免中间溢出;结果截断存入 uint32_t(受 2038 限制,见第 12 节)
|
||||
|
||||
Note over SC,HAL: Step 3 建立基准
|
||||
SC->>HAL: HAL_GetTick()
|
||||
HAL-->>SC: 当前 tick
|
||||
Note right of SC: s_base_tick = HAL_GetTick()<br>s_base_unix_secs = (uint32_t)unix_secs
|
||||
```
|
||||
|
||||
初始化后,所有后续取时都基于 Step 3 的基准推算,不再访问 RTC。
|
||||
|
||||
Reference in New Issue
Block a user