# STM32F4-Base ## 项目概述 STM32F407ZGTx (Cortex-M4 FPU) 基础固件项目,集成 CH395F 以太网控制器 SPI 驱动(CH395F 自带 MAC+PHY 及 TCP/IP 协议栈固件)。 ## 关键文件 | 路径 | 说明 | |---|---| | `Src/main.c` | 程序入口,初始化序列及主循环 | | `Src/ch395f.c` / `Inc/ch395f.h` | CH395F 以太网芯片 SPI 驱动(核心自定义代码) | | `MDK-ARM/STM32F407-Demo.uvprojx` | Keil MDK 项目文件 | | `STM32F407-Demo.ioc` | STM32CubeMX 项目源文件 | ## 构建 仅支持 Keil MDK-ARM v5 (ARMCC)。打开 `MDK-ARM/STM32F407-Demo.uvprojx` 编译。 - 编译器:ARMCC V5.06 update 7 - 优化等级:`-O4` (项目级),`spi.c`/`usart.c` / HAL 源文件使用 `-O0` - C 标准:C99 - 全局宏定义:`USE_HAL_DRIVER, STM32F407xx` ## 硬件配置 - **主频:** HSE 25MHz → PLL 168MHz (4/168/2) - **6 个 LED:** PC4, PC5, PB1, PB2, PF11, PF12(低电平点亮) - **CH395F:** SPI2 (PB12 CS, PB13 SCK, PB14 SDO, PB15 SDI) - **USART1:** PA9 TX, PA10 RX (115200bps) ## 启动顺序 ``` HAL_Init() → SystemClock_Config() → MX_GPIO_Init() → MX_USART1_UART_Init() → MX_SPI2_Init() → ch395f_reset() → ch395f_init() ``` ## 代码规范 参考 `嵌入式C语言代码规范(V1.0).md`,关键要点: - 缩进:4 空格,禁止 Tab - 命名:小写字母+下划线;全局变量 `g_` 前缀,静态 `s_`,指针 `p_`,数组 `a_` - 函数注释块需包含:函数功能、入口参数、返回值、限定条件、函数说明 - 大括号:K&R 风格(左大括号不换行) ## 注意 - `Inc/` 和 `Src/` 中 CubeMX 生成的文件(gpio, spi, usart, stm32f4xx_it, main 的骨架)带有 `USER CODE BEGIN`/`END` 标记,自定义代码应写在这些区域之间以免被 CubeMX 重新生成时覆盖 - `ch395f.c`/`ch395f.h` 为纯手工代码,不受 CubeMX 保护 - 每次 SPI 事务需调用 `ch395f_spi_begin()` / `ch395f_spi_end()` 包裹 - CH395F 命令执行时序参考 `ch395f.h` 中命令码注释及 `CH395F.md` ## 已知问题 ### CH395F 与 RTL8305NBI 自动协商不兼容 CH395F 与 RTL8305NBI-CG 直连(经网络变压器)时,自动协商始终失败(返回 `PHY_DISCONN`),但强制 100M 全双工工作正常。强制 10M 全双工同样失败。 **诊断结果:** - Auto-Neg: `0x01 (DISCONNECTED)` - Force 100M-FULL: `0x08 (LINK OK)` - Force 10M-FULL: `0x01 (DISCONNECTED)` **解决方案:** 初始化协议栈后调用 `ch395f_set_phy(CH395F_PHY_100M_FULL)` 跳过自动协商。 **推测根因:** 不同厂家 PHY 直连时的自动协商实现差异(CH395F WCH 固件 vs RTL8305NBI Realtek 硬件),物理层正常。