Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

boards/common/blxxxpill: Fix pin conflicts in periph_conf #18785

Merged
merged 4 commits into from
Oct 27, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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 changes: 4 additions & 0 deletions cpu/stm32/include/periph/cpu_pwm.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,10 @@ typedef struct {
typedef struct {
TIM_TypeDef *dev; /**< Timer used */
uint32_t rcc_mask; /**< bit in clock enable register */
#ifdef CPU_FAM_STM32F1
uint32_t remap; /**< AFIO remap mask to route periph to other
pins (or zero, if not needed) */
#endif
pwm_chan_t chan[TIMER_CHANNEL_NUMOF]; /**< channel mapping
* set to {GPIO_UNDEF, 0}
* if not used */
Expand Down
5 changes: 4 additions & 1 deletion cpu/stm32/include/periph/cpu_qdec.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,10 @@ typedef struct {
uint32_t rcc_mask; /**< bit in clock enable register */
qdec_chan_t chan[QDEC_CHAN]; /**< channel mapping, set to {GPIO_UNDEF, 0}
* if not used */
#ifndef CPU_FAM_STM32F1
#ifdef CPU_FAM_STM32F1
uint32_t remap; /**< AFIO remap mask to route periph to other
pins (or zero, if not needed) */
#else
gpio_af_t af; /**< alternate function used */
#endif
uint8_t bus; /**< APB bus */
Expand Down
6 changes: 6 additions & 0 deletions cpu/stm32/periph/pwm.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
#include "assert.h"
#include "periph/pwm.h"
#include "periph/gpio.h"
#include "periph_conf.h"

#define CCMR_MODE1 (TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2 | \
TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2M_2)
Expand Down Expand Up @@ -60,6 +61,11 @@ uint32_t pwm_init(pwm_t pwm, pwm_mode_t mode, uint32_t freq, uint16_t res)
TIM_CHAN(pwm, i) = (mode == PWM_RIGHT) ? res : 0;
}

/* remap the timer to the configured pins (F1 only) */
#ifdef CPU_FAM_STM32F1
AFIO->MAPR |= pwm_config[pwm].remap;
#endif

/* configure the used pins */
unsigned i = 0;
while ((i < TIMER_CHANNEL_NUMOF) && (pwm_config[pwm].chan[i].pin != GPIO_UNDEF)) {
Expand Down
12 changes: 12 additions & 0 deletions cpu/stm32/periph/qdec.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@
#include "periph/qdec.h"
#include "periph/gpio.h"

#define ENABLE_DEBUG 0
#include "debug.h"

#ifdef QDEC_NUMOF

/**
Expand Down Expand Up @@ -59,6 +62,15 @@ int32_t qdec_init(qdec_t qdec, qdec_mode_t mode, qdec_cb_t cb, void *arg)
/* Power on the used timer */
periph_clk_en(qdec_config[qdec].bus, qdec_config[qdec].rcc_mask);

/* Route peripheral to correct pins (STM32F1 only, other MCU families route
* pins to peripheral rather than peripheral to pins */
#ifdef CPU_FAM_STM32F1
DEBUG("[qdec] AFIO->MAPR = 0x%" PRIx32 ", |= 0x%" PRIx32 "\n",
AFIO->MAPR, qdec_config[qdec].remap);
AFIO->MAPR |= qdec_config[qdec].remap;
DEBUG("[qdec] AFIO->MAPR = 0x%" PRIx32 "\n", AFIO->MAPR);
#endif

/* Reset configuration and CC channels */
dev(qdec)->CR1 = 0;
dev(qdec)->CR2 = 0;
Expand Down
Loading