85 lines
3.6 KiB
Markdown
85 lines
3.6 KiB
Markdown
# 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 8MHz → PLL M=4/N=168/P=2,见 `*.ioc`/`stm32f4xx_hal_conf.h`)
|
||
|
||
## 架构
|
||
|
||
```
|
||
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()` 包裹
|
||
- CH395F SPI PCB设计问题,现在分频系数必须为 8,速度相对较低
|
||
- FreeRTOS V10.3.1 via CMSIS-RTOS V2,HAL 时基用 TIM7(非 SysTick)
|
||
- NVIC 优先级分组 4 位,外设中断优先级 ≥ 5(`configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY`)
|