CH395F 硬件测试完毕

This commit is contained in:
2026-08-24 16:16:18 +08:00
parent fc88bc8752
commit 4375873083
14 changed files with 2183 additions and 787 deletions

View File

@@ -16,6 +16,23 @@
#define DBG_TAG "[CLK]"
#include "dbg_log.h"
/* ============================================================
* RTC 校时(开发期一次性)
* 使能 RTC_DEFAULT_INIT_ENABLE 后:
* RTC_DEFAULT_INIT_FORCE=1每次启动都写入默认时间首次/覆盖校时用)
* RTC_DEFAULT_INIT_FORCE=0仅当 RTC 时间无效(越界)时写入
* 校时完成后建议将 FORCE 置 0或注释 ENABLE避免每次开机覆盖用户设的时间。
* 修改日期/时间时同步更新下列宏。
* ============================================================ */
#define RTC_DEFAULT_INIT_ENABLE 1
#define RTC_DEFAULT_INIT_FORCE 1
#define RTC_DEFAULT_YEAR 2026
#define RTC_DEFAULT_MONTH 8
#define RTC_DEFAULT_DAY 24
#define RTC_DEFAULT_HOUR 0
#define RTC_DEFAULT_MINUTE 0
#define RTC_DEFAULT_SECOND 0
/* ============================================================
* 内部状态:系统墙钟
* ============================================================ */
@@ -27,6 +44,20 @@ static volatile uint32_t s_base_unix_secs = UINT32_MAX;
* 内部辅助函数Unix time ↔ sd2506_time_t 转换
* ============================================================ */
/* 计算星期Zeller 公式0=Sunday与下方 unix_to_sd2506 中算法一致 */
static uint8_t rtc_calc_week(uint16_t y, uint8_t m, uint8_t d)
{
uint32_t wy = y;
uint32_t wm = m;
if (wm <= 2) {
wy--;
wm += 12u;
}
return (uint8_t)(((uint32_t)(wy % 100u + wy / 100u / 4u - wy / 100u / 15u) +
(uint32_t)((26u * (wm + 1u)) / 10u) + (uint32_t)(d % 100u)) % 7u);
}
static void unix_to_sd2506(uint32_t unix_secs, sd2506_time_t *p_sd_time)
{
uint32_t y, m, d;
@@ -105,10 +136,43 @@ int sys_clock_init(void)
int64_t unix_secs = 0;
int i;
/* Step 1: 从 SD2506 RTC 读取初始时间 */
/* Step 1: 从 SD2506 RTC 读取初始时间
* 注意sd2506_get_time() 返回的 year 已是完整年份(如 2026驱动内 +2000
* 此处不得再加 2000否则年份虚增 → unix 秒数超 uint32 被截断回绕。 */
sd2506_get_time(&sd_time);
year = (uint32_t)sd_time.year + 2000uL;
/* RTC 校时(可选):时间无效时,或 FORCE=1 强制时,写入编译期默认时间 */
#if defined(RTC_DEFAULT_INIT_ENABLE)
{
int rtc_invalid = (sd_time.year < 2000 || sd_time.year > 2099 ||
sd_time.month < 1 || sd_time.month > 12 ||
sd_time.day < 1 || sd_time.day > 31);
#if (RTC_DEFAULT_INIT_FORCE == 1)
rtc_invalid = 1; /* 强制每次启动校时 */
#endif
if (rtc_invalid) {
sd2506_time_t init_t;
init_t.year = RTC_DEFAULT_YEAR;
init_t.month = RTC_DEFAULT_MONTH;
init_t.day = RTC_DEFAULT_DAY;
init_t.hour = RTC_DEFAULT_HOUR;
init_t.minute = RTC_DEFAULT_MINUTE;
init_t.second = RTC_DEFAULT_SECOND;
init_t.week = rtc_calc_week(init_t.year, init_t.month, init_t.day);
if (sd2506_set_time(&init_t) == SD2506_OK) {
DBG_INFO("sys_clock_init: RTC set %04d-%02d-%02d %02d:%02d:%02d",
init_t.year, init_t.month, init_t.day,
init_t.hour, init_t.minute, init_t.second);
sd2506_get_time(&sd_time); /* 重新读取校准后的时间 */
} else {
DBG_ERROR("sys_clock_init: RTC default write FAIL");
}
}
}
#endif
year = (uint32_t)sd_time.year;
month = (uint32_t)sd_time.month;
day = (uint32_t)sd_time.day;
hour = (uint32_t)sd_time.hour;