// RH_STM32WLx.h // // Definitions for the ST Microelectronics STM32WLE5JC chip which contains // a SX1261/1262 LoRa capable radio. // https://wiki.seeedstudio.com/LoRa_E5_mini/ // https://www.rfsolutions.co.uk/downloads/1537522406DS_SX1261-2_V1.1_SEMTECH.pdf // https://cdn.sparkfun.com/assets/6/b/5/1/4/SX1262_datasheet.pdf // https://files.seeedstudio.com/products/317990687/res/LoRa-E5+module+datasheet_V1.0.pdf // https://forum.seeedstudio.com/t/lora-e5-register-settings-for-oscillators/262635 // file:///home/mikem/Downloads/es0506-stm32wle5xx-stm32wle4xx-device-errata-stmicroelectronics.pdf // Author: Mike McCauley (mikem@airspayce.com) // Copyright (C) 2023 Mike McCauley // #ifndef RH_STM32WLx_h #define RH_STM32WLx_h #include ///////////////////////////////////////////////////////////////////// /*! \class RH_STM32WLx RH_STM32WLx.h \brief Driver to send and receive unaddressed, unreliable datagrams via a SX1261 LoRa capable radio transceiver embedded in a ST Microelectronics STM32WLE5xx and STM32WLE4xx processors. \par Overview The ST Microelectronics STM32WLE5xx and STM32WLE4xx Arm Cortex processors contain a SX1261 radio with 2 power amplifiers (PAs), a bit like a combination of a SX1261 and SX1262. There is a dedicated SPI interface (called the SubGhzSPI that is used only to communicate with the radio. The Seeed LoRa-E5-HF and LoRa-E5-LF modules encapsulate a STM32WLE5JC processor, along with an antenna switch, Temperature Controlled Crystal Oscillator (TCXO) and some support components. The Seeed Wio-E5 mini developement board (described below) has a LoRa-E5-HF along with voltage regulator, USB interface, antenna connector etc. This class is a subclass of RH_SX126x. See the documentation for that class for more details about configuring and using this class. The stmx32wl_* examples provided should compile out of the box on Arduino 2.1 or later and run with either modules equipped with LoRa-E4 or on the NUCLEO_WL55JC1. Make sure you select the appropriate board in Arduino. \par The Seeed Wio-E5 mini One example of a development board that includes a STM32WLE5xx and SX1261 radio is the Wio-E5 mini. The Wio-E5 mini is powered by the ST Microelectronics STM32WLE5JC, which contains an ARM Cortex-M4 core and Semtech SX126X LoRa capable radio. The core and radio are enclosed in a sealed Seeed LoRa-E5-HF module, and which includes an antenna switch. https://wiki.seeedstudio.com/LoRa_E5_mini/ https://files.seeedstudio.com/products/317990687/res/LoRa-E5+module+datasheet_V1.0.pdf It comes with a 868 to 915MHz compatible antenna and USB-C cable. As shipped, the Wio-E5 mini contains firmware that provides a serial AT command set that allows the device to connect to join a LoRaWAN network (via a LoRaWAN gateway) using LoRA radio modulation. https://files.seeedstudio.com/products/317990687/res/LoRa-E5+AT+Command+Specification_V1.0+.pdf You can plug the WiO E5 into a USB port, and use a serial port program (gtkterm, putty, Hyperterm or whatever) to communicate (using AT commands) with the Wio-E5, configure it and then use it to send LoRaWAN messages to a LoRaWAN server. However, what we want to do is to upload RadioHead based firmware into the Wio-E5 and use the built in SX126X radio to communicate via LoRa radio modulation with other similar LoRA radio nodes. Note: LoRa is NOT the same thing as LoRaWAN. LoRaWAN is a complete networking system that uses LoRa radio modulation as the transport layer. If you want to work with a LoRaWAN network, you should be using LoRaWAN software and libraries, not RadioHead. LoRa is a much simpler and lower level transport layer that can he used to send short messages over significant distances withglow power. So, we want to upload RadioHead based software (containing the RadioHead SX126X driver) to the STM32WLE5JC on the Wio-E5. Before we can do that we have to disable the firmware write protection on the STM32WLE5JC. The Wio-E5 (as shipped) AT command firmware is protected by the ARM processor's Read Out Protection (RDP) byte, meaning you cant read out the AT command set firmware, nor can you upload new firmware, The RDP byte has to be reset first. But CAUTION: resetting the RDP byte will permanently ERASE the as-shipped AT command firmware, and THERE IS NO WAY TO GET IT BACK. So make sure thats what you want to do. In order to be able to upload our own firmware we must reset the RDP byte from the as-shipped value of 0xBB (Level 1 read protection) to 0xAA (Level 0, no protection). In order to do this you will need: - Wio-E5 mini as shipped - STLink/V2 or STLink/V2 emulator (we used the Adafruit 2548 https://www.adafruit.com/product/2548). Its an emulator (a red cased USB dongle) - Host computer with USB ports (Linux, Mac or Windows) - STM32CubeProgrammer software https://www.st.com/en/development-tools/stm32cubeprog.html 2.15.0 or later for Linux Mac or Windows. Registration required. 1. Install STM32CubeProgrammer 2. Wire the STLink/V2 to the Wio-E5 pins with the jumper wires provided. This will provide both power and communications with the STM32WLE5JC: Wio-E5 STLink/V2 (writing on the end shows the pinout) 3.3V 3.3V GND GND DIO SWDIO CLK SWCLK 3. Plug the STLink/V2 into a USB port. Red light should appear on the STLink/V2. 4. Run STM32CubeProgrammer (appears in Ubuntu Applications menu if installed on Linux with wine) 5. At the top right you should see ST-LINK selected, and below that, in the ST-LINK Configuration box, the Serial number of your STLink/V2. 6a. If this is the first time you have used the STLink/V2, you will need to upgrade its firmware. Click on 'Firmware upgrade' in the ST-LINK Configuration box, get the Upgrade dialog. 6b. Click on 'Open in update mode'. If it complains the STlink is not in DFU mode, unplug and replug the STlink, click on 'Refresh device list', then 'Open in update mode' 6c Click on Upgrade. Wait 20 seconds. See success. 6d Close the dialog. 7a Press RST reset pin on the Wio-E5 and then immediately: 7b Click on 'Connect' top right of STM32CubeProgrammer. You should see some blue progress lines in the Log, maybe finally a red 'Data read failed'. Thats OK, because the RDP byte is still set. 8. Click on the 'OB' icon, 3rd from the top in the far left margin. 9. Select Read Out Protection item, see RDP value set to 'BB'. Change to 'AA', click Apply. See pop-up 'Option Bytes successfully programmed'. Good! The STM32WLE5JC firmware can now be written and read as we need (note that the factory supplied LoRaWan firmware has now been erased), by either STM32CubeProgrammer or Arduino IDE (2.1.1 or later) via the STLink/V2, so leave it connected In order to use the Arduino IDE to program the Wio-E5, you must install the stm32duino package using these instructions: https://community.st.com/t5/stm32-mcus/stm32-arduino-stm32duino-tutorial/ta-p/49649 We installed and tested with 2.7.1 Leave STLink/V2 connected but close STM32CubeProgrammer In Arduino IDE: select the following menu options: Tools -> Board -> STM32 MCU based boards -> LoRa boards Tools -> Board part number -> LoRa-E5 mini Tools -> U(S)ART support -> Enabled (generic Serial) You will then be able to edit and upload directly from Arduino IDE through the STLink/V2 You can connect the Wio-E5 USB-C to your hosts USB port and use Arduino IDE to monitor the serial output to Serial (Note: programming does not occur over the USB connection). There are other options for programming the STM32WLE5JC, including STM32CubeIDE from ST. We did not test them. https://www.rfsolutions.co.uk/downloads/1537522406DS_SX1261-2_V1.1_SEMTECH.pdf Lora-net software: https://github.com/Lora-net/SWL2001/releases/tag/v3.3.0 \par Interrupts This driver uses the SubGhzClass class (part of the Arduino stm32duino board support) to interface with the internal SX1261/2 radio. That class implements the dedicated radio SPI interface. The radio also has a dedicated internal pin for the radio interrupt and the SPI device select pin and the radio reset pin. The SubGhzClass class includes methods for using all those pins. Nevertheless it should be possible to use this processor with the normal external SPI interfaces to also interface with another SPI based RadioHEad supported radio, in oprder to make a radio gateway etc. */ class RH_STM32WLx : public RH_SX126x { public: // Contructor RH_STM32WLx(); // Override the init() function becaue we need to adjust some things afterwards to suit this radio module virtual bool init(); protected: // Override this because waiting is built in to the SUBGhz driver virtual bool waitUntilNotBusy() { return true;}; /// Do whatever is necessary to establish the interrupt handler. /// This device has special requirements for setting up the interupt handler /// through the SUBGHZSPI interface so we override bool setupInterruptHandler(); }; #endif