Architecture
PAGE 7: System Architecture & Integration
System Architecture Overview
┌─────────────────────────────────────────────────────┐
│ Sensor Board (STM32H753ZI) │
│ 480 MHz ARM Cortex-M7 │
├─────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────┐ │
│ │ FreeRTOS Kernel │ │
│ │ (CMSIS-RTOS V2 compatible) │ │
│ │ 64KB heap | 8KB stack min │ │
│ └─────────────────────────────────────────────┘ │
│ ↓ │
│ ┌─────────────────────────────────────────────┐ │
│ │ Main Sensor Task │ │
│ │ - Poll all sensors │ │
│ │ - Validate measurements │ │
│ │ - Build diagnostics │ │
│ │ - Send via UDP/Ethernet │ │
│ └─────────────────────────────────────────────┘ │
│ ↓ ↓ │
│ ┌──────────┐ ┌──────────────┐ │
│ │ Sensors │ │ Packet │ │
│ │ │ │ Dispatcher │ │
│ │ ├─ GPS │ │ │ │
│ │ ├─ IMU │ │ (Incoming) │ │
│ │ ├─ pH │ └──────────────┘ │
│ │ ├─ Load │ │
│ │ └─ Pres │ │
│ └──────────┘ │
│ ↓ │
│ ┌─────────────────────────────────────────────┐ │
│ │ Protobuf Message Encoder │ │
│ │ (Nanopb library) │ │
│ └─────────────────────────────────────────────┘ │
│ ↓ │
│ ┌─────────────────────────────────────────────┐ │
│ │ UDP/Ethernet Stack (LwIP) │ │
│ │ - MAC filtering (3 addresses) │ │
│ │ - ARP management │ │
│ │ - Priority queues (2 levels) │ │
│ └─────────────────────────────────────────────┘ │
│ ↓ │
└─────────────────────────────────────────────────────┘
Network (192.168.0.x)
UDP Port 7 (broadcast)
Main Loop Operation
while (1) {
// STEP 1: System Health Check
├─ Check heap (critical: <8KB)
├─ Toggle status LEDs
└─ Send raw Ethernet beacon
// STEP 2: Initialize Diagnostics Message
└─ SensorBoardDiagnostics diagnostics_msg
// STEP 3: Poll All Sensors
├─ pH Sensor // Poll and validate
├─ GPS Sensor // Parse NMEA, validate
├─ IMU Sensor // Read 3-axis data
├─ Load Cells // Read and calibrate (×2)
└─ Pressure Sensors // Temperature compensate (×2)
// STEP 4: Encode & Transmit
├─ Encode diagnostics to Protobuf
├─ Prepare UDP packet
└─ Send broadcast (192.168.0.255:7)
// STEP 5: Wait for Next Cycle
└─ osDelay(5000 ms) // 5 seconds
}
Error Handling Strategy
Polling Error States
if (poll_result == RESULT_ERR_UNIMPLEMENTED) {
// Hardware not connected / not implemented
sensor.state = SENSOR_IDLE;
sensor.error_code = COMMUNICATION_FAILURE;
} else if (poll_result == RESULT_ERR_COMMS) {
// I2C/UART/SPI communication error
sensor.state = SENSOR_ERROR;
sensor.error_code = COMMUNICATION_FAILURE;
} else if (poll_result == RESULT_OK) {
// Data received, validate
if (validate_sensor_data(value) == RESULT_OK) {
sensor.state = SENSOR_OPERATING;
sensor.error_code = NO_ERROR;
} else {
// Out of range / invalid
sensor.state = SENSOR_ERROR;
sensor.error_code = INVALID_DATA;
}
}
Sensor Status Codes
Code | Meaning |
|---|---|
| Not connected or not implemented |
| Normal operation, valid data |
| Communication failure or invalid data |
Initialization Sequence
Phase 1: Hardware Setup
1. MPU/Cache configuration
2. HAL initialization
3. System clock → 480 MHz
4. RTOS kernel init
5. GPIO initialization
6. Timer initialization (TIM1)
Phase 2: Communication Setup
1. UART initialization (115200 baud)
2. Logging system init
3. Ethernet PHY init (LAN8742)
4. MAC address filtering (3 addresses)
5. ARP table population
Phase 3: Application Setup
1. Packet dispatcher registration
2. All 6 sensor initializations
3. UDP queue creation (priority buffers)
4. UDP callback registration
Phase 4: Main Loop
1. LED initialization
2. Sensor polling starts
3. Continuous 5-second cycles
Memory Layout
Heap (64 KB total)
├─ Sensor data structures (~2 KB)
├─ Protobuf buffers (~4 KB)
├─ UDP TX queues (~16 KB)
├─ FreeRTOS kernel structures (~8 KB)
└─ Remaining free (~34 KB)
Critical Threshold: 8 KB
└─ Trigger when < 8KB detected