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.uvprojxin 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 transmissione32_hal_aux_wait()- Wait for AUX pin (module busy indicator)e32_hal_reset()- Reset the E32 modulee32_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 structureMenu_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
-
Define the item variable in
menu.c:xItem my_new_item; -
Add page if needed:
xPage my_new_page; -
In
Menu_Init(), add the item usingAddItem():AddItem("Item Name", ITEM_TYPE, &data, &my_new_item, &Home_Page, NULL, my_callback); -
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:
- Open
project.iocin STM32CubeMX - Configure peripherals
- Generate code
- 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)