diff --git a/boards/common/blxxxpill/doc.txt b/boards/common/blxxxpill/doc.txt
index 7004a61bef..a40f225453 100644
--- a/boards/common/blxxxpill/doc.txt
+++ b/boards/common/blxxxpill/doc.txt
@@ -13,10 +13,10 @@ There are also versions that only report to have 32 KiB, but actually have
64 KiB.
-## Hardware
+## Pinout
+
+![pinout](pinouts/pinout-bluepill.svg)
-![bluepill]
-(https://camo.githubusercontent.com/6122268d77e4677a08d0e13e2e2aaf070a0a6a69/687474703a2f2f73312e62696c642e6d652f62696c6465722f3131303431372f38383135303232313438363837343334302e6a7067)
### MCU
| MCU | STM32F103C8 |
diff --git a/boards/common/blxxxpill/doc/README.md b/boards/common/blxxxpill/doc/README.md
new file mode 100644
index 0000000000..a10341a73d
--- /dev/null
+++ b/boards/common/blxxxpill/doc/README.md
@@ -0,0 +1,6 @@
+Pinout Generation
+=================
+
+[GenPinoutSVG](https://github.com/stevenj/GenPinoutSVG) was used to generate
+the Pinout diagram. The only post-processing applied was cropping the SVG to its
+contents.
diff --git a/boards/common/blxxxpill/doc/bluepill-top-view.svg b/boards/common/blxxxpill/doc/bluepill-top-view.svg
new file mode 100644
index 0000000000..9054da9002
--- /dev/null
+++ b/boards/common/blxxxpill/doc/bluepill-top-view.svg
@@ -0,0 +1,4096 @@
+
+
diff --git a/boards/common/blxxxpill/doc/pinout-bluepill.csv b/boards/common/blxxxpill/doc/pinout-bluepill.csv
new file mode 100644
index 0000000000..03b094fe56
--- /dev/null
+++ b/boards/common/blxxxpill/doc/pinout-bluepill.csv
@@ -0,0 +1,122 @@
+LABELS,DEFAULT,TYPE,GROUP,Name, Official Name, GPIO, Analog 1, Analog 2, RTC, Func 1, Func 2, Func 3
+BORDER COLOR, grey
+BORDER WIDTH, 2
+BORDER OPACITY, 1
+FILL COLOR, white, white, white, deepskyblue, gray, green, purple, yellow, orange, red, gold, brown
+OPACITY, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
+FONT , Rubik, , , Work Sans, Work Sans
+FONT SIZE , 25, , , 25, 25
+FONT COLOR , black, , , , , white
+FONT SLANT , normal , , , , ,
+FONT BOLD , 700 , , , 700
+FONT STRETCH , normal
+FONT OUTLINE , yellow , , , , blue
+FONT OUTLINE THICKNESS, 0.1
+BOXES, STD, , , PIN BOX, NAME BOX, SKEWED, SKEWED, SKEWED, SKEWED, SKEWED, SKEWED, SKEWED
+
+TYPE, IO, black, 1
+TYPE, INPUT, black, 1
+TYPE, OUTPUT, black, 1
+
+WIRE, DIGITAL, black, 1, 5
+WIRE, PWM, black, 1, 5
+WIRE, ANALOG, black, 1, 5
+WIRE, POWER, black, 1, 10
+
+GROUP, NONE, grey, 0.1
+
+BOX, STD, black, 1, white, 0, 1, 100,55,2,2,0,0
+BOX, PIN BOX, black, 1, white, 0, 1, 80, 55, 5, 5, -10, 0
+BOX, NAME BOX, black, 1, white, 0, 1, 125, 55, 5, 5, -10, 0
+BOX, SKEWED, black, 1, white, 0, 1, 125,55,5,5,-10,0
+BOX, PAGE BORDER, black, 1, white, 1, 50, 100,100,0,0,0,0
+BOX, DETAIL BOX, darkblue, 1, white, 0, 3, 250, 200, 15,15,0,0
+
+PAGE, A4-L
+DPI, 300
+
+DRAW
+
+# Add image of board
+ICON, bluepill-top-view.svg, 880, 908, 100%, 100%
+
+BOX, DETAIL BOX, 1800, 100, 1100, 300, , TOP, "Legend"
+ANCHOR, 1820,140
+PINSET, RIGHT, PACKED, CENTER, CENTER, 74.75, 30, 45, 60, 10, 0
+# wire, type, group, pin-name, comment, analog, PWM, SPI, I2C, POWER, UART, QDEC
+PIN, DIGITAL, INPUT, NONE, , Input
+PIN, DIGITAL, OUTPUT, NONE, , Output
+PIN, DIGITAL, IO, NONE, , "I/O"
+ANCHOR, 2220,140
+PINSET, RIGHT, PACKED, CENTER, CENTER, 74.75, 30, 45, 60, 10, 0
+PIN, ANALOG, IO, NONE, , , Analog
+PIN, PWM, IO, NONE, , , , PWM
+PIN, DIGITAL, IO, NONE, , , , , SPI
+ANCHOR, 2640,140
+PINSET, RIGHT, PACKED, CENTER, CENTER, 74.75, 30, 45, 60, 10, 0
+PIN, DIGITAL, IO, NONE, , , , , , I2C
+PIN, DIGITAL, IO, NONE, , , , , , , , UART
+PIN, POWER, IO, NONE, , , , , , , Power
+
+BOX, DETAIL BOX, 1800, 500, 1100, 220, , TOP, "Internally Connected to ADC"
+ANCHOR, 1820,540
+PINSET, RIGHT, PACKED, CENTER, CENTER, 74.75, 30, 45, 60, 10, 0
+# wire, type, group, pin-name, comment, analog, PWM, SPI, I2C, POWER, UART, QDEC
+PIN, ANALOG, IO, NONE, NTC, , "A6"
+PIN, ANALOG, IO, NONE, VREF, , "A7"
+
+BOX, DETAIL BOX, 1800, 800, 1100, 220, , TOP, "Default Interface for STDIO"
+MESSAGE, 1820, 860, 48, Name, 36, LEFT, TOP
+TEXT, none, black, "UART for STM32F103C8 (64 KiB flash)", NL
+TEXT, none, black, "USB for STM32F103CB (128 KiB flash)", NL
+
+# Left Side Pins
+ANCHOR, 520,170
+PINSET, LEFT, PACKED, CENTER, CENTER, 74.75, 30, 45, 60, 10, 0
+
+# wire, type, group, pin-name, comment, analog, PWM, SPI, I2C, POWER, UART, QDEC
+PIN, ANALOG, INPUT, NONE, , "VAT"
+PIN, DIGITAL, OUTPUT, NONE, "PC 13", "LED1"
+PIN, DIGITAL, IO, NONE, "PC 14"
+PIN, DIGITAL, IO, NONE, "PC 15"
+PIN, ANALOG, IO, NONE, "PA 0", , "A0"
+PIN, DIGITAL, IO, NONE, "PA 1", , "A1"
+PIN, DIGITAL, OUTPUT, NONE, "PA 2", , , , , , , "TX1"
+PIN, DIGITAL, INPUT, NONE, "PA 3", , , , , , , "RX1"
+PIN, DIGITAL, OUTPUT, NONE, "PA 4", , "A2", , "CS1"
+PIN, DIGITAL, OUTPUT, NONE, "PA 5", , "A3", , "SCLK1"
+PIN, DIGITAL, INPUT, NONE, "PA 6", , "A4", , "MISO1"
+PIN, DIGITAL, OUTPUT, NONE, "PA 7", , "A5", , "MOSI1"
+PIN, PWM, OUTPUT, NONE, "PB 0", , "A8", "PWM2"
+PIN, PWM, OUTPUT, NONE, "PB 1", , "A9", "PWM3"
+PIN, DIGITAL, OUTPUT, NONE, "PB 10", , , , , "SCL1", , "TX2"
+PIN, DIGITAL, INPUT, NONE, "PB 11", , , , , "SDA1", , "RX2"
+PIN, DIGITAL, INPUT, NONE, , "RESET"
+PIN, POWER, OUTPUT, NONE, , , , , , , "+3.3V"
+PIN, POWER, OUTPUT, NONE, , , , , , , "GND"
+PIN, POWER, OUTPUT, NONE, , , , , , , "GND"
+
+# Right Side Pins
+ANCHOR, 1235,170
+PINSET, RIGHT, PACKED, CENTER, CENTER, 74.75, 30, 45, 60, 10, 0
+# wire, type, group, pin-name, comment, analog, PWM, SPI, I2C, POWER, UART, QDEC
+PIN, POWER, OUTPUT, NONE, , , , , , , "+3.3V"
+PIN, POWER, OUTPUT, NONE, , , , , , , "GND"
+PIN, POWER, OUTPUT, NONE, , , , , , , "+5V"
+PIN, DIGITAL, IO, NONE, "PB 9", , , , , "SDA0"
+PIN, DIGITAL, IO, NONE, "PB 8", , , , , "SCL0"
+PIN, DIGITAL, INPUT, NONE, "PB 7", , , , , , , , "QDEC0-B"
+PIN, DIGITAL, INPUT, NONE, "PB 6", , , , , , , , "QDEC0-A"
+PIN, PWM, OUTPUT, NONE, "PB 5", , , "PWM1"
+PIN, PWM, IO, NONE, "PB 4", , , "PWM0", , , , , "QDEC1-A"
+PIN, DIGITAL, INPUT, NONE, "PB 3", , , , , , , , "QDEC1-B"
+PIN, DIGITAL, IO, NONE, "PA 15"
+PIN, DIGITAL, IO, NONE, "PA 12", "USB D+\\nstdio"
+PIN, DIGITAL, IO, NONE, "PA 11", "USB D-\\nstdio"
+PIN, DIGITAL, OUTPUT, NONE, "PA 10", "stdio", , , , , , "TX0"
+PIN, DIGITAL, INPUT, NONE, "PA 9", "stdio", , , , , , "RX0", "QDEC2-A"
+PIN, DIGITAL, IO, NONE, "PA 8", , , , , , , , "QDEC2-B"
+PIN, DIGITAL, OUTPUT, NONE, "PB 15", , , , "MOSI0"
+PIN, DIGITAL, INPUT, NONE, "PB 14", , , , "MISO0"
+PIN, DIGITAL, OUTPUT, NONE, "PB 13", , , , "SCLK0"
+PIN, DIGITAL, OUTPUT, NONE, "PB 12", , , , "CS0"
diff --git a/boards/common/blxxxpill/include/periph_conf.h b/boards/common/blxxxpill/include/periph_conf.h
index 4a7054d824..607b08d282 100644
--- a/boards/common/blxxxpill/include/periph_conf.h
+++ b/boards/common/blxxxpill/include/periph_conf.h
@@ -61,12 +61,21 @@ static const adc_conf_t adc_config[] = {
{ .pin = GPIO_PIN(PORT_A, 5), .dev = 0, .chan = 5 },
{ .pin = GPIO_PIN(PORT_A, 6), .dev = 0, .chan = 6 },
{ .pin = GPIO_PIN(PORT_A, 7), .dev = 0, .chan = 7 },
- { .pin = GPIO_PIN(PORT_B, 0), .dev = 0, .chan = 8 },
- { .pin = GPIO_PIN(PORT_B, 1), .dev = 0, .chan = 9 },
/* ADC Temperature channel */
{ .pin = GPIO_UNDEF, .dev = 0, .chan = 16 },
/* ADC VREF channel */
{ .pin = GPIO_UNDEF, .dev = 0, .chan = 17 },
+ /* The blackpill has a few pins less. PB0 and PB1 are among the GPIOs not
+ * exposed due to the lower pincount.
+ *
+ * Also, this conflicts with PWM. We prefer PWM over ADC here to provide
+ * 6 external ADC inputs, and 4 PWM outputs (instead of 8 ADC inputs and
+ * 2 PWM outputs). */
+#if !defined(BOARD_BLACKPILL) && !defined(BOARD_BLACKPILL_128KIB) \
+ && !defined(MODULE_PERIPH_PWM)
+ { .pin = GPIO_PIN(PORT_B, 0), .dev = 0, .chan = 8 },
+ { .pin = GPIO_PIN(PORT_B, 1), .dev = 0, .chan = 9 },
+#endif
};
#define ADC_NUMOF ARRAY_SIZE(adc_config)
@@ -134,33 +143,41 @@ static const timer_conf_t timer_config[] = {
*/
static const qdec_conf_t qdec_config[] = {
+ {
+ .dev = TIM4,
+ .max = 0x0000ffff,
+ .rcc_mask = RCC_APB1ENR_TIM4EN,
+ .chan = { { .pin = GPIO_PIN(PORT_B, 6), .cc_chan = 0 },
+ { .pin = GPIO_PIN(PORT_B, 7), .cc_chan = 1 } },
+ .bus = APB1,
+ .irqn = TIM4_IRQn,
+ },
+ /* this conflicts with PWM */
+#ifndef MODULE_PERIPH_PWM
+ {
+ .dev = TIM3,
+ .max = 0x0000ffff,
+ .rcc_mask = RCC_APB1ENR_TIM3EN,
+ .chan = { { .pin = GPIO_PIN(PORT_B, 4), .cc_chan = 0 },
+ { .pin = GPIO_PIN(PORT_B, 5), .cc_chan = 1 } },
+ /* by default TIM3 is routed to PA6 (cc_chan 0) and PA7 (cc_chan 1) */
+ .remap = AFIO_MAPR_TIM3_REMAP_1,
+ .bus = APB1,
+ .irqn = TIM3_IRQn,
+ },
+#endif
+ /* this conflicts with UART_DEV(0) */
+#ifndef MODULE_PERIPH_UART
{
.dev = TIM1,
.max = 0x0000ffff,
.rcc_mask = RCC_APB2ENR_TIM1EN,
- .chan = { { .pin = GPIO_PIN(PORT_A, 8), .cc_chan = 0 },
- { .pin = GPIO_PIN(PORT_A, 9), .cc_chan = 1 } },
+ .chan = { { .pin = GPIO_PIN(PORT_A, 8), .cc_chan = 0 },
+ { .pin = GPIO_PIN(PORT_A, 9), .cc_chan = 1 } },
.bus = APB2,
.irqn = TIM1_UP_IRQn
},
- {
- .dev = TIM3,
- .max = 0x0000ffff,
- .rcc_mask = RCC_APB1ENR_TIM3EN,
- .chan = { { .pin = GPIO_PIN(PORT_A, 6), .cc_chan = 0 },
- { .pin = GPIO_PIN(PORT_A, 7), .cc_chan = 1 } },
- .bus = APB1,
- .irqn = TIM3_IRQn
- },
- {
- .dev = TIM4,
- .max = 0x0000ffff,
- .rcc_mask = RCC_APB1ENR_TIM4EN,
- .chan = { { .pin = GPIO_PIN(PORT_B, 6), .cc_chan = 0 },
- { .pin = GPIO_PIN(PORT_B, 7), .cc_chan = 1 } },
- .bus = APB1,
- .irqn = TIM4_IRQn
- }
+#endif
};
#define QDEC_NUMOF ARRAY_SIZE(qdec_config)
@@ -225,8 +242,8 @@ static const i2c_conf_t i2c_config[] = {
{
.dev = I2C1,
.speed = I2C_SPEED_NORMAL,
- .scl_pin = GPIO_PIN(PORT_B, 6),
- .sda_pin = GPIO_PIN(PORT_B, 7),
+ .scl_pin = GPIO_PIN(PORT_B, 8),
+ .sda_pin = GPIO_PIN(PORT_B, 9),
.bus = APB1,
.rcc_mask = RCC_APB1ENR_I2C1EN,
.clk = CLOCK_APB1,
@@ -256,15 +273,24 @@ static const i2c_conf_t i2c_config[] = {
*/
static const pwm_conf_t pwm_config[] = {
{
- .dev = TIM1,
- .rcc_mask = RCC_APB2ENR_TIM1EN,
- .chan = { { .pin = GPIO_PIN(PORT_A, 8), .cc_chan = 0 },
- { .pin = GPIO_PIN(PORT_A, 9), .cc_chan = 1 },
- { .pin = GPIO_PIN(PORT_A, 10), .cc_chan = 2 },
- { .pin = GPIO_PIN(PORT_A, 11), .cc_chan = 3 } },
+ .dev = TIM3,
+ .rcc_mask = RCC_APB1ENR_TIM3EN,
+ /* by default TIM3 is routed to PA6 (cc_chan 0) and PA7 (cc_chan 1) */
+ .remap = AFIO_MAPR_TIM3_REMAP_1,
+ .chan = {
+ { .pin = GPIO_PIN(PORT_B, 4), .cc_chan = 0 },
+ { .pin = GPIO_PIN(PORT_B, 5), .cc_chan = 1 },
+#if !defined(BOARD_BLACKPILL) && !defined(BOARD_BLACKPILL_128KIB)
+ /* The blackpill has a few pins less. PB0 and PB1 are
+ * among the GPIOs not exposed due to the lower
+ * pincount */
+ { .pin = GPIO_PIN(PORT_B, 0), .cc_chan = 2 },
+ { .pin = GPIO_PIN(PORT_B, 1), .cc_chan = 3 },
+#endif
+ },
.af = GPIO_AF_OUT_PP,
- .bus = APB2
- }
+ .bus = APB1,
+ },
};
#define PWM_NUMOF ARRAY_SIZE(pwm_config)
@@ -275,6 +301,22 @@ static const pwm_conf_t pwm_config[] = {
* @{
*/
static const spi_conf_t spi_config[] = {
+ {
+ .dev = SPI2,
+ .mosi_pin = GPIO_PIN(PORT_B, 15),
+ .miso_pin = GPIO_PIN(PORT_B, 14),
+ .sclk_pin = GPIO_PIN(PORT_B, 13),
+ .cs_pin = GPIO_PIN(PORT_B, 12),
+ .rccmask = RCC_APB1ENR_SPI2EN,
+ .apbbus = APB1,
+#ifdef MODULE_PERIPH_DMA
+ .tx_dma = 3,
+ .tx_dma_chan = DMA_CHAN_CONFIG_UNSUPPORTED,
+ .rx_dma = 2,
+ .rx_dma_chan = DMA_CHAN_CONFIG_UNSUPPORTED
+#endif
+ },
+#ifndef MODULE_PERIPH_ADC
{
.dev = SPI1,
.mosi_pin = GPIO_PIN(PORT_A, 7),
@@ -290,21 +332,7 @@ static const spi_conf_t spi_config[] = {
.rx_dma_chan = DMA_CHAN_CONFIG_UNSUPPORTED
#endif
},
- {
- .dev = SPI2,
- .mosi_pin = GPIO_PIN(PORT_B, 15),
- .miso_pin = GPIO_PIN(PORT_B, 14),
- .sclk_pin = GPIO_PIN(PORT_B, 13),
- .cs_pin = GPIO_PIN(PORT_B, 12),
- .rccmask = RCC_APB1ENR_SPI2EN,
- .apbbus = APB1,
-#ifdef MODULE_PERIPH_DMA
- .tx_dma = 3,
- .tx_dma_chan = DMA_CHAN_CONFIG_UNSUPPORTED,
- .rx_dma = 2,
- .rx_dma_chan = DMA_CHAN_CONFIG_UNSUPPORTED
#endif
- }
};
#define SPI_NUMOF ARRAY_SIZE(spi_config)
diff --git a/doc/doxygen/src/pinouts/pinout-bluepill.svg b/doc/doxygen/src/pinouts/pinout-bluepill.svg
new file mode 100644
index 0000000000..d9654875cb
--- /dev/null
+++ b/doc/doxygen/src/pinouts/pinout-bluepill.svg
@@ -0,0 +1,4710 @@
+
+