BM71 Stopwatch Demo


This lab exercise will have you configure/deploy a custom (private) GATT Service ("Stopwatch Service") on a BM71, then interface it with a PIC24 MCU (running demo code) and test it using a dedicated Android “Stopwatch” App.

You will:

The PIC24 demo code provided in this lab implements the BM71 Configuration EEPROM programming algorithm, simplifying deployment of static/default BM71 parameters in the final application.

After creating a BM71 UI Configuration text file, you will run the BM7x EEPROM Table Utility to convert this file into an EEPROM table array that is #included in the PIC24 MPLAB project.

On reset, the PIC24 demo code reads the configuration memory of the BM71, and if it differs from the table, re-programs all BM71 configuration EEPROM memory contents with the settings in the table.


Hardware Tools

Software Tools

Exercise Files


  • Install MPLAB X IDE and XC16 Compiler
  • Install the MCP2200 USB driver
  • Download the BM7x EEPROM Table Utility using the link above
  • Download/extract the UI Configuration Tool as well as the Manual Pattern Test Tool to your PC using the links above
  • Download/extract the Explorer16 BM7x Pictail Stopwatch Project to your "C:\" folder

 Connection Diagram



GAP Peripheral Device (GATT Server)
The Explorer16 Board with the BM71 advertises a "Stopwatch Service", which provides stopwatch data to a smartphone, as well as providing a control point to remotely trigger the stopwatch to start counting.

GAP Central Device (GATT Client)
An Android smartphone running the "Stopwatch" demo app, scans/filters/connects to a specific stopwatch. Also can trigger the stopwatch to begin counting.

MCU Interface


Demo Flowcharts



GATT Server Configuration

In this sequence, you will configure the BM71 static parameters for this application, including creating the GATT Table for the Stopwatch Service.


Verify Module Firmware Version

This demo requires BM71 module firmware version 1.06. Verify the firmware version, and if necessary, program v1.06 firmware into the module.


Load UI Configuration

Launch the UI Configuration Tool (found in the Software Tools section above) and load in the Default BM71 UI Config File ("IS1871SF_102_BLEDK3_UI v100.132(BM71) default.txt") which you obtained from the Exercise Files section of this page.


"Default" BM71 Configuration Files are located in the root folder where the UI Config Tool is installed.


Edit UI Configuration

Select Edit and ensure that the BLEDK radio button is checked and that BM71 is the device selected under the Main Feature window. Then press OK.



Change the Device Name, UART Setting, Operation Mode

Under System Setup: Device Information, set the Name Fragment to a unique value. This identifier will become the GAP Service "Device Name" characteristic.

Recommend a maximum length of 8 characters.

If your name is longer than 8 chars, you will see an error message when filling in the balance of your ADV_IND payload (remember, we only have 31 bytes of payload!)

Under System Setup: Uart Setting, enable UART RX_IND pin function.

Under System Setup: Operation Mode Setting, set the Operation Pattern to "Manual Pattern" as shown:


Hit “Next” to proceed to the “System Setup2” Tab


GPIO Configuration

Under System Setup2: GPIO Configuration, select "NO_USE" for all pin functions EXCEPT P16, which should be assigned to the UART_RX_IND function as shown:


Hit “Next” to proceed to the “LE Mode Setup” Tab


Advertising Interval (ADV_IND Packets)

Under LE Mode Setup: LE Advertising Setting, change the default "LE Fast Advertising Interval" to 100mS (0x00A0) as shown:


LE Reduced Power Advertising Interval parameter (not shown above) is only used in Auto Pattern (Transparent UART) mode operation. You do not need to modify this.

BLE "ADV_IND" type advertising packet is a generic advertisement, meaning that it is undirected and is connectable. This would be the initial default advertising type for a new product, before it has paired with a smartphone.


Advertising Payload (ADV_IND Packets)

Under LE Mode Setup: Advertising Data Setting, add the Stopwatch Service UUID (0x8E9598AC066211E6B5123E1D05DEFE78) to the ADV_IND payload as shown:


The Stopwatch App uses the Service UUID form the ADV_IND packets to filter out other devices, only displaying Stopwatch Devices on a scan.

Hit “Next” to proceed to the “GATT Service Table” Tab

GATT Stopwatch Service

You will now create the “Stopwatch Service" attribute table having the following characteristics and features:

“Stopwatch Service”:
UUID: 0x8E9598AC066211E6B5123E1D05DEFE78

“Stopwatch Control Point” Characteristic:
UUID: 0x8E959DE8066211E6B5123E1D05DEFE78
Value:0x00 (1 byte)
Value Permissions: Write/Write without response

