From c191bcb76de5a65f482bde8f5e5eb35b8df221f6 Mon Sep 17 00:00:00 2001 From: Jorge Guzman Date: Wed, 5 Aug 2026 13:36:55 -0300 Subject: [PATCH] boards/arm/stm32l0/b-l072z-lrwan1: fix radio clock and add LoRa configurations The 32 MHz TCXO that clocks the SX1276 is powered from PA12 and was never driven, so the radio had no clock at all. The user button was copied from the Nucleo L073RZ and left on PC13, which carries DIO3 of the radio on this board; it is PB2. Adds lorawan_tx and lorawan_beacon, with the radio defaults of a public LoRaWAN network in the 915 MHz band, and fills in the board page. Assisted-by: Claude Code 4.8 Signed-off-by: Jorge Guzman --- .../boards/b-l072z-lrwan1/b-l072z-lrwan1.jpg | Bin 0 -> 35795 bytes .../stm32l0/boards/b-l072z-lrwan1/index.rst | 231 +++++++++++++++++- .../configs/lorawan_beacon/defconfig | 72 ++++++ .../configs/lorawan_tx/defconfig | 64 +++++ .../b-l072z-lrwan1/src/b-l072z-lrwan1.h | 20 +- .../stm32l0/b-l072z-lrwan1/src/stm32_sx127x.c | 7 + 6 files changed, 386 insertions(+), 8 deletions(-) create mode 100644 Documentation/platforms/arm/stm32l0/boards/b-l072z-lrwan1/b-l072z-lrwan1.jpg create mode 100644 boards/arm/stm32l0/b-l072z-lrwan1/configs/lorawan_beacon/defconfig create mode 100644 boards/arm/stm32l0/b-l072z-lrwan1/configs/lorawan_tx/defconfig diff --git a/Documentation/platforms/arm/stm32l0/boards/b-l072z-lrwan1/b-l072z-lrwan1.jpg b/Documentation/platforms/arm/stm32l0/boards/b-l072z-lrwan1/b-l072z-lrwan1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b76958a3dd1d3ff53c0bbffaffc1ebfc0719f788 GIT binary patch literal 35795 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 literal 0 HcmV?d00001 diff --git a/Documentation/platforms/arm/stm32l0/boards/b-l072z-lrwan1/index.rst b/Documentation/platforms/arm/stm32l0/boards/b-l072z-lrwan1/index.rst index 63da5013097..bb0b99d2170 100644 --- a/Documentation/platforms/arm/stm32l0/boards/b-l072z-lrwan1/index.rst +++ b/Documentation/platforms/arm/stm32l0/boards/b-l072z-lrwan1/index.rst @@ -6,4 +6,233 @@ ST B-L072Z-LRWAN1 .. tags:: chip:stm32, chip:stm32l0, chip:stm32l072 -The B-L072Z-LRWAN1 is a development board based on CMWX1ZZABZ-091 (STM32L072CZ and an SX1276 transceiver). +.. figure:: b-l072z-lrwan1.jpg + :align: center + +The B-L072Z-LRWAN1 is a LoRa and Sigfox discovery board built around the +Murata CMWX1ZZABZ-091 module, which packs an STM32L072CZ microcontroller and +a Semtech SX1276 sub-GHz transceiver into a single package. The board +carries an SMA connector with a whip antenna, an on-board ST-LINK/V2-1 and +Arduino Uno R3 compatible headers. + +Board information +================= + +The board features: + + - Murata CMWX1ZZABZ-091 module: STM32L072CZ (Cortex-M0+ up to 32 MHz, + 192 KiB flash, 20 KiB RAM) plus an SX1276 transceiver + - Programmable RF power, up to +14 dBm on the RFO path and +20 dBm on + PA_BOOST + - SMA and U.FL antenna connectors + - 32 MHz TCXO for the radio, powered from a GPIO + - On-board ST-LINK/V2-1 with mass storage programming and a virtual COM + port + - Arduino Uno R3 headers plus the ST morpho extension headers + - Four LEDs and one user button + - USB 2.0 full speed device connector + - Powered from USB, from an external supply or from a battery + +Board documentation: +https://www.st.com/en/evaluation-tools/b-l072z-lrwan1.html + +Clocking +======== + +NuttX runs the part from the internal 16 MHz RC oscillator through the PLL, +which gives a 32 MHz system clock. No external crystal is needed for the +microcontroller; the 32 MHz TCXO of the module belongs to the radio. + +Serial console +============== + +USART2 is wired to the virtual COM port of the on-board ST-LINK and is the +NuttX console in every configuration: + +=========== ===== +Signal Pin +=========== ===== +USART2_TX PA2 +USART2_RX PA3 +=========== ===== + +Settings are 115200 8N1. With the board plugged in, the port shows up as +``/dev/ttyACM0`` on Linux. + +LEDs +==== + +The board has four LEDs, all active high: + +===== ==== ======================== +LED Pin Colour +===== ==== ======================== +LED1 PA5 Green, also Arduino D13 +LED2 PB5 Green +LED3 PB6 Blue +LED4 PB7 Red +===== ==== ======================== + +If ``CONFIG_ARCH_LEDS`` is selected, LED1 is driven by the OS to show the +system state: + +========================== ========== +State LED1 +========================== ========== +Idle stack created ON +In an interrupt Flashing +Signal handler, assertion Flashing +The system has crashed Blinking +========================== ========== + +Otherwise the four LEDs are available to the application through +``/dev/userleds`` when ``CONFIG_USERLED`` is selected. + +Buttons +======= + +======== ==== =================================== +Button Pin Notes +======== ==== =================================== +B1 USER PB2 Pulled up, active low, EXTI capable +B2 RESET NRST Resets the microcontroller +======== ==== =================================== + +Radio +===== + +The SX1276 sits inside the module and is reached over SPI1. Besides the bus +and the interrupt lines, three GPIOs drive the antenna switch and one powers +the TCXO that clocks the radio: + +=============== ==== ============================================ +Signal Pin Notes +=============== ==== ============================================ +SPI1_NSS PA15 Chip select, driven as a GPIO +SPI1_SCK PB3 +SPI1_MISO PA6 +SPI1_MOSI PA7 +RESET PC0 Active low +DIO0 PB4 Transmit and receive done, EXTI capable +DIO1 PB1 +DIO2 PB0 +DIO3 PC13 +TCXO power PA12 Active high, needs about 5 ms to settle +RX enable PA1 Antenna switch towards RFI_HF +TX RFO enable PC2 Antenna switch towards RFO_HF, up to +14 dBm +TX BOOST enable PC1 Antenna switch towards PA_BOOST +=============== ==== ============================================ + +The board support code powers the TCXO before registering the driver and +picks the antenna switch position from the operating mode and the requested +power: the RFO path is used up to 14 dBm and PA_BOOST above that. This board +is wired for the high frequency band. + +The driver itself, its configuration options and what has to match between +two radios to make them hear each other are documented in :ref:`sx127x`. + +Other peripherals +================= + +========= ================================================ +Interface Pins +========= ================================================ +USART1 PA9 (TX), PA10 (RX), on the Arduino header +SPI2 PB12 (NSS), PB13 (SCK), PB14 (MISO), PB15 (MOSI) +I2C1 PB8 (SCL), PB9 (SDA) +ADC PA0, PA4 and the other Arduino analogue pins +========= ================================================ + +Flashing +======== + +The board can be programmed through its own ST-LINK or through an external +debug probe on the SWD header. + +With the ST-LINK, the simplest route is the mass storage device it exposes; +copying the raw binary to it programs the flash:: + + $ cp nuttx.bin /media//DIS_L072Z/ + +``openocd`` and ``st-flash`` work as well. + +With a SEGGER J-Link on the SWD pins, use a command script:: + + $ cat > flash.jlink << EOF + h + loadbin nuttx.bin, 0x08000000 + r + g + q + EOF + $ JLinkExe -device STM32L072CZ -if SWD -speed 4000 -autoconnect 1 \ + -nogui 1 -CommanderScript flash.jlink + +The virtual COM port of a stand-alone J-Link is not connected to USART2 of +this board, so the console still comes from the ST-LINK USB cable. + +Configurations +============== + +Each configuration is selected with:: + + $ ./tools/configure.sh b-l072z-lrwan1: + $ make + +nsh +--- + +The basic NuttShell configuration over USART2, with the ``hello`` example +built in. A good first check that the board boots. + +adc +--- + +NuttShell plus the ``adc`` example, reading the ADC with software triggered +conversions. + +nxlines_oled +------------ + +Runs the ``nxlines`` graphics example on an SSD1306 OLED display connected to +I2C1 (PB8 and PB9), in one bit per pixel mode. + +sx127x +------ + +NuttShell plus the ``sx127x`` example and the SX1276 driver registered at +``/dev/sx127x``. The example defaults to FSK at 930 MHz; everything can be +overridden from the command line:: + + nsh> sx127x -h + nsh> sx127x -m 0 -f 917200000 -t -p 14 -l 32 # transmit LoRa frames + nsh> sx127x -m 0 -f 917200000 -r # receive them + +lorawan_tx +---------- + +The same interactive setup, but with the radio defaults already matching a +public LoRaWAN network in the 915 MHz band: LoRa modulation, 917.2 MHz, +125 kHz bandwidth, spreading factor 7, CRC enabled and the 0x34 sync word. +Useful to feed a gateway under test:: + + nsh> sx127x -m 0 -f 917200000 -t -p 14 -l 32 -i 5 -d 60 + +lorawan_beacon +-------------- + +The same radio settings without a shell: the example itself is the entry +point and starts transmitting as soon as the board boots, which is what is +needed when the board is driven from a debug probe and no console is wired. +The command line of the example comes from ``CONFIG_INIT_ARGS``, and the +frequency, the payload size and the power from +``CONFIG_EXAMPLES_SX127X_RFFREQ``, ``_TXDATA`` and ``_TXPOWER``. + +Talking to another radio +======================== + +Two of these boards reach each other with the ``lorawan_tx`` configuration, +one receiving and the other transmitting, and the same commands work against +a LoRaWAN gateway. The recipes, and the settings that have to match on both +sides, are in :ref:`sx127x`. + diff --git a/boards/arm/stm32l0/b-l072z-lrwan1/configs/lorawan_beacon/defconfig b/boards/arm/stm32l0/b-l072z-lrwan1/configs/lorawan_beacon/defconfig new file mode 100644 index 00000000000..01c5b0231e2 --- /dev/null +++ b/boards/arm/stm32l0/b-l072z-lrwan1/configs/lorawan_beacon/defconfig @@ -0,0 +1,72 @@ +# +# This file is autogenerated: PLEASE DO NOT EDIT IT. +# +# You can use "make menuconfig" to make any modifications to the installed .config file. +# You can then do "make savedefconfig" to generate a new defconfig file that includes your +# modifications. +# +# CONFIG_NSH_ARGCAT is not set +CONFIG_ARCH="arm" +CONFIG_ARCH_BOARD="b-l072z-lrwan1" +CONFIG_ARCH_BOARD_B_L072Z_LRWAN1=y +CONFIG_ARCH_CHIP="stm32l0" +CONFIG_ARCH_CHIP_STM32=y +CONFIG_ARCH_CHIP_STM32L072CZ=y +CONFIG_ARCH_CHIP_STM32L072XX=y +CONFIG_ARCH_CHIP_STM32L0=y +CONFIG_ARCH_STACKDUMP=y +CONFIG_BOARD_LOOPSPERMSEC=2796 +CONFIG_BUILTIN=y +CONFIG_DEBUG_FEATURES=y +CONFIG_DEBUG_WIRELESS=y +CONFIG_DEBUG_WIRELESS_ERROR=y +CONFIG_DEBUG_WIRELESS_INFO=y +CONFIG_DEBUG_WIRELESS_WARN=y +CONFIG_DISABLE_ENVIRON=y +CONFIG_DISABLE_MOUNTPOINT=y +CONFIG_DISABLE_MQUEUE=y +CONFIG_DISABLE_POSIX_TIMERS=y +CONFIG_DISABLE_PSEUDOFS_OPERATIONS=y +CONFIG_DRIVERS_LPWAN=y +CONFIG_DRIVERS_WIRELESS=y +CONFIG_EXAMPLES_HELLO=y +CONFIG_EXAMPLES_SX127X=y +CONFIG_EXAMPLES_SX127X_RFFREQ=917200000 +CONFIG_EXAMPLES_SX127X_TXDATA=32 +CONFIG_EXAMPLES_SX127X_TXPOWER=17 +CONFIG_INIT_ARGS="\"-m\", \"0\", \"-t\", \"-d\", \"0\"" +CONFIG_INIT_ENTRYPOINT="sx127x_main" +CONFIG_INIT_STACKSIZE=1536 +CONFIG_INTELHEX_BINARY=y +CONFIG_LINE_MAX=64 +CONFIG_LPWAN_SX127X=y +CONFIG_LPWAN_SX127X_LORA_BW_DEFAULT=7 +CONFIG_LPWAN_SX127X_LORA_SYNCWORD=0x34 +CONFIG_LPWAN_SX127X_RFFREQ_DEFAULT=917200000 +CONFIG_LPWAN_SX127X_RXSUPPORT=y +CONFIG_LPWAN_SX127X_TXSUPPORT=y +CONFIG_NFILE_DESCRIPTORS_PER_BLOCK=6 +CONFIG_NSH_BUILTIN_APPS=y +CONFIG_NSH_FILEIOSIZE=64 +CONFIG_NSH_MAXARGUMENTS=12 +CONFIG_NSH_READLINE=y +CONFIG_NUNGET_CHARS=0 +CONFIG_POSIX_SPAWN_DEFAULT_STACKSIZE=1536 +CONFIG_PTHREAD_MUTEX_UNSAFE=y +CONFIG_PTHREAD_STACK_DEFAULT=1536 +CONFIG_RAM_SIZE=20480 +CONFIG_RAM_START=0x20000000 +CONFIG_RAW_BINARY=y +CONFIG_RR_INTERVAL=200 +CONFIG_SCHED_HPWORK=y +CONFIG_SCHED_WAITPID=y +CONFIG_START_DAY=19 +CONFIG_START_MONTH=5 +CONFIG_START_YEAR=2013 +CONFIG_STDIO_DISABLE_BUFFERING=y +CONFIG_STM32_PWR=y +CONFIG_STM32_SPI1=y +CONFIG_STM32_USART2=y +CONFIG_SYSTEM_NSH=y +CONFIG_TASK_NAME_SIZE=0 +CONFIG_USART2_SERIAL_CONSOLE=y diff --git a/boards/arm/stm32l0/b-l072z-lrwan1/configs/lorawan_tx/defconfig b/boards/arm/stm32l0/b-l072z-lrwan1/configs/lorawan_tx/defconfig new file mode 100644 index 00000000000..e6cedc1f76d --- /dev/null +++ b/boards/arm/stm32l0/b-l072z-lrwan1/configs/lorawan_tx/defconfig @@ -0,0 +1,64 @@ +# +# This file is autogenerated: PLEASE DO NOT EDIT IT. +# +# You can use "make menuconfig" to make any modifications to the installed .config file. +# You can then do "make savedefconfig" to generate a new defconfig file that includes your +# modifications. +# +# CONFIG_NSH_ARGCAT is not set +CONFIG_ARCH="arm" +CONFIG_ARCH_BOARD="b-l072z-lrwan1" +CONFIG_ARCH_BOARD_B_L072Z_LRWAN1=y +CONFIG_ARCH_CHIP="stm32l0" +CONFIG_ARCH_CHIP_STM32=y +CONFIG_ARCH_CHIP_STM32L072CZ=y +CONFIG_ARCH_CHIP_STM32L072XX=y +CONFIG_ARCH_CHIP_STM32L0=y +CONFIG_ARCH_STACKDUMP=y +CONFIG_BOARD_LOOPSPERMSEC=2796 +CONFIG_BUILTIN=y +CONFIG_DISABLE_ENVIRON=y +CONFIG_DISABLE_MOUNTPOINT=y +CONFIG_DISABLE_MQUEUE=y +CONFIG_DISABLE_POSIX_TIMERS=y +CONFIG_DISABLE_PSEUDOFS_OPERATIONS=y +CONFIG_DRIVERS_LPWAN=y +CONFIG_DRIVERS_WIRELESS=y +CONFIG_EXAMPLES_HELLO=y +CONFIG_EXAMPLES_SX127X=y +CONFIG_EXAMPLES_SX127X_RFFREQ=917200000 +CONFIG_INIT_ENTRYPOINT="nsh_main" +CONFIG_INIT_STACKSIZE=1536 +CONFIG_INTELHEX_BINARY=y +CONFIG_LINE_MAX=64 +CONFIG_LPWAN_SX127X=y +CONFIG_LPWAN_SX127X_LORA_BW_DEFAULT=7 +CONFIG_LPWAN_SX127X_LORA_SYNCWORD=0x34 +CONFIG_LPWAN_SX127X_RFFREQ_DEFAULT=917200000 +CONFIG_LPWAN_SX127X_RXSUPPORT=y +CONFIG_LPWAN_SX127X_TXSUPPORT=y +CONFIG_NFILE_DESCRIPTORS_PER_BLOCK=6 +CONFIG_NSH_BUILTIN_APPS=y +CONFIG_NSH_FILEIOSIZE=64 +CONFIG_NSH_MAXARGUMENTS=12 +CONFIG_NSH_READLINE=y +CONFIG_NUNGET_CHARS=0 +CONFIG_POSIX_SPAWN_DEFAULT_STACKSIZE=1536 +CONFIG_PTHREAD_MUTEX_UNSAFE=y +CONFIG_PTHREAD_STACK_DEFAULT=1536 +CONFIG_RAM_SIZE=20480 +CONFIG_RAM_START=0x20000000 +CONFIG_RAW_BINARY=y +CONFIG_RR_INTERVAL=200 +CONFIG_SCHED_HPWORK=y +CONFIG_SCHED_WAITPID=y +CONFIG_START_DAY=19 +CONFIG_START_MONTH=5 +CONFIG_START_YEAR=2013 +CONFIG_STDIO_DISABLE_BUFFERING=y +CONFIG_STM32_PWR=y +CONFIG_STM32_SPI1=y +CONFIG_STM32_USART2=y +CONFIG_SYSTEM_NSH=y +CONFIG_TASK_NAME_SIZE=0 +CONFIG_USART2_SERIAL_CONSOLE=y diff --git a/boards/arm/stm32l0/b-l072z-lrwan1/src/b-l072z-lrwan1.h b/boards/arm/stm32l0/b-l072z-lrwan1/src/b-l072z-lrwan1.h index dfbc614c322..3ee53c2c261 100644 --- a/boards/arm/stm32l0/b-l072z-lrwan1/src/b-l072z-lrwan1.h +++ b/boards/arm/stm32l0/b-l072z-lrwan1/src/b-l072z-lrwan1.h @@ -65,21 +65,20 @@ /* Button definitions *******************************************************/ -/* The Nucleo L073RZ supports two buttons; only one button is controllable - * by software: +/* The board has two buttons, only one of which is controllable by software: * - * B1 USER: user button connected to the I/O PC13 of the STM32L073RZT6. - * B2 RESET: push button connected to NRST is used to RESET the - * STM32L073RZT6. + * B1 USER: user button connected to PB2, pulled up, active low. + * B2 RESET: push button connected to NRST. * - * NOTE that EXTI interrupts are configured. + * NOTE that EXTI interrupts are configured. PC13 is not a button here: on + * this board it carries DIO3 of the radio. */ #define MIN_IRQBUTTON BUTTON_USER #define MAX_IRQBUTTON BUTTON_USER #define NUM_IRQBUTTONS 1 -#define GPIO_BTN_USER (GPIO_INPUT|GPIO_FLOAT|GPIO_EXTI|GPIO_PORTC|GPIO_PIN13) +#define GPIO_BTN_USER (GPIO_INPUT|GPIO_PULLUP|GPIO_EXTI|GPIO_PORTB|GPIO_PIN2) /* SX1276 * RESET - PC0 (active low) @@ -103,6 +102,13 @@ #define GPIO_SX127X_CRF2 (GPIO_SPEED_HIGH | GPIO_PORTC | GPIO_PIN2) #define GPIO_SX127X_CRF3 (GPIO_SPEED_HIGH | GPIO_PORTC | GPIO_PIN1) +/* The 32 MHz TCXO of the module is powered from PA12. The radio has no + * clock at all until this is driven high. + */ + +#define GPIO_SX127X_TCXO (GPIO_OUTPUT | GPIO_SPEED_HIGH | \ + GPIO_OUTPUT_SET | GPIO_PORTA | GPIO_PIN12) + /* Oled configuration */ #define OLED_I2C_PORT 1 diff --git a/boards/arm/stm32l0/b-l072z-lrwan1/src/stm32_sx127x.c b/boards/arm/stm32l0/b-l072z-lrwan1/src/stm32_sx127x.c index e6ffc468139..b2b1dce81da 100644 --- a/boards/arm/stm32l0/b-l072z-lrwan1/src/stm32_sx127x.c +++ b/boards/arm/stm32l0/b-l072z-lrwan1/src/stm32_sx127x.c @@ -32,6 +32,7 @@ #include #include +#include #include #include #include @@ -249,6 +250,12 @@ int stm32_lpwaninitialize(void) wlinfo("Register the sx127x module\n"); + /* Power the TCXO that clocks the radio, and give it time to settle */ + + stm32_configgpio(GPIO_SX127X_TCXO); + stm32_gpiowrite(GPIO_SX127X_TCXO, true); + up_mdelay(10); + /* Setup DIO0 */ stm32_configgpio(GPIO_SX127X_DIO0);