The STM32F103C8T6 is the 64KB-flash member of ST's F103 medium-density family — Cortex-M3 at 72MHz, 20KB SRAM, in a 48-pin LQFP. It's the chip on every "Blue Pill" board and half the custom ARM prototypes of the last decade.
Per the ST DS5319 datasheet, the part runs from 2.0-3.6V and nearly all PA/PB GPIO tolerate 5V logic — the two facts behind most wiring questions.
But the pins that kill custom boards aren't the GPIO. From what we see in Shenzhen lots (2025–2026) and on the forums, it's the pins designers skip: VDDA, BOOT0, NRST, and the oscillator pins. This guide covers the full pinout and those failure points.
Numbering convention: pin 1 sits at the top-left of the package (dot side), counting counter-clockwise: left side 1-12 top to bottom, bottom side 13-24 left to right, right side 25-36 bottom to top, top side 37-48 right to left.
| Pin | Name | Type | Function & Notes |
|---|---|---|---|
| 1 | VBAT | Power | Backup/RTC supply — tie to VDD (3.3V) when unused |
| 2 | PC13 | I/O | TAMPER-RTC pin — 3.3V only, not 5V-tolerant; the Blue Pill's on-board LED |
| 3 | PC14 | I/O | OSC32_IN / RTC 32.768kHz crystal input |
| 4 | PC15 | I/O | OSC32_OUT / RTC crystal output |
| 5 | PD0 | I/O | OSC_IN — main 8MHz crystal input (or GPIO, FT) |
| 6 | PD1 | I/O | OSC_OUT — main crystal output (or GPIO, FT) |
| 7 | NRST | Input | Reset, active low — internal pull-up; add 100nF to GND |
| 8 | VSSA | Power | Analog ground — tie to VSS |
| 9 | VDDA | Power | Analog supply 2.0-3.6V — must be bridged to VDD (0Ω) |
| 10 | PA0 | I/O | WKUP / ADC12_IN0 — 5V-tolerant; the wake-up pin |
| 11 | PA1 | I/O | ADC12_IN1 — 5V-tolerant |
| 12 | PA2 | I/O | USART2_TX / ADC12_IN2 — 5V-tolerant |
| 13 | PA3 | I/O | USART2_RX / ADC12_IN3 — 5V-tolerant |
| 14 | PA4 | I/O | SPI1_NSS / ADC12_IN4 — 5V-tolerant |
| 15 | PA5 | I/O | SPI1_SCK / ADC12_IN5 — 5V-tolerant |
| 16 | PA6 | I/O | SPI1_MISO / ADC12_IN6 / TIM3_CH1 — 5V-tolerant |
| 17 | PA7 | I/O | SPI1_MOSI / ADC12_IN7 / TIM3_CH2 — 5V-tolerant |
| 18 | PB0 | I/O | ADC12_IN8 / TIM3_CH3 — 5V-tolerant |
| 19 | PB1 | I/O | ADC12_IN9 / TIM3_CH4 — 5V-tolerant |
| 20 | PB2 | I/O | BOOT1 — boot-mode select at reset; GPIO after boot (FT) |
| 21 | PB10 | I/O | I2C2_SCL / USART3_TX — 5V-tolerant |
| 22 | PB11 | I/O | I2C2_SDA / USART3_RX — 5V-tolerant |
| 23 | VSS_1 | Power | Ground |
| 24 | VDD_1 | Power | 2.0-3.6V supply |
| 25 | PB12 | I/O | SPI2_NSS / I2C2_SMBA — 5V-tolerant |
| 26 | PB13 | I/O | SPI2_SCK — 5V-tolerant |
| 27 | PB14 | I/O | SPI2_MISO — 5V-tolerant |
| 28 | PB15 | I/O | SPI2_MOSI — 5V-tolerant |
| 29 | PA8 | I/O | MCO / TIM1_CH1 — 5V-tolerant; MCO can output the clock |
| 30 | PA9 | I/O | USART1_TX — 5V-tolerant; the bootloader UART |
| 31 | PA10 | I/O | USART1_RX — 5V-tolerant |
| 32 | PA11 | I/O | USB_DM / USART1_CTS — 5V-tolerant (USB spec limits apply) |
| 33 | PA12 | I/O | USB_DP / USART1_RTS — 5V-tolerant |
| 34 | PA13 | I/O | SWDIO — SWD data, 5V-tolerant |
| 35 | VSS_2 | Power | Ground |
| 36 | VDD_2 | Power | 2.0-3.6V supply |
| 37 | PA14 | I/O | SWCLK — SWD clock, 5V-tolerant |
| 38 | PA15 | I/O | JTDI / TIM2_CH1 — 5V-tolerant |
| 39 | PB3 | I/O | JTDO / TIM2_CH2 — 5V-tolerant |
| 40 | PB4 | I/O | NJTRST / TIM3_CH1 — 5V-tolerant |
| 41 | PB5 | I/O | I2C1_SMBA / TIM3_CH2 — 5V-tolerant |
| 42 | PB6 | I/O | I2C1_SCL / TIM4_CH1 / USART1_TX alt — 5V-tolerant |
| 43 | PB7 | I/O | I2C1_SDA / TIM4_CH2 / USART1_RX alt — 5V-tolerant |
| 44 | BOOT0 | Input | Boot-mode select — 3.3V only, not 5V-tolerant; needs a defined level |
| 45 | PB8 | I/O | CAN_RX / I2C1_SCL alt — 5V-tolerant |
| 46 | PB9 | I/O | CAN_TX / I2C1_SDA alt — 5V-tolerant |
| 47 | VSS_3 | Power | Ground |
| 48 | VDD_3 | Power | 2.0-3.6V supply |
Per the ST DS5319 datasheet: the three VDD/VSS pairs are all internally connected, but each needs its own decoupling capacitor placed at the pin.
FT marking in the datasheet means 5V-tolerant input — on this part that covers nearly all PA/PB GPIO, but not PC13-15, BOOT0, or the power pins.
LQFP48 numbering: the dot marks pin 1 at the top-left; count counter-clockwise with 12 pins per side. PA0 lands at pin 10 on the left side, BOOT0 at pin 44 on the top side — easy to find once the quadrant is clear.
| Parameter | Value |
|---|---|
| Core | ARM Cortex-M3, 72MHz max (per DS5319) |
| Flash / SRAM | 64KB / 20KB |
| Package | LQFP48, 7×7mm, 0.5mm pitch |
| Supply Range | 2.0-3.6V (typical 3.3V) |
| GPIO | 37 I/Os, most 5V-tolerant (FT) |
| ADC | 2 × 12-bit, 10 external channels each |
| Timers | TIM1 (16-bit advanced), TIM2/3/4 (16-bit general) |
| USART | USART1/2/3 |
| SPI / I2C | SPI1/2, I2C1/2 |
| USB | USB 2.0 Full-Speed device (PA11/PA12) |
| CAN | CAN1 (PB8/PB9) |
| Debug | SWD (PA13/PA14) + JTAG |
| Clocks | HSE 4-16MHz (8MHz typical), HSI 8MHz internal, LSE 32.768kHz RTC |
| Temperature Grade | -40 to +85°C (T suffix) |
Key numbers that matter: the 72MHz core needs the HSE crystal + PLL — without an 8MHz crystal the chip runs on the 8MHz HSI oscillator, which works for blink tests and fails hard for USB timing and 72MHz performance.
The 20KB SRAM is the real constraint on this part, not flash — 64KB of code space fits more than most designs need, and 20KB of RAM fills fast with buffers and USB stacks.
Why do the small pin groups get most of this guide? Because they're where custom boards fail.
BOOT0 (pin 44) and PB2/BOOT1 (pin 20) — the boot-mode pair. Sampled at reset, they select the boot source: BOOT0=0 runs flash; BOOT0=1 with BOOT1=0 runs system memory (the factory UART bootloader); BOOT0=1 with BOOT1=1 runs SRAM.
On custom boards, BOOT0 needs a defined level — a 10k pull-down to GND with a jumper to 3.3V is the standard circuit.
VDDA (pin 9) — the pin that blocks programming. VDDA supplies the analog section and the GPIOA/SWD path on this family.
Per the ST community threads, a custom board with VDDA unconnected gives "no response from target" no matter what the debugger does. Bridge VDDA to VDD with 0Ω; add a ferrite bead plus 1µF and 100nF when ADC accuracy matters.
PA13 (pin 34) and PA14 (pin 37) — SWD. The two-wire debug interface needs no clock configuration to connect — but it dies if VDDA is missing or NRST floats.
Keep NRST pulled up (it has an internal pull-up; don't fight it) with a 100nF cap to ground.
PA9 (pin 30) and PA10 (pin 31) — USART1, the bootloader UART. The factory ROM bootloader speaks USART1 only. Adapter TX goes to PA10, adapter RX comes from PA9 — crossed the other way is the classic no-response cause.
Boot protocol per AN2606: 38400 baud, even parity, 8 data bits, echo disabled.
PA11 (pin 32) and PA12 (pin 33) — USB. The F103 has an internal 1.5kΩ D+ pull-up controlled by firmware (SOF-type connection). If firmware never enables it, the device won't enumerate — a software issue, not a missing resistor.
PD0 (pin 5) and PD1 (pin 6) — the 8MHz crystal. HSE runs through these pins with two ~20pF load caps to ground. A bad crystal or missing load caps is the classic "uploads fine, runs wrong" failure.
PC13 (pin 2) — the 3.3V-only trap. It drives the Blue Pill's LED, and it is not 5V-tolerant. Neither are PC14/15. Driving any of them from 5V logic is the fastest way to damage a board that "should be fine."
Minimal system: 3.3V with a 100nF cap at every VDD/VSS pair, VDDA bridged to VDD through 0Ω, an 8MHz crystal on PD0/PD1, BOOT0 held low by a 10k pull-down, and the SWD pair free for the debugger.
The UART1 header (PA9/PA10) doubles as the factory-bootloader port when BOOT0 is pulled high and the chip is reset. USB needs no external pull-up resistor — firmware controls the internal 1.5k on D+.
What the 48 pins are — where the LQFP48 budget goes:
Two-thirds of the package is GPIO; the pins that brick custom boards — VDDA, BOOT0, NRST, the crystal pair — all sit in the small groups.
Here's the thing: every one of these failures shows up in forum threads weekly, and each traces back to one small pin group.
1. VDDA left unconnected — "No response from target". The #1 custom-board error. VDDA supplies GPIOA and the SWD unit; without it the debugger can't see the chip (mikrocontroller.net and SE threads document the exact symptom).
2. BOOT0 floating or wrong. On a custom board, a floating BOOT0 makes startup random. For flash run, BOOT0 must be low (10k to GND); for the UART bootloader, BOOT0 high then reset.
3. UART bootloader wiring crossed. The ROM bootloader is on USART1 (PA9 TX / PA10 RX). TX-to-TX wiring gives silence; so does using USART2/3, which the bootloader doesn't listen on. Boot protocol: 38400 baud, even parity, echo off (per AN2606).
4. 5V into a 3.3V-only pin. 2.0-3.6V on the supply; FT GPIO tolerate 5V logic — but PC13/14/15, BOOT0, and every power pin don't. A 5V signal into BOOT0 is the silent killer on custom boards.
5. NRST floating. Intermittent debugger connection and missed breakpoints trace back to a floating reset pin. It has an internal pull-up; add the 100nF cap to GND and route it to a header.
6. Bad or missing 8MHz crystal. Uploads succeed, then the code runs at wrong speed or not at all. Check the crystal, its load caps, and the soldering before suspecting the firmware.
7. Counterfeit F103s on cheap boards. Marking without an ST logo, wrong die reading, and ST Flash Loader failures are the pattern. For production, buy from an authorized line and verify the part marking (from what we see in Shenzhen, 2025–2026).
A: No — the chip runs from 2.0-3.6V, typically 3.3V. The Blue Pill takes 5V at its USB/5V pins only because an onboard regulator drops it. What tolerates 5V is most of the GPIO (FT-marked), not the supply. A 5V rail into VDD is damage; a 5V logic signal into an FT pin is fine.
A: Nearly all PA/PB GPIO carry the FT (5V-tolerant) mark in DS5319. The exceptions that bite: PC13/14/15 are 3.3V-only, BOOT0 is 3.3V-only, and the power/analog pins are supply. PA11/PA12 are FT-marked but still subject to USB electrical limits when used as USB.
A: BOOT0 to 3.3V, reset, then talk to USART1 at 38400 baud, even parity, 8 data bits, echo off. Adapter TX → PA10, adapter RX ← PA9. After flashing, BOOT0 back to GND and reset to run from flash. The ROM bootloader only listens on USART1 — USART2/3 are ignored.
A: They pick the boot source, sampled once at reset. BOOT0=0 boots flash (normal run). BOOT0=1 with BOOT1=0 boots system memory (the factory UART bootloader). BOOT0=1 with BOOT1=1 boots SRAM (for RAM debugging). PB2 doubles as BOOT1 but works as normal GPIO after boot.
A: For blinking, no — the internal 8MHz HSI runs it. For 72MHz and USB, yes. The PLL needs HSE to reach 72MHz with calibrated accuracy, and USB timing depends on a precise 48MHz clock. RTC needs the separate 32.768kHz LSE crystal on PC14/PC15. Projects that "work on the bench" and fail in the field are usually missing one of these.
A: Check VDDA first, then NRST, then the SWD pins. VDDA unconnected starves GPIOA and the SWD unit — the documented #1 cause (SE and mikrocontroller.net threads). NRST floating causes intermittent drops. Then confirm PA13/PA14 aren't reassigned by leftover firmware.
A: Check marking, die reading, and bootloader behavior. Genuine parts carry clean ST marking and read a real ID. Clones often fail ST's Flash Loader with a "chip protection" style error, show wrong or erasable ID, and behave differently at the bootloader UART. From what we see in Shenzhen (2025–2026), remarked F103s concentrate in "too cheap" lots — verify the lot before volume.