“Stopwatch Status” Characteristic:
UUID: 0x8E959FE6066211E6B5123E1D05DEFE78
Value:0x0000000000 (5 bytes)
Value Permissions: Read/Notify
Requires Client Characteristic Configuration Descriptor (CCCD) (UUID: 0x2902) with value 0x0000


  • These UUIDs are "version 1" types, and were generated using
  • Attribute handle values will be automatically assigned by the UI Configuration Tool, starting at 0x8000
  • The characteristics need to be added to the service table in the order shown below, so the handle values match those embedded in the PIC24 demo code.


Create Custom GATT Service Table

Scroll down to the "Add-on Service" section, and from the "Service List", drag/drop "Others" into the "Add-on Service Table" view as shown:


You should see a dialog box prompting you to define a new private service. Type/Copy/Paste the Stopwatch Service UUID value (0x8E9598AC066211E6B5123E1D05DEFE78) into the UUID field as shown:


Hit “Next” to enter the first characteristic.


Add "Stopwatch Control Point" Characteristic

Enter the Hex UUID value (0x8E959DE8066211E6B5123E1D05DEFE78), Permissions (Properties) and initial Characteristic Value for the “Stopwatch Control Point” characteristic (defined above), as shown:


Click OK.


Add "Stopwatch Status" Characteristic

In the “Add-On Service Table” window, add the next characteristic by right-clicking on the Service UUID and selecting “Add Characteristic” as shown:


Enter the Hex UUID value (0x8E959FE6066211E6B5123E1D05DEFE78), Permissions (Properties) and Characteristic Value (0x0000000000) for the “Stopwatch Status” characteristic (defined above), as shown:


Click OK.


Add CCCD Descriptor Attribute to "Stopwatch Status" Characteristic

In the “Add-On Service Table” window, expand all the “+” tabs to see the completed GATT service Table. Right-click on the characteristic handle 0x8003. We need to add a descriptor attribute (CCCD, type 0x2902) to this characteristic:


Define a Client Characteristic Configuration Descriptor (CCCD) by entering its Hex UUID value (0x2902) and initial value of 0x0000 as shown:


Click OK.


Review GATT Service Table

In the “Add-On Service Table” window, expand all the “+” tabs to see the completed GATT service Table. It should match as shown:


Hit “Next” to proceed to the “LED Setup” Tab.


LED0 Setup

In the “LED Setup” window, configure P0_2/LED0 output to flash two times per second during advertising (standdby mode), and then turn fully on when a connection is established, as shown:


Hit "Finish".


Save BM71 Configuration Settings to a File

Press “Save” to save your settings to a BM71 configuration file (for example “C:\Masters\20055\Lab4\bm71-config\bm71-config.txt”) as shown :


Click OK to close the final dialog box.


Close UI Config Tool

Shutdown the UI Configuration Tool as shown:


Create BM71 Config EEPROM Table Array

The PIC24 demonstration code simplifies deployment of BM71 configuration settings by in-circuit-programming the module's configuration EEPROM memory. In this next sequence, you will convert your BM71 configuration file into a Flash Configuration Table that can be #included in the MPLAB project.

If not done so already, download and extract the Explorer16 BM7x Pictail Stopwatch Project to your C:\ folder


Start the BM7x EEPROM Utility, Load the BM71 Configuration File

Launch the BM7x EEPROM Table Utility (found in the Software Tools section above). When prompted, navigate to your saved configuration file from Step 14 above:



Create the BM71 Configuration EEPROM Table in the MPLAB Project Folder

When prompted, save the output file to the PIC24 demo project folder C:\host-firmware\Explorer16 BM70 Pictail Stopwatch.X


Prepare the BM71 PICTail for use on the Explorer16 board


Prepare BM71 PICTail Jumpers

Disconnect the USB cable from the PICTail. Configure the module for Application mode by moving dip-switch SW7 to the OFF position. Prepare for connection to Explorer16 by disconnecting the BM71 UART pins from the MCP2200 (remove J3 Jumpers), and finally, set the power source to PIC (Jumper J1) as shown:



Install BM71 PICTail

Install the BM71 PICTail into the Explorer16 board as shown (Ensure PIC24FJ128GA010 PIM is installed):


Program/Run the PIC24 MCU Stopwatch Demo Project

If not done so already, download and extract the Explorer16 BM7x Pictail Stopwatch Project to your C:\ folder


Open the Project

Start MPLAB X and open the project C:\host-firmware\Explorer16 BM70 Pictail Stopwatch.X


