.. zephyr:board:: stm32wb5mmg

Overview
********

STM32WB5MMG is an ultra-low-power and small form factor certified 2.4 GHz
wireless module. It supports Bluetooth |reg| Low Energy 5.4, Zigbee |reg| 3.0,
OpenThread, dynamic, and static concurrent modes, and 802.15.4 proprietary
protocols. This board support is added in order to make it possible use this
module on other boards as HCI layer (Specifically B-U585I-IOT02A Development board).

STM32WB5MMG supports the following features:

- Bluetooth |reg| module in SiP-LGA86 package
- Integrated chip antenna
- Bluetooth |reg| Low Energy 5.4, Zigbee |reg| 3.0, OpenThread certified
  Dynamic and static concurrent modes
- IEEE 802.15.4-2011 MAC PHY Supports 2 Mbits/s
- Frequency band 2402-2480 MHz
- Advertising extension
- Tx output power up to +6 dBm
- Rx sensitivity: -96 dBm (Bluetooth |reg| Low Energy at 1 Mbps), -100 dBm (802.15.4)
- Range: up to 75 meters
- Dedicated Arm |reg| Cortex |reg|-M0+ CPU for radio and security tasks
- Dedicated Arm |reg| Cortex |reg|-M4 CPU with FPU and ART (adaptive real-time accelerator) up to 64 MHz speed
- 1-Mbyte flash memory, 256-Kbyte SRAM
- Fully integrated BOM, including 32 MHz radio and 32 kHz RTC crystals
- Integrated SMPS
- Ultra-low-power modes for battery longevity
- 68 GPIOs
- SWD, JTAG

More information about the board can be found at the `` `STM32WB5MMG on www.st.com`_.

Hardware
********

STM32WB5MMG is an ultra-low-power and small form factor certified 2.4 GHz
wireless module. It supports Bluetooth |reg| Low Energy 5.4, Zigbee |reg| 3.0, OpenThread,
dynamic, and static concurrent modes, and 802.15.4 proprietary protocols. Based
on the STMicroelectronics STM32WB55VGY wireless microcontroller, STM32WB5MMG
provides best-in-class RF performance thanks to its high receiver sensitivity
and output power signal. Its low-power features enable extended battery life,
small coin-cell batteries, and energy harvesting. STM32WB5MMG revision Y is
based on cut 2.1 of the STM32WB55VGY microcontroller. Revision X is based on
cut 2.2.

- Ultra-low-power with FlexPowerControl (down to 600 nA Standby mode with RTC and 32KB RAM)
- Core: ARM |reg| 32-bit Cortex |reg|-M4 CPU with FPU, frequency up to 64 MHz
- Radio:

  - 2.4GHz
  - RF transceiver supporting Bluetooth |reg| 5.4
    specification, IEEE 802.15.4-2011 PHY
    and MAC, supporting Thread 1.3 and
  - Zigbee |reg| 3.0
  - RX sensitivity: -96 dBm (Bluetooth |reg| Low
    Energy at 1 Mbps), -100 dBm (802.15.4)
  - Programmable output power up to +6 dBm
    with 1 dB steps
  - Integrated balun to reduce BOM
  - Support for 2 Mbps
  - Support GATT caching
  - Support EATT (enhanced ATT)
  - Support advertising extension
  - Dedicated Arm |reg| 32-bit Cortex |reg| M0+ CPU
    for real-time Radio layer
  - Accurate RSSI to enable power control
  - Suitable for systems requiring compliance
    with radio frequency regulations ETSI EN
    300 328, EN 300 440, FCC CFR47 Part 15
    and ARIB STD-T66


- Clock Sources:

  - 32 MHz crystal oscillator with integrated
    trimming capacitors (Radio and CPU clock)
  - 32 kHz crystal oscillator for RTC (LSE)
  - Internal low-power 32 kHz (±5%) RC (LSI1)
  - Internal low-power 32 kHz (stability
    ±500 ppm) RC (LSI2)
  - Internal multispeed 100 kHz to 48 MHz
    oscillator, auto-trimmed by LSE (better than
    ±0.25% accuracy)
  - High speed internal 16 MHz factory
    trimmed RC (±1%)
  - 2x PLL for system clock, USB, SAI, ADC

- 2x DMA controllers (seven channels each) supporting ADC, SPI, I2C, USART, QSPI, SAI, AES, timers
- 1x USART (ISO 7816, IrDA, SPI master, Modbus and Smartcard mode)
- 1x LPUART (low power)
- Two SPI running at 32 Mbit/s
- 2x I2C (SMBus/PMBus)
- 1x SAI (dual channel high quality audio)
- 1x USB 2.0 FS device, crystal-less, BCD and LPM
- 1x Touch sensing controller, up to 18 sensors
- 1x LCD 8x40 with step-up converter
- 1x 16-bit, four channels advanced timer
- 2x 16-bit, two channels timers
- 1x 32-bit, four channels timer
- 2x 16-bit ultra-low-power timers
- 1x independent Systick
- 1x independent watchdog
- 1x window watchdog
- Up to 72 fast I/Os, 70 of them 5 V-tolerant

- Memories

  - Up to 1 MB flash memory with sector
    protection (PCROP) against R/W
    operations, enabling radio stack and
    application
  - Up to 256 KB SRAM, including 64 KB with
    hardware parity check
  - 20x 32-bit backup register
  - Boot loader supporting USART, SPI, I2C
    and USB interfaces
  - OTA (over the air) Bluetooth® Low Energy
    and 802.15.4 update
  - Quad SPI memory interface with XIP
  - 1 Kbyte (128 double words) OTP

- 4x digital filters for sigma delta modulator
- Rich analog peripherals (down to 1.62 V)

