
BTTLab's open STM32F207 oscilloscope is a weekend-sized build with public firmware and Python software, but its 0–3.3 V input boundary makes the analog front end part of the project.
TIM2 sets the sampling rhythm.ADC1 converts the signal on PA6, ADC channel 6.USART3 sends the capture through the Nucleo board's ST-LINK virtual COM port.| Qty | Part | Planning cost | Sourcing and fit |
|---|---|---|---|
| 1 | ST NUCLEO-F207ZG, STM32F207ZG Nucleo-144 board | $31.55 | ST's store listed the board in stock at this price. The board includes ST-LINK programming/debugging and a virtual COM port, so the build needs no separate debugger or USB-to-serial adapter. 2 |
| 1 | USB data cable suitable for the Nucleo ST-LINK connection | $5–10 | Choose the connector that matches the board and your computer. The board's integrated ST-LINK handles programming and serial transport. 6 |
| 1 | Solderless breadboard or small prototyping board | $5–8 | The core signal connection can be temporary. Use a prototyping board if you build the protection stage. |
| 1 set | Jumper wires for PA6, ground, and the test source | $4–8 | Keep the signal ground tied to the Nucleo ground. |
| 1 | Host computer with USB port | Existing equipment | The project uses STM32CubeIDE for firmware and Python with pyserial, numpy, and matplotlib for the plotter. 7 |
| 1 | Low-voltage, current-limited test signal source | $0 if already owned; $20–80 if added | A function generator or another known 0–3.3 V source makes bring-up easier. The source must stay inside the ADC input range until the protection stage is verified. 3 |
| Core planning total | about $46–57, excluding the computer and signal source | The board price is a live ST price; the remaining amounts are planning allowances. |
| Qty | Part | Planning cost | Specification or caveat |
|---|---|---|---|
| 1 | Dual rail-to-rail op-amp package | $2–6 | The published diagram labels U1 and U2 as rail-to-rail op-amps, but it does not name a part number. Select a device whose supply range and input/output common-mode behavior suit a 3.3 V single-supply circuit. |
| 2 | Schottky diodes | $0.20–1 | The diagram uses one clamp to 3.3 V and one clamp to ground. Verify diode orientation before applying a signal. |
| 1 | 1 MΩ resistor | $0.10–0.50 | Input bias / coupling path shown as R2. |
| 1 | 330 kΩ resistor | $0.10–0.50 | Offset-bias path shown as R1. |
| 2 | 10 kΩ resistors | $0.20–1 | Midpoint divider shown as R3 and R4. |
| 1 | 100 Ω resistor | $0.10–0.50 | Series resistor before the ADC node, shown as R7. |
| 2 | 1 µF capacitors | $0.20–1 | C1 is the input coupling capacitor; C3 filters the buffered midpoint. |
| 1 | 100 pF capacitor | $0.10–0.50 | C2 forms the small output filter with R7. |
| 1 | SPST switch | $0.50–2 | SW1 bypasses the input coupling capacitor in the published diagram. |
| Protection-stage allowance | about $4–13 | The author does not publish a complete priced BOM or an exact op-amp model for this stage. 1 |
known 0–3.3 V signal
-> PA6 / ADC1 channel 6
-> TIM2-triggered 12-bit ADC conversion
-> circular DMA buffer
-> rising-edge search with hysteresis
-> 4096-sample capture
-> USART3 / ST-LINK virtual COM
-> Python and matplotlib waveformmain.c sets a 120 MHz system clock, divides APB1 by four, and uses a TIM2 period of 29. That combination produces a 2 MHz timer update from the code's clock setup. The .ioc file also contains derived clock fields that read 72 MHz, so regenerate or inspect the CubeIDE project and verify the clock tree after opening it. 45
firmware/ and a Python host program under software/. The firmware is MIT-licensed, and the repository includes the CubeMX .ioc file, generated drivers, source code, and the host-side requirements file. 3firmware/ project.pyserial, numpy, and matplotlib. The script opens a serial port at 921600 baud, waits for the 0xAA 0x55 frame marker, reads 4096 little-endian 16-bit ADC samples, and maps the counts to a 0–3.3 V display range. 79PORT value in the host script for your machine. The source shows a macOS device path such as /dev/cu.usbmodemXXXXX and a Windows COMXX example. The repository's file view names the script oscilloscope1_ch, while the README command uses oscilloscope1_ch.py; check the filename in your clone before running it. 39cd software
python -m venv .venv
source .venv/bin/activate # Windows: .venv\\Scripts\\activate
python -m pip install -r requirements.txt
python oscilloscope1_chSAMPLE_RATE and ADC_VREF constants describe the plot axes. If you change the firmware's timing or analog scaling, update the host-side display values too; the plotter cannot infer those changes from the sample stream. 9main.c, so the source is the place to adjust threshold, hysteresis, and pre-trigger settings. 5.ioc configuration, firmware, and Python host code give you enough material to reproduce the core path without designing a board first. 3hackaday.com
estore.st.com
github.com
github.com
github.com
github.com
github.com
This story was produced automatically by a channel. One sentence is all it takes for Neodrop to keep producing for you.