Select the BM71 Project Configuration

Select the “BM71” project configuration as shown:



#include the BM71 Configuration EEPROM Table

Open with your editor the file bm70_configure.c. Go to line 57 and change the name of the #included BM71 EEPROM Table file to the name you chose in Step 17:



Build/Run the Project

Build/Run the project by pressing the "Make and Program Device" button.

You will first see “Initializing…” text on the LCD display, indicating the initialization of the BM71 parameters, as well as verification of correct BM71 firmware version (1.06).

On Success, the LCD should display the device name, the last four bytes of the MAC address, as well as a stopwatch display


LED_D3 should also blip two times per second indicating an advertising state


PIC24 Demo Startup Troubleshooting

LCD reads “Initiallize Error” - this results upon the host MCU not receiving any response to Read Information command, or an invalid BM71 fw version is read (not v1.06)

Possible Causes:

  • Incorrect PICTail jumper settings—review Step 18.
  • Incorrect BM71 firmware—reprogram with v1.06.
  • Incorrect BM71 configuration—re-load your saved BM71 UI configuration file and verify correct settings as described in steps 1 thru 15. Re-create the BM71 EEPROM Configuration Table.

Sanity Check:
To verify basic functionality of the module, you can revert the PICTail jumpers J3, J1 for standalone operation (as shown) and use the Manual Pattern Test Tool.

Note: You may need to Jumper UART_RX_IND to GND before the tool will be able to communicate as shown here.


Interact With The Service using the Stopwatch App

You will need to research the specific details for installation of .apk application files on your Android device.

Generally, you connect your phone to the PC using the USB cable that came with it, then transfer the .apk file over to the device. Next, go to the "Security" settings, and enable installation of Apps from "sources other than the Play Store". Finally, simply locate and tap on the .apk file to install it.

After installing the app, go to security settings and disable "installation of Apps from sources other than the Play Store"


Start The App, Scan for Stopwatch Devices, Select Device

Start the "Stopwatch" App on your smartphone:


Tap on "SCAN" to begin scanning for devices as shown:


Locate and Tap on your device to establish a connection to it. The Explorer16 LCD should indicate connected status. In addition, you should see Explorer16 LED_D3 latch to an ON-state indicating a connected state:



Interact With The Service

Once connected, you will be taken to the main activity page for the app.

Press “Start” to start the stopwatch from the App.

Press Explorer16 switch S3 to Start/Stop the display. Press S6 to Reset.

The History window will show track these events as shown:


Demo Not Working?

Device is connected, however, you cannot start the stopwatch from the app, or you do not receive any updates from the Explorer16 when pressing S3/S6 buttons

Most likely cause is a mismatch between the characteristic handle values in the BM71 GATT Service Table, vs what is encoded in the PIC24 firmware.

In MPLAB X IDE, open file definitions.h, and scroll to line 106. Here is where we define the Handle IDs for each characteristic we want to update in our application:


In particular, note the two handles circled. The first is the writable characteristic “Stopwatch Control Point” (0x8002), the second is the notify characteristic “Stopwatch Status” (0x8004).

The Handle values for these two characteristics need to match those generated by the UI Configuration tool (see Step 12):



  • Private GATT Services are easily created on the BM71 using the UI Configuration tool.
  • The BM7x EEPROM Table Utility is used to convert a UI Configuration file to an EEPROM Table that can be embedded into your project, simplifying production deployment.
  • The MCU Host must capture BLE connection parameters (including Connection Handle) to be able to modify characteristic values in the BM71.
  • Care must be taken to embed the correct characteristic handles generated by the tool into the embedded host code.
© 2020 Microchip Technology, Inc.
Notice: ARM and Cortex are the registered trademarks of ARM Limited in the EU and other countries.
Information contained on this site regarding device applications and the like is provided only for your convenience and may be superseded by updates. It is your responsibility to ensure that your application meets with your specifications. MICROCHIP MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND WHETHER EXPRESS OR IMPLIED, WRITTEN OR ORAL, STATUTORY OR OTHERWISE, RELATED TO THE INFORMATION, INCLUDING BUT NOT LIMITED TO ITS CONDITION, QUALITY, PERFORMANCE, MERCHANTABILITY OR FITNESS FOR PURPOSE. Microchip disclaims all liability arising from this information and its use. Use of Microchip devices in life support and/or safety applications is entirely at the buyer's risk, and the buyer agrees to defend, indemnify and hold harmless Microchip from any and all damages, claims, suits, or expenses resulting from such use. No licenses are conveyed, implicitly or otherwise, under any Microchip intellectual property rights.