# STM32CubeMX Sensor Configuration

This page documents the current STM32CubeMX configuration for the Sensor Board firmware and explains how to extend it for sensor interfaces (UART/I2C/SPI/ADC) in a way that is safe for code generation.

- **IOC File**<span style="white-space: pre-wrap;">: </span>`<span class="editor-theme-code">components/sensor_board/firmware/firmware.ioc</span>`
- **Generated HAL Init Files**<span style="white-space: pre-wrap;">: </span>`<span class="editor-theme-code">components/sensor_board/firmware/Core/Src/</span>`
- **Application Entry**<span style="white-space: pre-wrap;">: </span>`<span class="editor-theme-code">src/sensor_board/main.c</span>`

## Current CubeMX Snapshot

<table id="bkmrk-itemvaluemcustm32h75"><colgroup><col></col><col></col></colgroup><tbody><tr><th>Item

</th><th>Value

</th></tr><tr><td>MCU

</td><td>STM32H753ZIT6 (NUCLEO-H753ZI)

</td></tr><tr><td>CubeMX Version

</td><td>6.15.0

</td></tr><tr><td>STM32Cube FW Package

</td><td>STM32Cube FW\_H7 v1.12.1

</td></tr><tr><td>Toolchain

</td><td>Makefile + GCC

</td></tr><tr><td>Post-generation Script

</td><td>`<span class="editor-theme-code">../../../scripts/post_code_generation.bash</span>`

</td></tr></tbody></table>

### Enabled CubeMX Components

- **CORTEX\_M7**<span style="white-space: pre-wrap;"> (I-Cache/D-Cache enabled, MPU configured)</span>
- **ETH**<span style="white-space: pre-wrap;"> (RMII mode)</span>
- **LWIP**<span style="white-space: pre-wrap;"> (Static IP, DHCP disabled)</span>
- **FREERTOS**<span style="white-space: pre-wrap;"> (CMSIS-RTOS v2, default task generated)</span>
- **TIM1**<span style="white-space: pre-wrap;"> (base timer)</span>
- **SYS/NVIC/RCC**<span style="white-space: pre-wrap;"> base platform configuration</span>

## Clock and Core Setup

### Clock Configuration (from IOC)

<table id="bkmrk-parametervalueclock-"><colgroup><col></col><col></col></colgroup><tbody><tr><th>Parameter

</th><th>Value

</th></tr><tr><td>Clock Source

</td><td>HSE 8 MHz -&gt; PLL

</td></tr><tr><td>SYSCLK

</td><td>72 MHz

</td></tr><tr><td>APB1

</td><td>36 MHz (DIV2)

</td></tr><tr><td>APB2/APB3/APB4

</td><td>72 MHz

</td></tr><tr><td>TIM1 Clock

</td><td>72 MHz

</td></tr></tbody></table>

### Cortex-M7 / MPU

- Instruction cache: enabled
- Data cache: enabled
- <span style="white-space: pre-wrap;">MPU region at </span>`<span class="editor-theme-code">0x30000000</span>`<span style="white-space: pre-wrap;">, size </span>`<span class="editor-theme-code">32KB</span>`, shareable, non-cacheable

## Pinout and Peripheral Mapping

### Ethernet (RMII)

<table id="bkmrk-signalpineth_ref_clk"><colgroup><col></col><col></col></colgroup><tbody><tr><th>Signal

</th><th>Pin

</th></tr><tr><td>ETH\_REF\_CLK

</td><td>PA1

</td></tr><tr><td>ETH\_MDIO

</td><td>PA2

</td></tr><tr><td>ETH\_CRS\_DV

</td><td>PA7

</td></tr><tr><td>ETH\_MDC

</td><td>PC1

</td></tr><tr><td>ETH\_RXD0

</td><td>PC4

</td></tr><tr><td>ETH\_RXD1

</td><td>PC5

</td></tr><tr><td>ETH\_TX\_EN

</td><td>PG11

</td></tr><tr><td>ETH\_TXD0

</td><td>PG13

</td></tr><tr><td>ETH\_TXD1

</td><td>PB13

</td></tr></tbody></table>

### Serial / COM

<table id="bkmrk-signalpinnoteusart1_"><colgroup><col></col><col></col><col></col></colgroup><tbody><tr><th>Signal

</th><th>Pin

</th><th>Note

</th></tr><tr><td>USART1\_TX

</td><td>PA9

</td><td><span style="white-space: pre-wrap;">Configured in generated </span>

`<span class="editor-theme-code">MX_GPIO_Init()</span>`

</td></tr><tr><td>USART1\_RX

</td><td>PA10

</td><td><span style="white-space: pre-wrap;">Configured in generated </span>

`<span class="editor-theme-code">MX_GPIO_Init()</span>`

</td></tr><tr><td>USART3\_TX

</td><td>PD8

