# STM32F4-Base > **编译验证:所有代码修改后必须执行 `@build` 验证编译通过(0 错误 0 警告),否则不要提交。** ## 构建 - **仅支持 Keil MDK-ARM v5 (ARMCC)**,无其他工具链 - 命令行编译:`@build`(自动执行 `MDK-ARM/build.bat`) - 退出码:0 = 成功 | 1 = 有警告(不通过)| 2+ = 错误,查看 `MDK-ARM/build_log.txt` ## 硬件 | 外设 | 接口 | 引脚 | |------|------|------| | CH395F 以太网 | SPI2 | PB12 CS, PB13 SCK, PB14 SDO, PB15 SDI | | GD5F2GQ5UE NAND | SPI1 | PE0 CS, PB3 SCK, PB4 MISO, PB5 MOSI, PB8 WP, PE1 HOLD | | TPAFE5160 ADC | 并行16位 | PG0-PG15 数据, PD3 RD, PD4 CONVST, PD7 BUSY | | USART1 | 串口 | PA9 TX, PA10 RX (115200bps) | | 6x LED | GPIO | PC4, PC5, PB1, PB2, PF11, PF12(低电平点亮) | MCU: STM32F407ZGTx @ 168MHz (HSE 25MHz → PLL 4/168/2) ## 架构 ``` Src/main.c → 外设初始化 → app_main_init → gd5f2gq5ue_init → tpafe5160_init → osKernelInitialize → MX_FREERTOS_Init → osKernelStart → [FreeRTOS tasks: defaultTask, netTask, ftpTask] ``` - **defaultTask**:FTL + FatFS 初始化测试(开机一次性) - **netTask**:`net_init()` → `net_poll()` + `net_process_messages()` 每 10ms - **ftpTask**:`lftpd_start("/", 21, &ftp)` 延迟 7s 后启动 ### 任务栈 | Task | 栈大小 | |---|---| | defaultTask | 2048 | | netTask | 4096 | | ftpTask | 4096 | ## CH395F 设计原则 - **单连接 socket**:Socket 0 复用监听和数据通道,收到 CONNECT 后切换为数据通道,DISCONNECT/TIMEOUT 后重新 OPEN → LISTEN - **中断统一处理**:所有 CH395F 中断在 `net_poll()` 中通过 `GET_GLOB_INT_STATUS` 集中读取并清除,不得在 ISR 或其他地方单独处理 ## NET 网络层 - `net_socket.h/c` — BSD Socket API,多连接模式下 Socket 0 监听、Socket 1~7 数据 - `net_select.h/c` — select/poll I/O 多路复用 - 线程安全通过消息队列(`netMsgQueue`)实现,所有 CH395F 操作在 netTask 中串行处理 - 网络初始化顺序(多连接):`ch395f_set_fun_para(0x02)` → `ch395f_init()` → 配置 Socket 1~7(缓冲区+端口+协议,不 OPEN)→ 配置 Socket 0(TCP LISTEN) - **新文件需手动添加到 Keil MDK 工程**才能编译 ## 关键文件 | 路径 | 说明 | |---|---| | `Src/main.c` | 入口,CubeMX 生成 + USER CODE 区域 | | `Src/freertos.c` | FreeRTOS task 创建,CubeMX 生成 + USER CODE 区域 | | `App/task/net_task.c` | netTask 主循环(网络初始化 + 轮询) | | `Drivers/BSP/NET/` | BSD Socket API 网络抽象层 | | `Drivers/BSP/CH395F/` | CH395F SPI 驱动 | | `Drivers/BSP/GD5F2GQ5UE/` | NAND Flash 驱动 + dhara FTL + FatFS diskio | | `Drivers/BSP/TPAFE5160/` | ADC 并行接口驱动 | | `Drivers/BSP/SD2506/` | RTC 驱动 | | `Drivers/BSP/RS485/` | RS-485 通信(UART5 + PD0 DE) | ## 驱动关键点 详见 `docs/` 目录: - `CH395F_Trap_Records.md` — CH395F 已知陷阱 - `GD5F2GQ5UE_Trap_Records.md` — GD5F2GQ5UE 已知陷阱 - `CH395F_Test_Guide.md` — 网络测试说明 ## 注意 - `Inc/` 和 `Src/` 中 CubeMX 生成的文件带有 `USER CODE BEGIN`/`END` 标记,自定义代码写在这些区域之间 - `Drivers/BSP/` 下的驱动文件为纯手工代码,不受 CubeMX 保护 - CH395F 每次 SPI 事务需用 `ch395f_spi_begin()` / `ch395f_spi_end()` 包裹 - FreeRTOS V10.3.1 via CMSIS-RTOS V2,HAL 时基用 TIM7(非 SysTick) - NVIC 优先级分组 4 位,外设中断优先级 ≥ 5(`configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY`)