Using low cost Bluepill (STM32F103C8T6) boards with mbed.
Dependents: STM32F103C8T6_Chicharronera_4CV2 STM32F103C8T6_Portada
STM32F103C8T6 board, alias Bluepill
It provides an affordable (about $2 on eBay) and flexible way for users to try out new ideas and build prototypes. The board is equipped with an STM32F103C8T6 microcontroller compatible with the NUCLEO-F103RB platform.
Microcontroller features
- STM32F103C8T6 in LQFP48 package
- ARM®32-bit Cortex®-M3 CPU
- 72 MHz max CPU frequency
- VDD from 2.0 V to 3.6 V
- 64 KB Flash
- 20 KB SRAM
- GPIO (32) with external interrupt capability
- 12-bit ADC (2) with 10 channels
- RTC
- Timers (4)
- I2C (2)
- USART (3)
- SPI (2)
- USB 2.0 full-speed
- CAN
Board features
- Small foot-print
- Flexible board power supply: USB VBUS or external source (3.3V, 5V)
- User LED: LED1
- One push button: RESET
- Programming/Debug port
- Micro-B USB connector
Board pinout
Zoom in
Maximum allowed I/O voltage levels (next to pin names) are courtesy of Thor Sten to help you avoid board damage. For more details on pin definitions see Table 5 in the Datasheet.
Information
Only the labels printed in blue/white or green/white (i.e. PC_13, PB_9, A0, D14 ...) must be used in your code. The other labels are given as information (alternate-functions, power pins, ...). You can also use these additional pin names:
LED1=PC_13 SERIAL_TX=PA_2 I2C_SCL=PB_8 SPI_MOSI=PA_7 PWM_OUT=PB_3 SERIAL_RX=PA_3 I2C_SDA=PB_9 SPI_MISO=PA_6 SPI_SCK =PA_5 SPI_CS =PB_6
Please notice that in order to fit the small size board, the leading 'P' and the '_' characters are omitted from labels indicated on the board (e.g. Instead of 'PA_1' you can find the label 'A1' on the board). Arduino (green/white) and the additional naming labels are not indicated on the board.
Also notice that the on-board LED is connected to pin PC_13 and, via a resistor, to +3.3V. So to turn the LED on
or off
you have to set the DigitalOut to 0
or 1
respectively.
Schematic
Eagle CAD library
Schematic | Board |
---|---|
Because neither lbr
nor zip
files can be uploaded to mbed wiki pages anymore, to download the Eagle CAD library right-click on the following link eagle library and select Save link as...
. Once saved to your local drive, change the extension from png
to lbr
.
Using the mbed online compiler to build programs for the STM32F103C8T6 board
Create a program as if it was for a NUCLEO-F103RB board (select NUCLEO-F103RB as target platform for the online compiler).
Or click here to import this demo into your online compiler.
Blinking on-board LED:
#include "mbed.h" Serial pc(PA_2, PA_3); // TX, RX DigitalOut myled(PC_13); // on-board LED int main() { while(1) { // The on-board LED is connected via a resistor to +3.3V (not to GND). // So the LED is active on 0 myled = 0; // turn the LED on wait_ms(200); // wait 200 millisecond myled = 1; // turn the LED off pc.printf("Blink\r\n"); wait_ms(1000); // wait 1000 millisecond } }
Warning
Keep in mind that the online compiler is checking for 128kB maximum flash size. However, the STM32F103C8T6 is equipped with only 64kB. Although it seems that majority of Blue Pill boards sold online usually feature 128kB Flash rather than 64kB. Once the compilation is complete (started by clicking on the Build only button in the Compile drop list or by pressing Ctrl+B) you can visually check the size of used flash memory in the Program details - Build tab. In order to fit into an STM32F103C8T6 board the used Flash should not exceed 64kB (depending on your actual board). Try to optimize your program until it's using less than 64kB flash memory. Have a look at mbed-STM32F030F4 and Andy's hints for some good tips.
Programming the STM32F103C8T6 board
NUCLEO ST-LINK/V2-1 and drag & drop
You can use the NUCLEO virtual disk to program the STM32F103C8T6 board (drag and drop programming). To do that, an additional NUCLEO board is needed (any type equipped with ST-LINK/V2-1 will do).
- Remove the two jumpers from the CN2 connector as illustrated in Figure 8:
- Connect the NUCLEO board CN4 connector to the STM32F103C8T6 board using flying wires as follows:
NUCLEO board CN4 connector | STM32F103C8T6 debug connector | STM32F103C8T6 board | |||||
---|---|---|---|---|---|---|---|
SWCLK | <=> | DCLK | |||||
GND | <=> | GND | |||||
SWDIO | <=> | DIO | |||||
NRST | <=> | RESET |
Warning
Please notice that VDD_TARGET
is not connected. That works with the ST-Link programmer but could potentially damage the target micro controller in case it's running at a lower voltage (e.g. 2V5) than the programmer (e.g. 3V3). That's why it's recommended to connect also the VDD_TARGET
line when an external programmer such as a Segger J-Link is hooked up to program the board.
- Provide power for the STM32F103C8T6 board through a 3.3V pin, 5V pin or over a USB cable. (The VDD_TARGET pin on the NUCLEO board CON4 does not work as source of power).
- Connect the NUCLEO board to your PC over a USB cable.
- To program the STM32F103C8T6 board, click on the Compile button and save the binary to the NUCLEO virtual disk .
For more details have a look at the User Manual, chapter 6.2.4 Using ST-LINK/V2-1 to program and debug an external STM32 application.
ST-Link V2 USB dongle and STM32 ST-LINK utility
If you would like to use an ST-Link V2 USB dongle (aka ST-Link V2 Programming Unit) to program the board apply the same wiring as specified above. If not done yet install an ST-Link/V2 driver onto your PC. Plug the ST-Link V2 dongle into your PC. Then click on the Compile
button and save the binary to your local disk. Install and run the STM32 ST-LINK utility. Once the program is running open the binary built with the online compiler and click on the Program verify
button.
STM32 USART system memory bootloader and Flasher-STM32
Have a look at STM32 Embedded Bootloader.
Download: FLASHER-STM32
For more details read:
Appliction Note AN2606.
Using serial port (not just for debugging)
- Connect an FTDI or similar USB to Serial TTL converter to your PC and to an on-board serial port (for example PA_2, PA_3). Make sure you connect the on-board TX pin to the converter's RX pin and the on-board RX pin to the converter's TX pin.
- In your code, create a
Serial
object (using TX and RX pin names of the connected serial port).
- Use
printf
function to send serial messages to the connected PC.
Sending debug messages over the ST-Link virtual com port
In case you would like to spare the external USB-Serial converter for other purposes then there is available an alternative solution proposed by X M (bitman). You can use the ST-Link virtual com port also for debugging of programs running on the STM32F103C8T6 board. However, that will require a soldering iron (and probably some soldering skills). According to the User Manual, chapter 6.8 "USART communication", solder bridges (on the back side of the NUCLEO board) SB62 and SB63 should be ON, SB13 and SB14 should be OFF. In such case it is possible to connect another USART to the NUCLEO (ST-Link) CN3 connector using flying wires. For instance on STM32F103C8T6 board it is possible to use USART2 available on PA_2 (TX) and PA_3 (RX). Two flying wires shall be connected as follows:
STM32F103C8T6 board, pin PA_2 (Serial2 TX) | <=> | NUCLEO board CN3 connector, pin RX |
STM32F103C8T6 board, pin PA_3 (Serial2 RX) | <=> | NUCLEO board CN3 connector, pin TX |
A smart trick proposed by Nothing Special makes even soldering needless.
The point is to redirect the UART on the NUCLEO board by software (without modifying the solder bridges on the back side of the NUCLEO board) and convert it into a "Debugger". On the NUCLEO board that you are going to use as programmer/ debugger, choose any Serial port other than Serial2 (other than the default port used for standard UART) to be initialized as standard UART. In the program below (using NUCLEO-F103RB as programmer/debugger) Serial1 (PA_9, PA_10) was selected.
Debugger
#include "mbed.h" // declarations needed to change the parameters of stdio UART extern serial_t stdio_uart; extern int stdio_uart_inited; int main() { serial_init(&stdio_uart, PA_9, PA_10); // other than Serial2 stdio_uart_inited = 1; printf("Ready for debugging\r\n"); }
Once compiled (remember to select the NUCLEO board used for programing/debugging as target for the online compiler), download the "Debugger" program to the NUCLEO board. Please make sure you have the two jumpers in place on the CN2 connector when programming the NUCLEO board. Once the "Debugger" binary has been downloaded to the NUCLEO board, remove the two jumpers again.
Additional examples
- Reading analog input
- DS1820 temperature sensor
- Driving Text LCD
- Driving Nokia 5110 LCD
- Driving ILI9341 TFT Display
- A USB serial device
- CAN bus with mbed boards
- Tiny HTTP server with ENC28J60 Ethernet module
- Using SD Card
- Jogpad for the Mach 3 CNC control software
- How to turn kids' old piano toy to a MIDI keyboard
Working offline
- The Mbed Studio IDE is a great tool for working offline. It supports Mbed OS 5 (with built-in Mbed RTOS threads, mutexes, semafores ...) and also Mbed OS 5 Bare metal profile (no RTOS, similar to Mbed OS 2) which is suitable for small or medium size projects requiring less RAM and Flash. To use it, add a
mbed_app.json
configuration file to your project:
med_app.json
{ "requires": ["bare-metal"] }
- Another alternative is to stay with Mbed 2 (aka Mbed classic) and use the QtCreator IDE for building offline.
Works great on Linux (Ubuntu) and MS Windows. It's fully integrated with Mbed CLI and supprots all the Mbed enabled targets. To build for the Blue Pill you can select BLUEPILL_F103C8
or NUCLEO_F103RB
as your target, depending on the Flash size actually available on your Blue Pill board. To reduce the size of used static RAM and Flash try to select the small
library for your project rather than the standard
one. That can be achieved by modifying the mbed_app.json
file (Ctrl+O) as below:
med_app.json
{ "target_overrides": { "*": { "target.default_lib": "small" } } }
For more details visit Building offline with QtCreator IDE.
Happy coding :-)
History
Updated.
2019-02-05, by hudakz [Tue, 05 Feb 2019 08:30:37 +0000] rev 13
Updated.
Updated.
2019-02-05, by hudakz [Tue, 05 Feb 2019 08:00:50 +0000] rev 12
Updated.
Updated mbed library.
2017-06-26, by hudakz [Mon, 26 Jun 2017 13:53:25 +0000] rev 11
Updated mbed library.
Updated.
2016-09-15, by hudakz [Thu, 15 Sep 2016 18:40:03 +0000] rev 10
Updated.
Updated.
2016-08-13, by hudakz [Sat, 13 Aug 2016 11:56:02 +0000] rev 9
Updated.
Updated
2016-08-02, by hudakz [Tue, 02 Aug 2016 19:42:17 +0000] rev 8
Updated
Updated
2016-07-05, by hudakz [Tue, 05 Jul 2016 18:57:42 +0000] rev 7
Updated
Updated
2016-07-05, by hudakz [Tue, 05 Jul 2016 18:24:49 +0000] rev 6
Updated
Udpated
2016-07-05, by hudakz [Tue, 05 Jul 2016 18:21:02 +0000] rev 5
Udpated
Updated.
2016-07-02, by hudakz [Sat, 02 Jul 2016 08:25:56 +0000] rev 4
Updated.