Skip to content

feat(stm32): UART, GPIO, clock, timer, and peripheral BSP drivers#414

Draft
nhuvaoanh123 wants to merge 3 commits into
eclipse-openbsw:mainfrom
nhuvaoanh123:stm32-pr-2
Draft

feat(stm32): UART, GPIO, clock, timer, and peripheral BSP drivers#414
nhuvaoanh123 wants to merge 3 commits into
eclipse-openbsw:mainfrom
nhuvaoanh123:stm32-pr-2

Conversation

@nhuvaoanh123
Copy link
Copy Markdown

Purpose of this PR

  • Bugfix
  • New Feature
  • Documentation Update
  • Other

Description

Second PR in the STM32 platform series. Adds the complete low-level BSP layer enabling UART console output, GPIO control, clock initialization, and peripheral support.

Modules added

Module Purpose
bspClock Clock tree init — HSE→PLL for F4 (100 MHz) and G4 (170 MHz)
bspUart USART2 driver with ring buffer, used for VCP console
bspIo GPIO driver — pin mode, AF selection, push-pull/open-drain
bspTimer SysTick system timer for RTOS tick source
bspInterruptsImpl NVIC interrupt management (FreeRTOS + ThreadX variants)
bspAdc ADC peripheral driver
bspEepromDriver Flash-based EEPROM emulation
etlImpl ETL clock/print backends for STM32
bspConfiguration NUCLEO-G474RE board pin mappings

Milestone

CMake configures with all BSP modules included. First UART console output achieved when combined with PR 6 (FreeRTOS board config).

Depends on #413 (PR 1: MCU foundation). PR 2 of 10.

Related Issues

Part of the STM32 platform port series — see #413 for overview.

Breaking Changes

  • Yes
  • No

Test Plan

  1. Configure: CC=arm-none-eabi-gcc CXX=arm-none-eabi-g++ cmake --preset nucleo-g474re-freertos-gcc
  2. Verify all BSP modules are found and configured
  3. Unit tests for UART, Clock, GPIO, ADC, EEPROM come in later PRs

Regression Tests

Have tests been added/updated? [x] Yes — test source files included, runnable with PR 3+ [ ] No

nhuvaoanh123 added a commit to nhuvaoanh123/openbsw that referenced this pull request Mar 30, 2026
Add CAN peripheral drivers for both STM32 CAN controller variants:

- BxCanDevice: Basic Extended CAN controller (STM32F4 family)
- FdCanDevice: Flexible Data-rate CAN controller (STM32G4 family)
- BxCanTransceiver: OpenBSW CAN transceiver adapter for bxCAN
- Unit test infrastructure (unitTest CMakeLists, mock device headers)

The bspCan module uses compile-time chip selection (CAN_TYPE=BXCAN|FDCAN)
to build only the relevant driver. Tests use mock register headers for
host-based verification.

Milestone: `cmake --preset tests-stm32-debug` configures. Tests run in CI Docker.
Depends on eclipse-openbsw#414 (PR 2: BSP drivers). PR 3 of 10.
nhuvaoanh123 pushed a commit to nhuvaoanh123/openbsw that referenced this pull request Mar 30, 2026
Add CAN peripheral drivers for both STM32 CAN controller variants:

- BxCanDevice: Basic Extended CAN controller (STM32F4 family)
- FdCanDevice: Flexible Data-rate CAN controller (STM32G4 family)
- BxCanTransceiver: OpenBSW CAN transceiver adapter for bxCAN
- Unit test infrastructure (unitTest CMakeLists, mock device headers)

The bspCan module uses compile-time chip selection (CAN_TYPE=BXCAN|FDCAN)
to build only the relevant driver. Tests use mock register headers for
host-based verification.

Milestone: `cmake --preset tests-stm32-debug` configures. Tests run in CI Docker.
Depends on eclipse-openbsw#414 (PR 2: BSP drivers). PR 3 of 10.
…ker scripts

Add the STM32 platform skeleton for OpenBSW, supporting both STM32F4 (bxCAN)
and STM32G4 (FDCAN) families via chip selection cmake variables.

Contents:
- ARM CMSIS-Core headers (Cortex-M4) with Apache-2.0 license
- ST device headers for STM32F413ZH and STM32G474RE
- GNU AS startup files and linker scripts for both chips
- Chip-selection cmake modules (stm32f413zh.cmake, stm32g474re.cmake)
- CMakePresets for NUCLEO-G474RE and NUCLEO-F413ZH (FreeRTOS + ThreadX)
- Platform integration in root CMakeLists.txt

Milestone: `cmake --preset nucleo-g474re-freertos-gcc` configures successfully.
This is PR 1 of 10 — subsequent PRs add BSP drivers, RTOS config, and UDS services.
nhuvaoanh123 added a commit to nhuvaoanh123/openbsw that referenced this pull request Mar 30, 2026
Add CAN peripheral drivers for both STM32 CAN controller variants:

