# seeed-studio/lorawan-e5-node architecture

> Architecture diagram of the GitHub repository seeed-studio/lorawan-e5-node, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-23). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/seeed-studio/lorawan-e5-node
- Repository: https://github.com/seeed-studio/lorawan-e5-node

## Overview

This repository is STM32WL firmware and board support for LoRa-E5 mini/Development Kit, with LoRaWAN end-node, FreeRTOS, AT-command, and low-power examples. The documented end-node workflow configures LoRaWAN identity and region, joins through a gateway/network server, and periodically sends uplinks; the tree also shows sensor, payload-encoding, serial-command, and radio layers. Source excerpts are partial, so links between unsampled application modules are omitted unless the README or excerpts support them.

Main entry points: [`Projects/Applications/LoRaWAN/LoRaWAN_End_Node/LoRaWAN/App/app_lorawan.c`](https://github.com/seeed-studio/lorawan-e5-node/blob/main/Projects/Applications/LoRaWAN/LoRaWAN_End_Node/LoRaWAN/App/app_lorawan.c) (LoRaWAN application), [`Projects/Applications/LoRaWAN/LoRaWAN_End_Node/Core/Src/main.c`](https://github.com/seeed-studio/lorawan-e5-node/blob/main/Projects/Applications/LoRaWAN/LoRaWAN_End_Node/Core/Src/main.c) (End-node loop), [`Projects/Applications/FreeRTOS/FreeRTOS_LoRaWAN_AT/LoRaWAN/App/lora_at.c`](https://github.com/seeed-studio/lorawan-e5-node/blob/main/Projects/Applications/FreeRTOS/FreeRTOS_LoRaWAN_AT/LoRaWAN/App/lora_at.c) (AT command app), [`Projects/Applications/FreeRTOS/FreeRTOS_LoRaWAN_AT/LoRaWAN/App/lora_command.c`](https://github.com/seeed-studio/lorawan-e5-node/blob/main/Projects/Applications/FreeRTOS/FreeRTOS_LoRaWAN_AT/LoRaWAN/App/lora_command.c) (LoRa commands)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_app["End-node applications"]
  node_main["End-node loop<br/>[main.c]"]
  node_lorawan_app["LoRaWAN application<br/>[app_lorawan.c]"]
  node_lora_app["LoRa app logic<br/>[lora_app.c]"]
  node_sensors["Sensor interface<br/>[sys_sensors.c]"]
  node_payload["Cayenne LPP<br/>[CayenneLpp.c]"]
  node_serial_at["AT command app<br/>[lora_at.c]"]
  node_serial_command["LoRa commands<br/>[lora_command.c]"]
  node_freertos_main["FreeRTOS LoRaWAN<br/>[main.c]"]
  node_at_main["FreeRTOS AT entry<br/>[main.c]"]
end

subgraph group_lorawan["LoRaWAN stack boundary"]
  node_identity["Device credentials<br/>[se-identity.h]"]
  node_region["Region settings<br/>[lora_app.h]"]
  node_lorawan_target["LoRaWAN target config<br/>[lorawan_conf.h]"]
end

subgraph group_board["Board and radio"]
  node_radio_if["Radio board adapter<br/>[radio_board_if.c]"]
  node_bsp_radio["BSP radio driver"]
end

subgraph group_platform["MCU platform"]
  node_subghz["Sub-GHz peripheral<br/>[subghz.c]"]
  node_hal["STM32 HAL<br/>[stm32wlxx_hal.c]"]
  node_adc["ADC acquisition<br/>[adc_if.c]"]
  node_uart["UART interface<br/>[usart_if.c]"]
  node_lowpower["Low-power support<br/>[stm32_lpm.c]"]
end

node_operator(("Firmware operator"))
node_gateway{{"LoRaWAN gateway"}}
node_network{{"Network server"}}

node_operator -->|"sets credentials"| node_identity
node_operator -->|"selects region"| node_region
node_main -->|"processes LoRaWAN"| node_lorawan_app
node_lorawan_app -->|"joins and uplinks"| node_gateway
node_gateway -->|"forwards packets"| node_network
node_network -->|"join response"| node_lorawan_app
node_lorawan_app -->|"uses keys"| node_identity
node_lorawan_app -->|"uses region"| node_region
node_lorawan_app -->|"uses configuration"| node_lorawan_target
node_radio_if -->|"calls radio driver"| node_bsp_radio
node_bsp_radio -->|"controls radio"| node_subghz
node_subghz -->|"uses HAL"| node_hal
node_sensors -->|"reads measurements"| node_adc
node_at_main -.->|"runs AT app"| node_serial_at
node_serial_at -.->|"dispatches commands"| node_serial_command
node_serial_command -.->|"uses serial interface"| node_uart
node_freertos_main -.->|"processes LoRaWAN"| node_lorawan_app
node_lowpower -.->|"supports sleep"| node_main

click node_main "https://github.com/seeed-studio/lorawan-e5-node/blob/main/Projects/Applications/LoRaWAN/LoRaWAN_End_Node/Core/Src/main.c"
click node_lorawan_app "https://github.com/seeed-studio/lorawan-e5-node/blob/main/Projects/Applications/LoRaWAN/LoRaWAN_End_Node/LoRaWAN/App/app_lorawan.c"
click node_lora_app "https://github.com/seeed-studio/lorawan-e5-node/blob/main/Projects/Applications/LoRaWAN/LoRaWAN_End_Node/LoRaWAN/App/lora_app.c"
click node_sensors "https://github.com/seeed-studio/lorawan-e5-node/blob/main/Projects/Applications/LoRaWAN/LoRaWAN_End_Node/Core/Src/sys_sensors.c"
click node_payload "https://github.com/seeed-studio/lorawan-e5-node/blob/main/Projects/Applications/LoRaWAN/LoRaWAN_End_Node/LoRaWAN/App/CayenneLpp.c"
click node_identity "https://github.com/seeed-studio/lorawan-e5-node/blob/main/Projects/Applications/LoRaWAN/LoRaWAN_End_Node/LoRaWAN/App/se-identity.h"
click node_region "https://github.com/seeed-studio/lorawan-e5-node/blob/main/Projects/Applications/LoRaWAN/LoRaWAN_End_Node/LoRaWAN/App/lora_app.h"
click node_lorawan_target "https://github.com/seeed-studio/lorawan-e5-node/blob/main/Projects/Applications/LoRaWAN/LoRaWAN_End_Node/LoRaWAN/Target/lorawan_conf.h"
click node_serial_at "https://github.com/seeed-studio/lorawan-e5-node/blob/main/Projects/Applications/FreeRTOS/FreeRTOS_LoRaWAN_AT/LoRaWAN/App/lora_at.c"
click node_serial_command "https://github.com/seeed-studio/lorawan-e5-node/blob/main/Projects/Applications/FreeRTOS/FreeRTOS_LoRaWAN_AT/LoRaWAN/App/lora_command.c"
click node_radio_if "https://github.com/seeed-studio/lorawan-e5-node/blob/main/Projects/Applications/LoRaWAN/LoRaWAN_End_Node/LoRaWAN/Target/radio_board_if.c"
click node_bsp_radio "https://github.com/seeed-studio/lorawan-e5-node/blob/main/Drivers/BSP/STM32WLxx_LoRa_E5_mini/stm32wlxx_LoRa_E5_mini_radio.c"
click node_subghz "https://github.com/seeed-studio/lorawan-e5-node/blob/main/Projects/Applications/LoRaWAN/LoRaWAN_End_Node/Core/Src/subghz.c"
click node_hal "https://github.com/seeed-studio/lorawan-e5-node/blob/main/Drivers/STM32WLxx_HAL_Driver/Src/stm32wlxx_hal.c"
click node_adc "https://github.com/seeed-studio/lorawan-e5-node/blob/main/Projects/Applications/LoRaWAN/LoRaWAN_End_Node/Core/Src/adc_if.c"
click node_uart "https://github.com/seeed-studio/lorawan-e5-node/blob/main/Projects/Applications/LoRaWAN/LoRaWAN_End_Node/Core/Src/usart_if.c"
click node_lowpower "https://github.com/seeed-studio/lorawan-e5-node/blob/main/Utilities/lpm/tiny_lpm/stm32_lpm.c"
click node_freertos_main "https://github.com/seeed-studio/lorawan-e5-node/blob/main/Projects/Applications/FreeRTOS/FreeRTOS_LoRaWAN/Core/Src/main.c"
click node_at_main "https://github.com/seeed-studio/lorawan-e5-node/blob/main/Projects/Applications/FreeRTOS/FreeRTOS_LoRaWAN_AT/Core/Src/main.c"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_main,node_lorawan_app,node_lora_app,node_sensors,node_payload,node_serial_at,node_serial_command,node_freertos_main,node_at_main toneBlue
class node_identity,node_region,node_lorawan_target toneAmber
class node_radio_if,node_bsp_radio,node_network toneMint
class node_subghz,node_hal,node_adc,node_uart,node_lowpower toneRose
class node_operator,node_gateway toneIndigo
```

## Components

### End-node applications

- [End-node loop](https://github.com/seeed-studio/lorawan-e5-node/blob/main/Projects/Applications/LoRaWAN/LoRaWAN_End_Node/Core/Src/main.c): `Projects/Applications/LoRaWAN/LoRaWAN_End_Node/Core/Src/main.c`
- [LoRaWAN application](https://github.com/seeed-studio/lorawan-e5-node/blob/main/Projects/Applications/LoRaWAN/LoRaWAN_End_Node/LoRaWAN/App/app_lorawan.c): `Projects/Applications/LoRaWAN/LoRaWAN_End_Node/LoRaWAN/App/app_lorawan.c`
- [LoRa app logic](https://github.com/seeed-studio/lorawan-e5-node/blob/main/Projects/Applications/LoRaWAN/LoRaWAN_End_Node/LoRaWAN/App/lora_app.c): `Projects/Applications/LoRaWAN/LoRaWAN_End_Node/LoRaWAN/App/lora_app.c`
- [Sensor interface](https://github.com/seeed-studio/lorawan-e5-node/blob/main/Projects/Applications/LoRaWAN/LoRaWAN_End_Node/Core/Src/sys_sensors.c): `Projects/Applications/LoRaWAN/LoRaWAN_End_Node/Core/Src/sys_sensors.c`
- [Cayenne LPP](https://github.com/seeed-studio/lorawan-e5-node/blob/main/Projects/Applications/LoRaWAN/LoRaWAN_End_Node/LoRaWAN/App/CayenneLpp.c): `Projects/Applications/LoRaWAN/LoRaWAN_End_Node/LoRaWAN/App/CayenneLpp.c`
- [AT command app](https://github.com/seeed-studio/lorawan-e5-node/blob/main/Projects/Applications/FreeRTOS/FreeRTOS_LoRaWAN_AT/LoRaWAN/App/lora_at.c): `Projects/Applications/FreeRTOS/FreeRTOS_LoRaWAN_AT/LoRaWAN/App/lora_at.c`
- [LoRa commands](https://github.com/seeed-studio/lorawan-e5-node/blob/main/Projects/Applications/FreeRTOS/FreeRTOS_LoRaWAN_AT/LoRaWAN/App/lora_command.c): `Projects/Applications/FreeRTOS/FreeRTOS_LoRaWAN_AT/LoRaWAN/App/lora_command.c`
- [FreeRTOS LoRaWAN](https://github.com/seeed-studio/lorawan-e5-node/blob/main/Projects/Applications/FreeRTOS/FreeRTOS_LoRaWAN/Core/Src/main.c): `Projects/Applications/FreeRTOS/FreeRTOS_LoRaWAN/Core/Src/main.c`
- [FreeRTOS AT entry](https://github.com/seeed-studio/lorawan-e5-node/blob/main/Projects/Applications/FreeRTOS/FreeRTOS_LoRaWAN_AT/Core/Src/main.c): `Projects/Applications/FreeRTOS/FreeRTOS_LoRaWAN_AT/Core/Src/main.c`

### LoRaWAN stack boundary

- [Device credentials](https://github.com/seeed-studio/lorawan-e5-node/blob/main/Projects/Applications/LoRaWAN/LoRaWAN_End_Node/LoRaWAN/App/se-identity.h): `Projects/Applications/LoRaWAN/LoRaWAN_End_Node/LoRaWAN/App/se-identity.h`
- [Region settings](https://github.com/seeed-studio/lorawan-e5-node/blob/main/Projects/Applications/LoRaWAN/LoRaWAN_End_Node/LoRaWAN/App/lora_app.h): `Projects/Applications/LoRaWAN/LoRaWAN_End_Node/LoRaWAN/App/lora_app.h`
- [LoRaWAN target config](https://github.com/seeed-studio/lorawan-e5-node/blob/main/Projects/Applications/LoRaWAN/LoRaWAN_End_Node/LoRaWAN/Target/lorawan_conf.h): `Projects/Applications/LoRaWAN/LoRaWAN_End_Node/LoRaWAN/Target/lorawan_conf.h`

### Board and radio

- [Radio board adapter](https://github.com/seeed-studio/lorawan-e5-node/blob/main/Projects/Applications/LoRaWAN/LoRaWAN_End_Node/LoRaWAN/Target/radio_board_if.c): `Projects/Applications/LoRaWAN/LoRaWAN_End_Node/LoRaWAN/Target/radio_board_if.c`
- [BSP radio driver](https://github.com/seeed-studio/lorawan-e5-node/blob/main/Drivers/BSP/STM32WLxx_LoRa_E5_mini/stm32wlxx_LoRa_E5_mini_radio.c): `Drivers/BSP/STM32WLxx_LoRa_E5_mini/stm32wlxx_LoRa_E5_mini_radio.c`

### MCU platform

- [Sub-GHz peripheral](https://github.com/seeed-studio/lorawan-e5-node/blob/main/Projects/Applications/LoRaWAN/LoRaWAN_End_Node/Core/Src/subghz.c): `Projects/Applications/LoRaWAN/LoRaWAN_End_Node/Core/Src/subghz.c`
- [STM32 HAL](https://github.com/seeed-studio/lorawan-e5-node/blob/main/Drivers/STM32WLxx_HAL_Driver/Src/stm32wlxx_hal.c): `Drivers/STM32WLxx_HAL_Driver/Src/stm32wlxx_hal.c`
- [ADC acquisition](https://github.com/seeed-studio/lorawan-e5-node/blob/main/Projects/Applications/LoRaWAN/LoRaWAN_End_Node/Core/Src/adc_if.c): `Projects/Applications/LoRaWAN/LoRaWAN_End_Node/Core/Src/adc_if.c`
- [UART interface](https://github.com/seeed-studio/lorawan-e5-node/blob/main/Projects/Applications/LoRaWAN/LoRaWAN_End_Node/Core/Src/usart_if.c): `Projects/Applications/LoRaWAN/LoRaWAN_End_Node/Core/Src/usart_if.c`
- [Low-power support](https://github.com/seeed-studio/lorawan-e5-node/blob/main/Utilities/lpm/tiny_lpm/stm32_lpm.c): `Utilities/lpm/tiny_lpm/stm32_lpm.c`

### Other components

- **Firmware operator**
- **LoRaWAN gateway**
- **Network server**

## Connections

- Firmware operator → Device credentials: sets credentials
- Firmware operator → Region settings: selects region
- End-node loop → LoRaWAN application: processes LoRaWAN
- LoRaWAN application → LoRaWAN gateway: joins and uplinks
- LoRaWAN gateway → Network server: forwards packets
- Network server → LoRaWAN application: join response
- LoRaWAN application → Device credentials: uses keys
- LoRaWAN application → Region settings: uses region
- LoRaWAN application → LoRaWAN target config: uses configuration
- Radio board adapter → BSP radio driver: calls radio driver
- BSP radio driver → Sub-GHz peripheral: controls radio
- Sub-GHz peripheral → STM32 HAL: uses HAL
- Sensor interface → ADC acquisition: reads measurements
- FreeRTOS AT entry → AT command app: runs AT app
- AT command app → LoRa commands: dispatches commands
- LoRa commands → UART interface: uses serial interface
- FreeRTOS LoRaWAN → LoRaWAN application: processes LoRaWAN
- Low-power support → End-node loop: supports sleep
