Skip to content

Commit

Permalink
boards/common/blxxxpill: rework periph configuration
Browse files Browse the repository at this point in the history
The peripheral configuration has been completely reworked to resolve
pin conflicts while provided as much of the peripherals as possible.
The changes include:

- Move `I2C_DEV(0)` from PB6/PB7 to PB8/PB9 to solve pin conflict with
  `QDEC_DEV(2)`.
- Use pins PB0, PB1, PB4, and PB5 for PWM instead PA8, PA9, PA10, and
  PA11
    - PA9 and PA10 is in pin conflict with `UART_DEV(0)` which is used
      for stdio with `stdio_uart`, PA8 was in conflict with
      `QDEC_DEV(0)`, PA11 was in conflict with USB D-
- Use PB6, PB7 as `QDEC_DEV(0)` (previously `QDEC_DEV(2)`), as this is
  the only completely conflict free setting
- Use PB4/PB5 instead of PA6/PA7 for QDEC_DEV(1)
    - This fixes a pin conflict with `SPI_DEV(0)` MISO (and
      `ADC_LINE(4)`)
- Only provide QDEC at PB4/PB5 when PWM is not used to avoid conflict
- Only provide QDEC at PA8/PA9 when UART is not used to avoid conflict
- Use SPI2 (PB15, PB14, PB13, PB12) as `SPI_DEV(0)` instead of SPI1,
  use SPI1 (PA7, PA6, PA5, PA4) as `SPI_DEV(1)`
- Only provide `SPI_DEV(1)` if the ADC is not in used to resolve a
  pin conflict
- Move PB0 and PB1 at the end of the ADC lines (previously
  `ADC_LINE(6)` and `ADC_LINE(7)`, now `ADC_LINE(8)` and `ADC_LINE(9)`)
   - Only provide them when PWM is not in use (to resolve pin conflict
     with PWM)
   - Also do not provide them for the Blackpill boards, which are
     missing pins PB0 and PB1 on the headers

To make life of users easier, a Pinout diagram with the new
configuration was added.
  • Loading branch information
maribu committed Oct 27, 2022
1 parent 5ddc332 commit 051a1f1
Show file tree
Hide file tree
Showing 6 changed files with 9,011 additions and 49 deletions.
6 changes: 3 additions & 3 deletions boards/common/blxxxpill/doc.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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 |
Expand Down
6 changes: 6 additions & 0 deletions boards/common/blxxxpill/doc/README.md
Original file line number Diff line number Diff line change
@@ -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.
4,096 changes: 4,096 additions & 0 deletions boards/common/blxxxpill/doc/bluepill-top-view.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
122 changes: 122 additions & 0 deletions boards/common/blxxxpill/doc/pinout-bluepill.csv
Original file line number Diff line number Diff line change
@@ -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"
120 changes: 74 additions & 46 deletions boards/common/blxxxpill/include/periph_conf.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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)
Expand All @@ -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),
Expand All @@ -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)
Expand Down
4,710 changes: 4,710 additions & 0 deletions doc/doxygen/src/pinouts/pinout-bluepill.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 051a1f1

Please sign in to comment.