.. _96b_carbon_board:

96Boards Carbon
###############

Overview
********

The 96Boards is based on the STMicroelectronics STM32F401RET Cortex-M4 CPU and
also contains a nRF51822 chip connected over SPI for BLE connectivity.

The 96Boards Carbon board is built with two chips: an STMicroelectronics
STM32F401RET Cortex-M4 CPU and an nRF51822 chip connected to
the Cortex-M4 CPU over SPI for Bluetooth LE connectivity.  Even though
both chips exist on the same physical board, they must be programmed
separately:

- The ``96b_carbon/stm32f401xe`` configuration is used when developing programs for
  the main chip on the board, the STM32F401RET. Users will likely want to
  write applications targeting this chip, using the ``96b_carbon``
  configuration, since it is connected to all of the breakout
  I/O headers.

- The ``96b_carbon/nrf51822`` configuration should be used for programming
  the secondary nRF51822 chip. Most users will likely not develop
  applications for this chip, since Zephyr already provides a
  sample application that can be flashed onto the nRF51822
  to provide Bluetooth functionality to applications on the main
  STM32F401RET chip.

For instructions on how to set up the nRF51822 to develop Bluetooth
applications, see :ref:`96b_carbon_nrf51_bluetooth`.

After you have flashed your nRF51, you can perform basic validation
of this Bluetooth setup using the instructions
:ref:`below <96b_carbon_verify_bluetooth>`.

.. figure:: img/96b_carbon.jpg
     :align: center
     :alt: 96Boards Carbon

     96Boards Carbon

Hardware
********

96Boards Carbon provides the following hardware components:

- STM32F401RET6 in LQFP64 package
- ARM |reg| 32-bit Cortex |reg|-M4 CPU with FPU
- 84 MHz max CPU frequency
- VDD from 1.7 V to 3.6 V
- 512 KB Flash
- 96 KB SRAM
- GPIO with external interrupt capability
- 12-bit ADC with 16 channels
- RTC
- Advanced-control Timer
- General Purpose Timers (7)
- Watchdog Timers (2)
- USART/UART (4)
- I2C (3)
- SPI (3)
- SDIO
- USB 2.0 OTG FS
- DMA Controller
- Bluetooth LE over SPI, provided by nRF51822

More information about STM32F401RE can be found here:

- `STM32F401RE on www.st.com`_
- `STM32F401 reference manual`_

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

The Zephyr ``96b_carbon/stm32f401xe`` board configuration supports the following
hardware features:

+------------+------------+-------------------------------------+
| Interface  | Controller | Driver/Component                    |
+============+============+=====================================+
| NVIC       | on-chip    | nested vector interrupt controller  |
+------------+------------+-------------------------------------+
| SYSTICK    | on-chip    | system clock                        |
+------------+------------+-------------------------------------+
| UART       | on-chip    | serial port                         |
+------------+------------+-------------------------------------+
| GPIO       | on-chip    | gpio                                |
+------------+------------+-------------------------------------+
| PINMUX     | on-chip    | pinmux                              |
+------------+------------+-------------------------------------+
| FLASH      | on-chip    | flash                               |
+------------+------------+-------------------------------------+
| SPI        | on-chip    | spi                                 |
+------------+------------+-------------------------------------+
| I2C        | on-chip    | i2c                                 |
+------------+------------+-------------------------------------+
| USB OTG FS | on-chip    | USB device                          |
+------------+------------+-------------------------------------+

More details about the board can be found at `96Boards website`_.

The default configuration can be found in
:zephyr_file:`boards/96boards/carbon/96b_carbon_stm32f401xe_defconfig`

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

LED
---

- LED1 / User1 LED = PD2
- LED2 / User2 LED = PA15
- LED3 / BT LED = PB5
- LED4 / Power LED = VCC

Push buttons
------------

- BUTTON = BOOT0 (SW1)
- BUTTON = RST

External Connectors
-------------------

Low Speed Header