- BxCanDevice: Basic Extended CAN controller (STM32F4 family)
- FdCanDevice: Flexible Data-rate CAN controller (STM32G4 family)
- BxCanTransceiver: OpenBSW CAN transceiver adapter for bxCAN
- Unit test infrastructure (unitTest CMakeLists, mock device headers)

The bspCan module uses compile-time chip selection (CAN_TYPE=BXCAN|FDCAN)
to build only the relevant driver. Tests use mock register headers for
host-based verification.

Milestone: `cmake --preset tests-stm32-debug` configures. Tests run in CI Docker.
Depends on eclipse-openbsw#414 (PR 2: BSP drivers). PR 3 of 10.
nhuvaoanh123 added a commit to nhuvaoanh123/openbsw that referenced this pull request Mar 31, 2026
Add CAN peripheral drivers for both STM32 CAN controller variants:

- BxCanDevice: Basic Extended CAN controller (STM32F4 family)
- FdCanDevice: Flexible Data-rate CAN controller (STM32G4 family)
- BxCanTransceiver: OpenBSW CAN transceiver adapter for bxCAN
- Unit test infrastructure (unitTest CMakeLists, mock device headers)

The bspCan module uses compile-time chip selection (CAN_TYPE=BXCAN|FDCAN)
to build only the relevant driver. Tests use mock register headers for
host-based verification.

Milestone: `cmake --preset tests-stm32-debug` configures. Tests run in CI Docker.
Depends on eclipse-openbsw#414 (PR 2: BSP drivers). PR 3 of 10.
nhuvaoanh123 and others added 2 commits March 31, 2026 14:26
- Change .fpu softvfp → fpv4-sp-d16 in both startup files to match
  the toolchain's -mfloat-abi=hard -mfpu=fpv4-sp-d16 flags. The
  mismatch produced conflicting ELF float ABI attributes.

- Add FPU CP10/CP11 enable block to F413 startup (was only in G474).
  Both are Cortex-M4F; ThreadX needs early FPU access since it does
  not enable the FPU in its port (unlike FreeRTOS port.c).

- Add OPENBSW_PLATFORM=stm32 branch to root CMakeLists.txt so the
  tests-stm32-debug preset no longer hits FATAL_ERROR at configure.
  Add platforms/stm32/unitTest/ stub (mirrors s32k1xx pattern).

- Add ST BSD-3-Clause LICENSE file under 3rdparty/st/ for vendor
  header compliance — the headers reference a LICENSE file that was
  missing.

- Remove dead bspMcu/linker/ scripts and STM32_LINKER_SCRIPT cmake
  variables. The real linker scripts live in each board's
  referenceApp/platforms/*/main/linkerscript/application.ld, wired
  via PROP_LINKER_SCRIPT on the startUp INTERFACE library.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add the complete low-level BSP layer for STM32F4/G4 platforms:

- bspClock: Clock configuration for F4 (100 MHz HSE) and G4 (170 MHz PLL)
- bspUart: USART2 driver with DMA-ready ring buffer, VCP console output
- bspIo: GPIO driver with pin configuration (AF, push-pull, speed)
- bspTimer: SysTick-based system timer for RTOS tick and delays
- bspInterruptsImpl: NVIC interrupt enable/disable (FreeRTOS + ThreadX variants)
- bspAdc: ADC driver for analog inputs
- bspEepromDriver: Flash-based EEPROM emulation
- etlImpl: ETL clock and print backends for STM32
- bspConfiguration: NUCLEO-G474RE board pin mappings (UART, LED, etc.)

Milestone: cmake configures with all BSP modules. Boots to UART console with PR 6 (RTOS).
Depends on PR 1 (MCU foundation). PR 2 of 10.
nhuvaoanh123 added a commit to nhuvaoanh123/openbsw that referenced this pull request Mar 31, 2026
Add CAN peripheral drivers for both STM32 CAN controller variants:

- BxCanDevice: Basic Extended CAN controller (STM32F4 family)
- FdCanDevice: Flexible Data-rate CAN controller (STM32G4 family)
- BxCanTransceiver: OpenBSW CAN transceiver adapter for bxCAN
- Unit test infrastructure (unitTest CMakeLists, mock device headers)

The bspCan module uses compile-time chip selection (CAN_TYPE=BXCAN|FDCAN)
to build only the relevant driver. Tests use mock register headers for
host-based verification.

Milestone: `cmake --preset tests-stm32-debug` configures. Tests run in CI Docker.
Depends on eclipse-openbsw#414 (PR 2: BSP drivers). PR 3 of 10.
@nhuvaoanh123 nhuvaoanh123 marked this pull request as draft May 1, 2026 19:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant