STM32WB Bluetooth® LE – Wireless Stack Information

1. STM32WB - Bluetooth® LE Coprocessor Binaries

This is a description about the Bluetooth® LE Wireless stack available for the secure CM0+ coprocessor of the STM32WB Most of the information can be found within the Release Note for STM32WBxx Copro Wireless Binaries. https://github.com/STMicroelectronics/STM32CubeWB/tree/master/Projects/STM32WB_Copro_Wireless_Binaries

1.1. CubeWB v1.14.0 - Bluetooth® LE Wireless stack Summary

For Bluetooth® LE applications, 6 binaries are available. According to the type of application, the size of the flash, it is up to the developer to load the right binary:

  • stm32wb5x_BLE_Stack_full_extended_fw.bin
    • Full BLE Stack 5.3 certified : Link Layer, HCI, L2CAP, ATT, SM, GAP and GATT database
    • BT SIG Certification listing : Declaration ID ??
    • To be used for Adverting/Scanning Extension - Full HCI/ACI/DTM commands/Event support
  • stm32wb5x_BLE_Stack_full_fw.bin
    • Full BLE Stack 5.3 certified : Link Layer, HCI(limited), L2CAP, ATT, SM, GAP and GATT database
    • BT SIG Certification listing : Declaration ID ??
    • To be used for GAP Central/Peripheral & GATT Server/Client applications
  • stm32wb5x_BLE_Stack_light_fw.bin
    • BLE Stack 5.3 certified : Link Layer, HCI(limited), L2CAP, ATT, SM, GAP(limited) and GATT(limited) database
    • BT SIG Certification listing : Declaration ID ??
    • To be used for GAP Peripheral & GATT Server applications
  • stm32wb5x_BLE_HCILayer_fw.bin
    • HCI Layer only mode 5.3 certified : Link Layer, HCI, DTM
    • BT SIG Certification listing : Declaration ID ??
    • To be used for BLE Host Stack running on CM4 application processor (Arduino, Zephyr,..)
  • stm32wb5x_BLE_HCILayer_extended_fw.bin
    • HCI Layer only mode 5.3 certified : Link Layer, HCI, DTM, Extended Advertising/Scanning
    • BT SIG Certification listing : Declaration ID ??
    • To be used for BLE Host Stack running on CM4 application processor (Arduino, Zephyr,..)
  • stm32wb5x_BLE_HCI_AdvScan_fw.bin
    • HCI Layer only mode 5.3 certified : Link Layer, HCI
    • BT SIG Certification listing : Declaration ID ??
    • To be used for advertising and scanning through HCI interface
Info white.png Information
To use extended binaries, it is necessary to adapt the scatter file in the BLE applications as:
  • The RAM_A shared range shall be reduced to memory range [0x20030000:0x200307FF]
  • The Mail-box buffers(MB_MEM1, MB_MEM2) shall be located in RAM_B shared defined in memory range [0x20038000:0x2003A7FF]
  • The RAM_B shared shall be added to Total_RAM_region


stm32wb5x_BLE_Stack_full_fw.bin [MODIFIED] Full BLE Stack 5.2 certified : Link Layer, HCI, L2CAP, ATT, SM, GAP and GATT database BT SIG Certification listing : Declaration ID D042164 Following features are kept (based on Basic stack library compared to previous deliveries): GAP peripheral, central (LL Master up to 6 links with Slave up to 2 links/ Master up to 7 links with Slave up to 1 links/ Master up to 8 links ) GATT server, client Data length extension 2Mbit PHY / PHY update Privacy White list Legacy Pairing, LE secure connections HCI interface (full, like stm32wb5x_BLE_HCILayer_fw.bin) Following features are removed: Direct test mode L2Cap Connection - oriented channels support (IP over BLE enabler) Channel selection #2 (under application flag selection) Some HCI interface features (won’t be able to process through HCI interface)

stm32wb5x_BLE_Stack_full_extended_fw.bin Full BLE Stack 5.2 certified : Link Layer, HCI, L2CAP, ATT, SM, GAP and GATT database BT SIG Certification listing : Declaration ID D042164 Following features are kept: GAP peripheral, central (LL Master up to 6 links with Slave up to 2 links/ Master up to 7 links with Slave up to 1 links/ Master up to 8 links ) GATT server, client Data length extension 2Mbit PHY / PHY update Privacy White list Legacy Pairing, LE secure connections HCI interface (full, like stm32wb5x_BLE_HCILayer_fw.bin) Direct Test Mode L2CAP connection oriented channels support (IP over BLE enabler) Channel selection #2 (under application flag selection) BLE Extended advertising (under application flag selection with predefined fixed configuration: 3 sets maximum number, 1650 bytes maximum advertising data length) Warning: To use this binary, it is necessary to adapt the scatter file in the BLE applications as: The RAM_A shared range shall be reduced to memory range [0x20030000:0x200307FF] The Mail-box buffers(MB_MEM1, MB_MEM2) shall be located in RAM_B shared defined in memory range [0x20038000:0x2003A7FF] The RAM_B shared shall be added to Total_RAM_region

stm32wb5x_BLE_Stack_light_fw.bin Full BLE Stack 5.2 certified : Link Layer, HCI, L2CAP, ATT, SM, GAP and GATT database BT SIG Certification listing : Declaration ID D042164 Wireless Ble stack Light configuration – Slave Only Following features are kept: GAP peripheral only (LL Slave up to 2 links) GATT server Data length extension Privacy White list Legacy Pairing, LE secure connections HCI interface (reduced) Additional beacon Following features are removed: - Direct Test Mode BLE “Slave Only” stack implies that with this stack configuration, STM32WB is not able to scan and request a BLE connection. It will just advertise, and accept incoming connection request from other master devices (e.g. Smartphone) (Slave up to 2 links). While with the “full feature” BLE stack, STM32WB5xx is able to support both master and slave roles on different links (with the limitation of max 8 links in parallel, from which max 2 slave links).

stm32wb5x_BLE_Stack_basic_fw.bin [MODIFIED] Full BLE Stack 5.2 certified : Link Layer, HCI, L2CAP, ATT, SM, GAP and GATT database BT SIG Certification listing : Declaration ID D042164 Wireless Ble stack Basic configuration Following features are kept: GAP peripheral & Central (8 links - LL slave up to 2 links) GATT server, client Data length extension Privacy White list Legacy Pairing, LE secure connections HCI interface (reduced) Phy update (2Mb/s) Additional beacon Following features are removed: L2Cap Connection - oriented channel (Chip/ Ip over BLE,…) Some HCI interface features (won’t be able to process through HCI interface) Direct test mode

stm32wb5x_BLE_HCILayer_fw.bin HCI Layer only mode 5.2 certified : Link Layer, HCI with Direct Test Mode BT SIG Certification listing : Declaration ID D042213 stm32wb5x_BLE_HCILayer_extended_fw.bin [NEW] HCI Layer only mode 5.2 certified : Link Layer, HCI with Direct Test Mode BT SIG Certification listing : Declaration ID D042213 BLE Extended advertising (under application flag selection with predefined fixed configuration: 3 sets maximum number, 1650 bytes maximum advertising data length)


stm32wb5x_BLE_Stack_full_extended_fw.bin Full BLE Stack 5.2 certified : Link Layer, HCI, L2CAP, ATT, SM, GAP and GATT database BT SIG Certification listing : Declaration ID D042164 Following features are kept: GAP peripheral, central (LL Master up to 6 links with Slave up to 2 links/ Master up to 7 links with Slave up to 1 links/ Master up to 8 links ) GATT server, client Data length extension 2Mbit PHY / PHY update Privacy White list Legacy Pairing, LE secure connections HCI interface (full, like stm32wb5x_BLE_HCILayer_fw.bin) Direct Test Mode L2CAP connection oriented channels support (IP over BLE enabler) Channel selection #2 BLE Extended advertising/scanning

HCI Layer only mode 5.2 certified : Link Layer, HCI BT SIG Certification listing : Declaration ID D042213 To be used for advertising and scanning through HCI interface

stm32wb5x_BLE_HCILayer_fw.bin HCI Layer only mode 5.2 certified : Link Layer, HCI with Direct Test Mode BT SIG Certification listing : Declaration ID D042213


  • Add the support of STM32 MCU in Arduino IDE[1]:
    • Arduino_Core_STM32[2]
    • STM32 boards support to Arduino[3]
  • Include STM32duinoBLE library:
    • STM32duinoBLE[4]
      • From the "Tools > Manage Librairies..." menu, select the STM32duinoBLE library:
STM32duinoBLE library
Connectivity STM32duinoBLE lib.png



  • Configuring IDE:
    • Connect the Nucleo-64 WB55 board to the computer USB port.
    • Launch the Arduino software
    • Select the Nucleo-64 WB55 board in two steps:
      • From the "Tools > Board" menu, select the STM32 boards groups: Nucleo-64
      • Then from the "Tools > Board part number" menu, select the P-Nucleo WB55RG
Arduino Nucleo-64 WB55 Configuration
Connectivity Arduino WB55 Configuration.png

1.2. BLE Stack Configuration for P-NUCLEO-WB55

BLE Stack configuration for P-NUCLEO-WB55:

  • For release v1.12.0 and previous use full stack (stm32wb5x_BLE_Stack_full_fw.bin)
  • For release v1.13.0 and next use HCI Layer stack (stm32wb5x_BLE_HCILayer_fw.bin) and do the following modification in stm32BLEDuino library:
    • In HCISharedMemTransport.cpp file comment the following lines:
HCISharedMemTransport.cpp modification
Connectivity STM32duinoBLE lib init.png


1.3. Sketch STM32WB_P2P_Server.ino

The following Arduino's Sketch demonstrates the P2P Server application including debug traces on the UART hyperterminal.

  • compile and upload STM32WB_P2P_Server.ino
/**
******************************************************************************
* @file    STM32WB_P2P_Server.ino
* @author  WBL BLE Application Team
* @brief   Arduino STM32WB P2P Server Application (Custom STM)
******************************************************************************
* @attention
* This example creates a P2P server Application
* P2P service                     - 0000FE40-cc7a-482a-984a-7f2ed5b3e58f
* Led control Characteristic      - 0000FE41-8e22-4541-9d4c-21edae82ed19 (Read|WritewithoutResponse)
*                                     Byte 0 - Board Selection
*                                     Byte 1 - LED Status (1 : ON; 0 : OFF)
* Button control Characteristic   - 0000FE42-8e22-4541-9d4c-21edae82ed19 (Notify)
*                                     Byte 0 - Board Selection
*                                     Byte 1 - LED Status (1 : ON; 0 : OFF)
* To be supported by Smart Phone application ST BLE Sensor, the advertsing data shall contain the AD element Manufacturer as following:
* Manufacturer_data:
*   0x01,                   // SKD version 
*   0x83,                   // CFG_DEV_ID_P2P_SERVER1 
*   0x00,                   // GROUP A Feature  
*   0x00,                   // GROUP A Feature 
*   0x00,                   // GROUP B Feature 
*   0x00,                   // GROUP B Feature 
* };
*
* The two characteristics are used :
*  -- to control (Write) the LED1 of Nucleo64-WB55 board LED 
*  -- or to Notify the Remote device by pushing SW1 f Nucleo68-WB55 board.
*  
*  The Circuit:
*  - Nucleo68-WB55
*  You can use a generic BLE central app, like ST BLE Sensor or ST BLE Toolbox, to interact with the services and characteristics
*  created in this sketch.
*
*  This example code is in the public domain.
*
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include <STM32duinoBLE.h>

/* Private typedef -----------------------------------------------------------*/
typedef struct __attribute__((packed)) {
    byte boardSelection;
    byte ledStatus;
} P2P_STM32WB_led_t;
P2P_STM32WB_led_t ledControl;

typedef struct __attribute__((packed)) {
    byte boardSelection;
    byte ButtonStatus;
} P2P_STM32WB_button_t;
P2P_STM32WB_button_t buttonInfo;

/* Private variables ---------------------------------------------------------*/
const int buttonPin = PC4; // set buttonPin to digital pin PC4
const int ledPin = LED_BUILTIN; // set ledPin to on-board LED
const int buttonPushed = 1;
const int boardWB_1 = 1;

int buttonPushCounter = 0;   // counter for the number of button presses
int buttonState = 0;         // current state of the button
int lastButtonState = 1;     // previous state of the button

/* Private variables ---------------------------------------------------------*/
/* UUID for P2P Service-------------------------------------------------------*/
BLEService P2PService("0000FE40-cc7a-482a-984a-7f2ed5b3e58f"); 

/* create switch characteristic and allow remote device to read and write -----*/
BLECharacteristic ledCharacteristic("0000FE41-8e22-4541-9d4c-21edae82ed19", BLERead | BLEWriteWithoutResponse,sizeof(ledControl),true);

/* create button characteristic and allow remote device to get notifications --*/
BLECharacteristic buttonCharacteristic("0000FE42-8e22-4541-9d4c-21edae82ed19", BLENotify,sizeof(buttonInfo),true);

/* Manufacturer Advertising Data element structure ----------------------------*/
static const uint8_t manufacturer_data[6] = {
    0x01, // BlueST Protocol - SDK Version
    0x83, // Device ID - STM32WB P2P Server 
    0x00, // GROUP A Feature
    0x00, // GROUP A Feature
    0x00, // GROUP B Feature
    0x00, // GROUP B Feature
};

HCISharedMemTransportClass HCISharedMemTransport;
BLELocalDevice BLEObj(&HCISharedMemTransport);
BLELocalDevice& BLE = BLEObj;

/**
* @brief  Connection Event Handler
* @param  BLE Central Device
* @retval None
*/
void blePeripheralConnectHandler(BLEDevice central) {
  // central connected event handler
  Serial.print("==> Connection established with central: ");
  Serial.print(central.address());
    if (BLE.connected()) {
      Serial.print(" -- RSSI = ");
      Serial.println(BLE.rssi());
    }
}

/**
* @brief  Disconnection Event Handler
* @param  BLE Central Device
* @retval None
*/
void blePeripheralDisconnectHandler(BLEDevice central) {
  // central disconnected event handler
  Serial.print("==> Disconnection event with central: ");
  Serial.println(central.address());
}

/**
* @brief  Event Handler when Characteristic Written 
* @param  BLE Central Device
* @param  Characteritic
* @retval None
*/
void LedCharacteristicWritten(BLEDevice central, BLECharacteristic characteristic) {
  byte data[sizeof(ledControl)];
  // central wrote new value to characteristic, update LED
  if (ledCharacteristic.written()) {
    Serial.println("==>Led Characteritics written:");
    Serial.print("Data Received: ");
    ledCharacteristic.readValue(data, sizeof(ledControl));
    Serial.print(ledCharacteristic.valueLength());
    Serial.print(" ");
    Serial.print("bytes -- ");
    for (int i = 0; i < sizeof(ledControl); i++) {
      Serial.print("0x");
      Serial.print(data[i], HEX);
      Serial.print(" ");
    }
    Serial.println();
    ledControl.boardSelection=data[0];
    ledControl.ledStatus=data[1];
    Serial.print("Board Selected:");
    Serial.println(ledControl.boardSelection);
    Serial.print("Value:");
    Serial.println(ledControl.ledStatus);

    if(ledControl.ledStatus){
      Serial.println("==>LED1 ON");
      digitalWrite(ledPin, HIGH);
    }
    if(!ledControl.ledStatus){
      Serial.println("==>LED1 OFF");
      digitalWrite(ledPin, LOW);
    }
  }
}  

/**
* @brief  Arduino main Setup 
* @param  None
* @retval None
*/
void setup() {
  Serial.begin(115200);
  while (!Serial);

  pinMode(ledPin, OUTPUT); // use the LED as an output
  pinMode(buttonPin, INPUT_PULLUP); // use button pin as an input

  //Project P2P server
  Serial.println("======================================");
  Serial.println("== STM32WB - P2P Server Application ==");
  Serial.println("======================================");
  
  // begin initialization
  if (!BLE.begin()) {
    Serial.println("==>starting BLE failed!");

    while (1);
  }
  
  //Set the device name in the built in device name characteristic.
  BLE.setDeviceName("STM32WB-Arduino");
  //set the local name peripheral advertises
  Serial.println("==> Advertising Name - P2P_Server");
  BLE.setLocalName("P2P_Server");
  //Set the manufacturer data value used when advertising.
  BLE.setManufacturerData(manufacturer_data, sizeof(manufacturer_data));
  
  //Set the advertising interval in units of 0.625 ms. 
  //Defaults to 100ms (160 * 0.625 ms) if not provided. 
  BLE.setAdvertisingInterval(160); // 160 * 0.625 ms
   
  // set the UUID for the service this peripheral advertises:
  //BLE.setAdvertisedService(P2PService);

  // add the characteristics to the service
  P2PService.addCharacteristic(ledCharacteristic);
  P2PService.addCharacteristic(buttonCharacteristic);
  // assign event handlers for characteristic
  ledCharacteristic.setEventHandler(BLEWritten, LedCharacteristicWritten);

  // add the service
  BLE.addService(P2PService);

  //configure data to Notify when SW1 pushed
  buttonInfo.boardSelection = boardWB_1;
  buttonInfo.ButtonStatus=buttonPushed;
  
  // start advertising
  BLE.advertise();

  String address = BLE.address();
  Serial.print("==>Local address is: ");
  Serial.println(address);

  Serial.println("==>Advertising Started, waiting for connections...");

  // assign event handlers for connected, disconnected to peripheral
  BLE.setEventHandler(BLEConnected, blePeripheralConnectHandler);
  BLE.setEventHandler(BLEDisconnected, blePeripheralDisconnectHandler);
}

/**
* @brief  Arduino Loop 
* @param  None
* @retval None
*/
void loop() {
  // poll for BLE events
  BLE.poll();

  // read the SW1 Button input pin:
  buttonState = digitalRead(buttonPin);
  // compare the buttonState to its previous state
  if (buttonState != lastButtonState) {
    // if the state has changed, increment the counter
    if (buttonState == LOW) {
      // if the current state is HIGH then the button went from off to on:
      buttonPushCounter++;
      //Serial.println("on");
      Serial.print("==> Number of time button is pushes: ");
      Serial.println(buttonPushCounter);
      
      //check if connection is established by Central device
      if(BLE.central()){
        //check if Notification is enabled
        if (buttonCharacteristic.subscribed()) {
          Serial.println("buttonCharacteristic is subscribed:");
          Serial.println("==>Notification of Button Pushed is sent");
          buttonCharacteristic.writeValue((byte*) &buttonInfo, sizeof(buttonInfo));
        } else {
           Serial.println("buttonCharacteristic is NOT subscribed:");
           Serial.println("==>Notification is NOT sent");
        }
       }
    } else {
      // if the current state is LOW then the button went from on to off:
      //Serial.println("off");
    }
    // Delay a little bit to avoid bouncing
    delay(50);
  }
  // save the current state as the last state, for next time through the loop
  lastButtonState = buttonState;
}
/************************************ STMicroelectronics *****END OF FILE****/

1.4. Debug Traces

At the startup, the HyperTerminal displays the following Traces

Startup Debug Trace
Connectivity Arduino WB55 Debug.png

2. Smart Phone Application - ST BLE Sensor

  • Download ST BLE Sensor or ST BLE ToolBox application on the smartphone.
  • Scan and Connect to P2P_Server
  • Toggle SmartPhone LED or Push SW1 Button of the Nucleo-64 WB55 board.
ST BLE Sensor Scan ST BLE Sensor Connect
Connectivity Arduino ST BLE Sensor Adv.jpg
Connectivity Arduino ST BLE Sensor connect.jpg
  • Debug Trace displays all the sequences at application level
Arduino Nucleo-64 WB55 Traces
Connectivity Arduino WB55 Trace.png

3. References

No categories assignedEdit