- 12-bit ADC 4.26 Msps, up to 16-bit with
  hardware oversampling, 200 μA/Msps
- 2x ultra-low-power comparator
- Accurate 2.5 V or 2.048 V reference
  voltage buffered output


- Security and ID

 - Secure firmware installation (SFI) for
   Bluetooth |reg| Low Energy and 802.15.4 SW stack
 - 3x hardware encryption AES maximum 256-bit for
   the application, the Bluetooth |reg|
 - Low Energy and IEEE802.15.4
 - Customer key storage/manager services
 - HW public key authority (PKA)
 - Cryptographic algorithms: RSA, Diffie-Helman, ECC over GF(p)
 - True random number generator (RNG)
 - Sector protection against R/W operation (PCROP)
 - CRC calculation unit
 - Die information: 96-bit unique ID
 - IEEE 64-bit unique ID, possibility to derive 802.15.4 64-bit
   and Bluetooth |reg| Low Energy
 - 48-bit EUI

More information about STM32WB5MMG can be found here:

- `STM32WB5MMG on www.st.com`_
- `STM32WB5MMG datasheet`_

Supported Features
==================

.. zephyr:board-supported-hw::

Bluetooth |reg| and compatibility with STM32WB Copro Wireless Binaries
======================================================================

To operate Bluetooth |reg| on STM32WB5MMG, Cortex-M0 core should be flashed with
a valid STM32WB Coprocessor binaries (either 'Full stack' or 'HCI Layer').
These binaries are delivered in STM32WB Cube packages, under
``Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/``

For compatibility information with the various versions of these binaries,
please check :module_file:`hal_stm32:lib/stm32wb/README.rst`.

Note that since STM32WB Cube package V1.13.2, "full stack" binaries are not compatible
anymore for a use in Zephyr and only "HCI Only" versions should be used on the M0
side.

Connections and IOs
===================


Default Zephyr Peripheral Mapping:
----------------------------------

.. rst-class:: rst-columns

- UART_1 TX/RX : PB7/PB6
- LPUART_1 TX/RX : PA3/PA2
- USB : PA11/PA12
- SWD : PA13/PA14

System Clock
------------

STM32WB5MMG System Clock could be driven by internal or external oscillator,
as well as main PLL clock. By default System clock is driven by HSE clock at 32MHz.

Serial Port
-----------

STM32WB5MMG board has 2 (LP)U(S)ARTs. LPUART1 is connected to the main U585I
microcontroller that is used as HCI controller port. USART1 is not connected
to any external pinout, so it is not possible to debug the module directly.
Rather, users can use the available USB port (CN12) to run virtual com port
(VCP) USB stack for the debugging.


Programming and Debugging
*************************

.. zephyr:board-supported-runners::

Applications for the ``stm32wb5mmg`` board configuration can be built the
usual way (see :ref:`build_an_application`).

Flashing the module
===================

The onboard ST-Link on the ``b_u585i_iot02a`` board can be used to flash the
STM32WB5MMG module. To do this you should put SW4 on OFF and SW5 on ON mode.
In this case the firmware will be uploaded on the STM32WB5MMG module.

The module is configured to be flashed using west `STM32CubeProgrammer`_ runner,
so its :ref:`installation <stm32cubeprog-flash-host-tools>` is required.

Alternatively, openocd can also be used to flash the board using
the ``--runner`` (or ``-r``) option:

.. code-block:: console

   $ west flash --runner openocd

Flashing ``hci_uart`` application to STM32WB5MMG
------------------------------------------------

Connect the B-U585I-IOT02A to your host computer using the USB port. Put
the SW4 (MCU SWD) in OFF mode and SW5 (SWD BLE) in ON mode. Then build
and flash an application. Here is an example for the
:zephyr:code-sample:`bluetooth_hci_uart` application.

Run a serial host program to connect with your B-U585I-IOT02A board:

.. code-block:: console

   $ minicom -D /dev/ttyACM0

Then build and flash the application for the STM32WB5MMG module.

.. zephyr-app-commands::
   :zephyr-app: samples/bluetooth/hci_uart
   :board: stm32wb5mmg
   :goals: build flash

Next, reverse back the buttons to default mode (SW4 on ON and SW5
on OFF) mode. In this case we will upload the Bluetooth |reg| sample on the
main microcontroller. Then, build the Bluetooth |reg|
:zephyr_file:`samples/bluetooth/observer` demo application for
B-U585I-IOT02A board:

.. zephyr-app-commands::
   :zephyr-app: samples/bluetooth/observer
   :board: b_u585i_iot02a
   :goals: build flash

Rest the board and you should see the following messages on the console:

.. code-block:: console

   Starting Observer Demo
   Started scanning...
   Exiting main thread.
   Device found: 2C:98:F3:64:58:06 (random) (RSSI -82), type 3, AD data len 31
   Device found: CE:5B:9A:87:69:4F (random) (RSSI -80), type 3, AD data len 8
   Device found: 7B:1E:DD:38:23:E1 (random) (RSSI -85), type 0, AD data len 17


Debugging
=========

You can debug an application in the usual way.  Here is an example for the
:zephyr:code-sample:`bluetooth_hci_uart` application.

.. zephyr-app-commands::
   :zephyr-app: samples/bluetooth/observer
   :board: b_u585i_iot02a
   :maybe-skip-config:
   :goals: debug

.. _STM32WB5MMG on www.st.com:
   https://www.st.com/en/microcontrollers-microprocessors/stm32wb5mmg.html

.. _STM32WB5MMG datasheet:
   https://www.st.com/resource/en/datasheet/stm32wb5mmg.pdf

.. _STM32CubeProgrammer:
   https://www.st.com/en/development-tools/stm32cubeprog.html
