Files
433_STM32/CLAUDE.md

4.5 KiB

CLAUDE.md

This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.

Project Overview

This is an STM32F103C8 firmware project for the E32-433TBH-SC 433MHz wireless transceiver module with OLED display and menu system. The project provides a user interface for configuring and testing the E32 wireless module.

Build System

This project uses Keil MDK-ARM (µVision) for building.

Build Commands:

  • Open MDK-ARM/project.uvprojx in Keil µVision
  • Build: F7 or Project → Build Target
  • Flash: F8 or Flash → Download

Target: STM32F103C8 (Cortex-M3, 64KB Flash, 20KB RAM)

Architecture

Hardware Abstraction Layer (Core/)

  • e32_hal.c/h - Hardware abstraction for the E32 wireless module

    • e32_hal_uart_tx() - UART transmission
    • e32_hal_aux_wait() - Wait for AUX pin (module busy indicator)
    • e32_hal_reset() - Reset the E32 module
    • e32_hal_work_mode() - Switch between transparent/WOR/config modes
  • e32_demo.c/h - E32 module driver and protocol implementation

    • Register structures for module configuration (address, channel, baud rate, power, FEC)
    • Functions for reading module name, firmware version, configuration
    • Transmission modes (transparent, specify target)
  • u8g2_hal.c/h - Hardware interface for OLED display via I2C

  • key.c - Button input handling (UP, DOWN, ENTER)

  • fifo.c - Ring buffer implementation for UART/USB data

  • systick.c - 1ms timer callbacks for timeouts and key scanning

Menu System (Middlewares/MultMenu/)

A custom hierarchical menu framework with animation support:

  • menu.c/h - Core menu framework

    • Menu_Init() - Initialize menu structure
    • Menu_Task() - Main menu loop (call from main while loop)
    • Page/Item/Menu structures for hierarchical navigation
  • menuConfig.h - Menu configuration and type definitions

    • Screen resolution: 128x64 (OLED)
    • Menu states: INIT, DRAWING, RUN, APP_RUN, etc.
    • Item types: PARENTS, LOOP_FUNCTION, ONCE_FUNCTION, SWITCH, DATA
  • application.c/h - Application-specific menu callbacks

    • Configuration items: work_mode, rate_mode, channel, tx_power, tx_count
    • Mode callbacks: tx_mode_callback, rx_mode_callback
    • Utility callbacks: version_callback, reset_callback, background_color_callback
  • AirPlane.c/h, DinoGame.c - Example games running on the menu system

Display Library (Middlewares/u8g2Lib/)

U8g2 graphics library for OLED display:

  • Configure display in u8g2_hal.c
  • Font: u8g2_font_profont12_mf (12px height, defined in menuConfig.h)

USB CDC (USB_DEVICE/)

Virtual serial port over USB for PC communication and AT commands.

Key Configuration

Pin Definitions (Core/Inc/main.h)

RESET  -> PA3  (E32 module reset)
M0     -> PA7  (Mode select 0)
M1     -> PB0  (Mode select 1)
AUX    -> PB1  (Busy indicator)
LED_TX -> PA15 (TX indicator)
LED_RX -> PB6  (RX indicator)
KEY_UP    -> PB4
KEY_DOWN  -> PB9
KEY_ENTER -> PB7

E32 Work Modes

  • Mode 0 (M0=0, M1=0): Transparent transmission
  • Mode 1 (M0=1, M1=0): WOR master (wake on radio)
  • Mode 2 (M0=0, M1=1): WOR slave (power saving)
  • Mode 3 (M0=1, M1=1): Configuration/sleep mode

E32 Register Structure

  • Register 01H-02H: Module address (high/low byte)
  • Register 03H: Air data rate, UART baud rate, parity
  • Register 04H: RF channel
  • Register 05H: TX power, FEC, WOR period, target mode

Adding New Menu Items

  1. Define the item variable in menu.c:

    xItem my_new_item;
    
  2. Add page if needed:

    xPage my_new_page;
    
  3. In Menu_Init(), add the item using AddItem():

    AddItem("Item Name", ITEM_TYPE, &data, &my_new_item, &Home_Page, NULL, my_callback);
    
  4. Implement the callback function in application.c:

    void my_callback(xpItem item) {
        // Handle item selection
    }
    

STM32CubeIDE Integration

The project was generated with STM32CubeMX (project.ioc). To modify peripherals:

  1. Open project.ioc in STM32CubeMX
  2. Configure peripherals
  3. Generate code
  4. Copy generated files to Core/ directory, preserving user code sections marked by /* USER CODE BEGIN */ and /* USER CODE END */

Important Notes

  • The main loop calls Menu_Task() to handle menu rendering and input
  • Key scanning happens via 1ms systick callback
  • Use usb_printf() for debug output via USB CDC
  • AUX pin must be HIGH before sending commands (use e32_hal_aux_wait())
  • E32 module reset takes ~30ms (V8.2 firmware) or ~1200ms (V8.1 firmware)