133 lines
4.5 KiB
Markdown
133 lines
4.5 KiB
Markdown
# 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`:
|
|
```c
|
|
xItem my_new_item;
|
|
```
|
|
|
|
2. Add page if needed:
|
|
```c
|
|
xPage my_new_page;
|
|
```
|
|
|
|
3. In `Menu_Init()`, add the item using `AddItem()`:
|
|
```c
|
|
AddItem("Item Name", ITEM_TYPE, &data, &my_new_item, &Home_Page, NULL, my_callback);
|
|
```
|
|
|
|
4. Implement the callback function in `application.c`:
|
|
```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)
|