CH395F 硬件测试完毕
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -25,6 +25,43 @@
|
||||
/* 网络初始化完成标志(供 ch395f_test_task 等外部任务等待) */
|
||||
volatile uint8_t g_net_ready = 0;
|
||||
|
||||
/*
|
||||
* 函数功能:CH395F 协议栈一次性初始化(两种构建模式共用)
|
||||
* 入口参数:无
|
||||
* 返 回 值:0 - 成功,-1 - 失败
|
||||
* 函数说明:net_init → MAC 打印 → PHY 强制 100M 全双工 → 置 g_net_ready。
|
||||
* NET 层模式由 netTask 调用;硬件层模式(阶段 1~5)netTask 不创建,
|
||||
* 由 ch395fTestTask 调用后独占 CH395F。
|
||||
*/
|
||||
int net_stack_bring_up(void)
|
||||
{
|
||||
DBG_INFO("=== Network Init ===");
|
||||
|
||||
if (net_init("192.168.1.100", "255.255.255.0", "192.168.1.1") != 0) {
|
||||
DBG_ERROR("net init: FAIL");
|
||||
return -1;
|
||||
}
|
||||
DBG_INFO("net init: OK");
|
||||
|
||||
uint8_t mac[6];
|
||||
ch395f_get_mac_addr(mac);
|
||||
DBG_INFO("MAC: %02X:%02X:%02X:%02X:%02X:%02X",
|
||||
mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
|
||||
|
||||
ch395f_set_phy(CH395F_PHY_100M_FULL);
|
||||
HAL_Delay(3000);
|
||||
uint8_t phy = ch395f_get_phy_status();
|
||||
DBG_INFO("PHY: %s",
|
||||
(phy == CH395F_PHY_100M_FULL) ? "100M FULL" :
|
||||
(phy == CH395F_PHY_100M_HALF) ? "100M HALF" :
|
||||
(phy == CH395F_PHY_10M_FULL) ? "10M FULL" :
|
||||
(phy == CH395F_PHY_10M_HALF) ? "10M HALF" :
|
||||
(phy == CH395F_PHY_DISCONN) ? "DISCONNECT" : "UNKNOWN");
|
||||
|
||||
g_net_ready = 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* 函数功能:网络任务初始化
|
||||
* 入口参数:无
|
||||
@@ -42,8 +79,10 @@ int net_task_init(void)
|
||||
* 函数功能:网络任务主函数
|
||||
* 入口参数:arg - FreeRTOS 传入参数(未使用)
|
||||
* 返 回 值:无
|
||||
* 函数说明:启动后先调用 net_init 初始化 CH395F 协议栈,创建 TCP 监听,
|
||||
* 再进入轮询循环处理网络事件
|
||||
* 函数说明:启动后先调用 net_stack_bring_up() 初始化 CH395F 协议栈,
|
||||
* 再进入轮询循环处理网络事件。
|
||||
* 仅 NET 层测试模式(阶段 6~10)会创建本任务;
|
||||
* 硬件层模式下 netTask 不创建,CH395F 由 ch395fTestTask 独占。
|
||||
*/
|
||||
void net_task_func(void const *arg)
|
||||
{
|
||||
@@ -51,29 +90,10 @@ void net_task_func(void const *arg)
|
||||
|
||||
osDelay(2000);
|
||||
|
||||
/* ==================== CH395F 协议栈初始化 ==================== */
|
||||
DBG_INFO("=== Network Init ===");
|
||||
|
||||
if (net_init("192.168.1.100", "255.255.255.0", "192.168.1.1") == 0) {
|
||||
DBG_INFO("net init: OK");
|
||||
|
||||
uint8_t mac[6];
|
||||
ch395f_get_mac_addr(mac);
|
||||
DBG_INFO("MAC: %02X:%02X:%02X:%02X:%02X:%02X",
|
||||
mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
|
||||
|
||||
ch395f_set_phy(CH395F_PHY_100M_FULL);
|
||||
HAL_Delay(3000);
|
||||
uint8_t phy = ch395f_get_phy_status();
|
||||
DBG_INFO("PHY: %s",
|
||||
(phy == CH395F_PHY_100M_FULL) ? "100M FULL" :
|
||||
(phy == CH395F_PHY_100M_HALF) ? "100M HALF" :
|
||||
(phy == CH395F_PHY_10M_FULL) ? "10M FULL" :
|
||||
(phy == CH395F_PHY_10M_HALF) ? "10M HALF" :
|
||||
(phy == CH395F_PHY_DISCONN) ? "DISCONNECT" : "UNKNOWN");
|
||||
g_net_ready = 1;
|
||||
} else {
|
||||
DBG_ERROR("net init: FAIL");
|
||||
if (net_stack_bring_up() != 0) {
|
||||
for (;;) {
|
||||
osDelay(1000);
|
||||
}
|
||||
}
|
||||
|
||||
DBG_INFO("netTask: started (single-socket mode)");
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
/*
|
||||
* 模块名称:Network Application Task
|
||||
* 模块功能:网络协议栈轮询、TCP/UDP 业务处理
|
||||
* 模块功能:网络协议栈初始化、轮询、TCP/UDP 业务处理
|
||||
* 适用平台:STM32F407ZGTx + CH395F
|
||||
* 作者:王建锋
|
||||
* 创建日期:2026-07-19
|
||||
* 修改记录:
|
||||
* v1.0 2026-07-19 王建锋 创建初始版本
|
||||
* v1.1 2026-08-24 王建锋 提取 net_stack_bring_up() 供硬件层/NET 层两种测试模式共用
|
||||
*/
|
||||
|
||||
#ifndef __NET_TASK_H
|
||||
@@ -15,6 +16,11 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* CH395F 协议栈一次性初始化(net_init + MAC 打印 + PHY 配置 + g_net_ready 置位)。
|
||||
* 返回 0 成功 / -1 失败。NET 层模式由 netTask 调用;硬件层模式(阶段 1~5)
|
||||
* netTask 不创建,由 ch395fTestTask 调用后独占 CH395F。 */
|
||||
int net_stack_bring_up(void);
|
||||
|
||||
int net_task_init(void);
|
||||
void net_task_func(void const *arg);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user