</td><td>Used by NUCLEO COM path (

`<span class="editor-theme-code">MX_USART3_Init</span>`

<span style="white-space: pre-wrap;"> in app init)</span>

</td></tr><tr><td>USART3\_RX

</td><td>PD9

</td><td>Used by NUCLEO COM path (

`<span class="editor-theme-code">MX_USART3_Init</span>`

<span style="white-space: pre-wrap;"> in app init)</span>

</td></tr></tbody></table>

### Board IO / Misc

<table id="bkmrk-pinmodetypical-usepc"><colgroup><col></col><col></col><col></col></colgroup><tbody><tr><th>Pin

</th><th>Mode

</th><th>Typical Use

</th></tr><tr><td>PC13

</td><td>GPIO Input

</td><td>User button

</td></tr><tr><td>PB0

</td><td>GPIO Output

</td><td>Board output line

</td></tr><tr><td>PB7

</td><td>GPIO Output

</td><td>Board output line

</td></tr><tr><td>PB14

</td><td>GPIO Output

</td><td>Board output line

</td></tr><tr><td>PH0 / PH1

</td><td>HSE oscillator

</td><td>System clock source

</td></tr><tr><td>PC14 / PC15

</td><td>LSE oscillator

</td><td>Low-speed oscillator

</td></tr></tbody></table>

## Timer, RTOS, and Interrupts

### TIM1 Base Timer

```c
htim1.Init.Prescaler = 6400 - 1;
htim1.Init.Period = 10000;
```

With a 72 MHz timer clock, this gives an update period near 0.89 s.

### Interrupt Priorities (Key Entries)

<table id="bkmrk-irqprioritynoteseth_"><colgroup><col></col><col></col><col></col></colgroup><tbody><tr><th>IRQ

</th><th>Priority

</th><th>Notes

</th></tr><tr><td>ETH\_IRQn

</td><td>15

</td><td>Ethernet/LwIP path

</td></tr><tr><td>TIM1\_UP\_IRQn

</td><td>12

</td><td>TIM1 update interrupt

</td></tr><tr><td>TIM2\_IRQn

</td><td>7

</td><td>HAL tick time base

</td></tr><tr><td>EXTI15\_10\_IRQn

</td><td>6

</td><td>External interrupt group

</td></tr></tbody></table>

## Sensor Interface Status

### What Is Already Configured in CubeMX

- Networking stack and RMII pinout
- Base timer and RTOS scaffolding
- Basic UART-capable pins and NUCLEO COM integration path

### What Is Not Yet Fully Modeled in CubeMX (TO-DO ONCE sensors retrieved and assembled)

- Dedicated ADC channels for analog sensors (pH, load cell, pressure)
- Dedicated I2C/SPI buses for IMU and pressure variants
- Explicit sensor-specific pin labels and alternate-function assignments

**Important:**<span style="white-space: pre-wrap;"> Current sensor drivers include placeholders for hardware access in multiple modules. When bringing up physical sensors, add the corresponding CubeMX peripherals first, then update the sensor drivers to use generated handles.</span>

### Recommended Workflow

1. <span style="white-space: pre-wrap;">Open </span>`<span class="editor-theme-code">components/sensor_board/firmware/firmware.ioc</span>`<span style="white-space: pre-wrap;"> in STM32CubeMX.</span>
2. Add required peripherals for the target sensor like this:

```
GPS        -> USARTx (baud/parity/stop bits to match module)
IMU        -> I2Cx or SPIx (+ optional DRDY INT GPIO)
pH         -> ADCx channel (sampling time, resolution)
Load Cell  -> ADCx channel(s) or external ADC interface
Pressure   -> ADCx or I2Cx/SPIx (depends on sensor part)
```

1. Assign and lock pins in Pinout view; avoid overlap with RMII and COM pins.
2. Configure clocks for new peripherals in Clock Configuration.
3. Set NVIC priorities for new ISR sources so Ethernet/RTOS timing remains stable.
4. <span style="white-space: pre-wrap;">Generate code with </span>**Keep User Code**<span style="white-space: pre-wrap;"> enabled.</span>
5. Rebuild using PlatformIO and validate startup + sensor polling.

### Conflict To Look Out for Before Saving .ioc file

- No conflict with ETH RMII pins (PA1, PA2, PA7, PC1, PC4, PC5, PG11, PG13, PB13)
- No conflict with debug/COM path (PA9/PA10 and PD8/PD9)
- No conflict with oscillator pins (PH0, PH1, PC14, PC15)

### Related Pages

- [Configuration](https://bookstack.roboteamtwente.nl/books/pcb-box/page/configuration "Configuration")<span style="white-space: pre-wrap;"></span>
- [Reference](https://bookstack.roboteamtwente.nl/books/pcb-box/page/reference "Reference")
- [Sensor Basics Utility Library](https://bookstack.roboteamtwente.nl/books/pcb-box/page/sensor-basics-utility-library "Sensor Basics Utility Library")