+--------+-------------+----------------------+
| PIN #  | Signal Name | STM32F401 Functions  |
+========+=============+======================+
| 1      | UART2_CTS   | PA0                  |
+--------+-------------+----------------------+
| 3      | UART2_TX    | PA2                  |
+--------+-------------+----------------------+
| 5      | UART2_RX    | PA3                  |
+--------+-------------+----------------------+
| 7      | UART2_RTS   | PA1                  |
+--------+-------------+----------------------+
| 9      | GND         | GND                  |
+--------+-------------+----------------------+
| 11     | USB5V       | USB5V                |
+--------+-------------+----------------------+
| 13     | AIN12       | PC2                  |
+--------+-------------+----------------------+
| 15     | AIN14       | PC4                  |
+--------+-------------+----------------------+
| 17     | UART6_TX    | PC6                  |
+--------+-------------+----------------------+
| 19     | GPIO        | PC8                  |
+--------+-------------+----------------------+
| 21     | I2C1_SCL    | PB6                  |
+--------+-------------+----------------------+
| 23     | I2C1_SCA    | PB7                  |
+--------+-------------+----------------------+
| 25     | I2C2_SCA    | PB3                  |
+--------+-------------+----------------------+
| 27     | I2C2_SCL    | PB10                 |
+--------+-------------+----------------------+
| 29     | RST_BTN     | RST_BTN              |
+--------+-------------+----------------------+

+--------+-------------+----------------------+
| PIN #  | Signal Name | STM32F401 Functions  |
+========+=============+======================+
| 2      | SPI2_SS     | PB12                 |
+--------+-------------+----------------------+
| 4      | SPI2_MOSI   | PB15                 |
+--------+-------------+----------------------+
| 6      | SPI2_MISO   | PB14                 |
+--------+-------------+----------------------+
| 8      | SPI2_SCK    | PB13                 |
+--------+-------------+----------------------+
| 10     | GND         | GND                  |
+--------+-------------+----------------------+
| 12     | VCC2        | VCC2                 |
+--------+-------------+----------------------+
| 14     | AIN13       | PC3                  |
+--------+-------------+----------------------+
| 16     | AIN15       | PC5                  |
+--------+-------------+----------------------+
| 18     | UART6_RX    | PC7                  |
+--------+-------------+----------------------+
| 20     | GPIO        | PC9                  |
+--------+-------------+----------------------+
| 22     | I2C1_SCL    | PB8                  |
+--------+-------------+----------------------+
| 24     | I2C1_SDA    | PB9                  |
+--------+-------------+----------------------+
| 26     | AIN10       | PC0                  |
+--------+-------------+----------------------+
| 28     | AIN11       | PC1                  |
+--------+-------------+----------------------+
| 30     | NC          | NC                   |
+--------+-------------+----------------------+

More detailed information about the connectors can be found in
`96Boards IE Specification`_.

External Clock Sources
----------------------

STM32F4 has two external oscillators. The frequency of the slow clock is
32.768 kHz. The frequency of the main clock is 16 MHz.

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

96Boards Carbon board has up to 4 U(S)ARTs. The Zephyr console output is
assigned to USART1. Default settings are 115200 8N1.

I2C
---

96Boards Carbon board has up to 2 I2Cs. The default I2C mapping for Zephyr is:

- I2C1_SCL : PB6
- I2C1_SDA : PB7
- I2C2_SCL : PB10
- I2C2_SDA : PB3

SPI
---

96Boards Carbon board has up to 2 SPIs. SPI1 is used for Bluetooth communication
over HCI. The default SPI mapping for Zephyr is:

- SPI1_NSS  : PA4
- SPI1_SCK  : PA5
- SPI1_MISO : PA6
- SPI1_MOSI : PA7
- SPI2_NSS  : PB12
- SPI2_SCK  : PB13
- SPI2_MISO : PB14
- SPI2_MOSI : PB15

USB
===

96Boards Carbon board has a USB OTG dual-role device (DRD) controller that
supports both device and host functions through its mini "OTG" USB connector.
Only USB device functions are supported in Zephyr at the moment.

- USB_DM : PA11
- USB_DP : PA12

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

There are 2 main entry points for flashing STM32F4X SoCs, one using the ROM
bootloader, and another by using the SWD debug port (which requires additional
hardware). Flashing using the ROM bootloader requires a special activation
pattern, which can be triggered by using the BOOT0 pin. The ROM bootloader
supports flashing via USB (DFU), UART, I2C and SPI. You can read more about
how to enable and use the ROM bootloader by checking the application
note `AN2606`_, page 109.

Flashing
========

Installing dfu-util
-------------------

It is recommended to use at least v0.8 of `dfu-util`_. The package available in
debian/ubuntu can be quite old, so you might have to build dfu-util from source.

Flashing an Application to 96Boards Carbon
------------------------------------------

Connect the micro-USB cable to the USB OTG Carbon port and to your computer.
The board should power ON. Force the board into DFU mode by keeping the BOOT0
switch pressed while pressing and releasing the RST switch.

Confirm that the board is in DFU mode:

.. code-block:: console

   $ sudo dfu-util -l
   dfu-util 0.8
   Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc.
   Copyright 2010-2014 Tormod Volden and Stefan Schmidt
   This program is Free Software and has ABSOLUTELY NO WARRANTY
   Please report bugs to dfu-util@lists.gnumonks.org
   Found DFU: [0483:df11] ver=2200, devnum=15, cfg=1, intf=0, alt=3, name="@Device Feature/0xFFFF0000/01*004 e", serial="3574364C3034"
   Found DFU: [0483:df11] ver=2200, devnum=15, cfg=1, intf=0, alt=2, name="@OTP Memory /0x1FFF7800/01*512 e,01*016 e", serial="3574364C3034"
   Found DFU: [0483:df11] ver=2200, devnum=15, cfg=1, intf=0, alt=1, name="@Option Bytes /0x1FFFC000/01*016 e", serial="3574364C3034"
   Found DFU: [0483:df11] ver=2200, devnum=15, cfg=1, intf=0, alt=0, name="@Internal Flash /0x08000000/04*016Kg,01*064Kg,03*128Kg", serial="3574364C3034"
   Found Runtime: [05ac:8290] ver=0104, devnum=2, cfg=1, intf=5, alt=0, name="UNKNOWN", serial="UNKNOWN"

You should see following confirmation on your Linux host:

.. code-block:: console

   $ dmesg
   usb 1-2.1: new full-speed USB device number 14 using xhci_hcd
   usb 1-2.1: New USB device found, idVendor=0483, idProduct=df11
   usb 1-2.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
   usb 1-2.1: Product: STM32 BOOTLOADER
   usb 1-2.1: Manufacturer: STMicroelectronics
   usb 1-2.1: SerialNumber: 3574364C3034

Then build and flash an application. Here is an example for the
:zephyr:code-sample:`hello_world` application.

.. zephyr-app-commands::
   :zephyr-app: samples/hello_world
   :board: 96b_carbon/stm32f401xe
   :goals: build flash

Connect the micro-USB cable to the USB UART (FTDI) port and to your computer.
Run your favorite terminal program to listen for output.

.. code-block:: console

   $ minicom -D <tty_device> -b 115200

Replace :code:`<tty_device>` with the port where the board 96Boards Carbon
can be found. For example, under Linux, :code:`/dev/ttyUSB0`.
The ``-b`` option sets baud rate ignoring the value from config.

Press the Reset button and you should see the following message in your
terminal:

.. code-block:: console

   Hello World! arm

.. _96b_carbon_verify_bluetooth:

Verifying Bluetooth Functionality
---------------------------------

This section contains instructions for verifying basic Bluetooth
functionality on the board. For help on Zephyr applications
in general, see :ref:`build_an_application`.

1. Flash the nRF51 with the hci_spi sample application as described in
   :ref:`96b_carbon_nrf51_bluetooth`.

#. Install the dfu-util flashing app, as described above.

#. Build and flash the ``samples/bluetooth/peripheral_hr`` application for
   96b_carbon. See the instructions above for how to put your board
   into DFU mode if you haven't done this before:

   .. zephyr-app-commands::
      :zephyr-app: samples/bluetooth/peripheral_hr
      :board: 96b_carbon/stm32f401xe
      :goals: build flash

#. Refer to the instructions in :zephyr:code-sample:`ble_peripheral_hr` for how
   to verify functionality.

Congratulations! Your 96Boards Carbon now has Bluetooth
connectivity. Refer to :ref:`bluetooth` for additional information on
further Bluetooth application development.

Debugging
=========

The ``96b_carbon/stm32f401xe`` board can be debugged by installing a 100 mil (0.1 inch) header
into the header at the bottom right hand side of the board, and
attaching an SWD debugger to the 3V3 (3.3V), GND, CLK, DIO, and RST
pins on that header. Then apply power to the 96Boards Carbon via one
of its USB connectors. You can now attach your debugger to the
STM32F401RET using an SWD scan.

.. _dfu-util:
   http://dfu-util.sourceforge.net/build.html

.. _AN2606:
   https://www.st.com/content/ccc/resource/technical/document/application_note/b9/9b/16/3a/12/1e/40/0c/CD00167594.pdf/files/CD00167594.pdf/jcr:content/translations/en.CD00167594.pdf

.. _96Boards website:
   http://www.96boards.org/documentation

.. _STM32F401RE on www.st.com:
   https://www.st.com/en/microcontrollers/stm32f401re.html

.. _STM32F401 reference manual:
   https://www.st.com/resource/en/reference_manual/dm00096844.pdf

.. _96Boards IE Specification:
    https://linaro.co/ie-specification
