Uploaded December 2023 | Updated September 2026, 2 weeks ago
In this video, we examine the WS2812B RGB LED device, and write a bit-banged driver from scratch for an STM32 microcontroller.
Chapters
00:00 What is a WS2812 / NeoPixel
02:33 Hardware overview
06:00 What is a "device driver"?
08:35 The signalling protocol
15:00 Reviewing the datasheet
22:00 Figuring out the GPIO timing
49:32 First LED test
53:36 Implementing the driver interface
=[ 🔗 Links 🔗 ]=
🎥 Bare metal playlist: youtube.com/playlist?list=PLP29wDx6QmW7HaCrRydOnxcy8QmW0SNdQ
🗣 Discord: discord.gg/FPWaVgk
⭐️ Patreon: patreon.com/lowleveljavascript
💻 Github Repo: github.com/lowbyteproductions/stm32-ws2812b
In this video, we examine the WS2812B RGB LED device, and write a bit-banged driver from scratch for an STM32 microcontroller.
Chapters
00:00 What is a WS2812 / NeoPixel
02:33 Hardware overview
06:00 What is a "device driver"?
08:35 The signalling protocol
15:00 Reviewing the datasheet
22:00 Figuring out the GPIO timing
49:32 First LED test
53:36 Implementing the driver interface
=[ 🔗 Links 🔗 ]=
🎥 Bare metal playlist: youtube.com/playlist?list=PLP29wDx6QmW7HaCrRydOnxcy8QmW0SNdQ
🗣 Discord: discord.gg/FPWaVgk
⭐️ Patreon: patreon.com/lowleveljavascript
💻 Github Repo: github.com/lowbyteproductions/stm32-ws2812b
![Tour Through The Assembly Language and The Assembler (16-Bit VM in JavaScript 007)
In this episode were going to take a break from building functionality in the virtual machine and take a tour through the assembly language that this VM will support, and some features of the assembler - which will turn that assembly language into machine code.
=[ ℹ About ℹ ]=
This series is all about building a powerful virtual machine in JavaScript with the following features:
- A flexible, extensible, register-based virtual machine
- Support for signed, unsigned and floating point operations
- A call stack
- Interrupt capabilities
- Ability to do memory mapping for IO
- An assembly language with macro and module support
- A higher level, C like language. Well use and expand the library from the parser combinators from scratch series
- And finally, to be able to take the whole thing into the browser and extend it to create a sort of fantasy console - an emulator for a machine that never existed
- ⭐️ Patreon: https://www.patreon.com/lowleveljavascript
- 💌 Updates to your inbox: https://tinyletter.com/lowleveljavascript
- Series Playlist: https://www.youtube.com/playlist?list=PLP29wDx6QmW5DdwpdwHCRJsEubS5NrQ9b&playnext=1&index=1
- Github Repo: https://github.com/LowLevelJavaScript/16-Bit-Virtual-Machine
- arcsecond: https://github.com/francisrstokes/arcsecond
- Parser Combinators From Scratch: https://www.youtube.com/watch?v=6oQLRhw5Ah0&list=PLP29wDx6QmW5yfO1LAgO8kU3aQEj8SIrU Tour Through The Assembly Language and The Assembler (16-Bit VM in JavaScript 007)](https://i.ytimg.com/vi/KhKq8a1m8r8/mqdefault.jpg)
![How does an OS boot? //Source Dive// 001
In this installment of //Source Dive//, were learning about the xv6 Operating System; Specifically the low-level boot code that gets the CPU in the correct state to run the OS!
=[ 🔗 Links 🔗 ]=
🐋 RISC-V Docker Image: https://github.com/francisrstokes/rv-toolchain-docker/pkgs/container/rv-toolchain-docker
🎥 Series Playlist:
🗣 Discord: https://discord.gg/FPWaVgk
⭐️ Patreon: https://www.patreon.com/lowleveljavascript
💻 Github Repo: https://github.com/mit-pdos/xv6-riscv How does an OS boot? //Source Dive// 001](https://i.ytimg.com/vi/KkenLT8S9Hs/mqdefault.jpg)
![Implementing A Generic Priority Queue
In this video were going to be building a priority queue - a data structure which allows us to add items and retrieve the highest priority item in an extremely fast and efficient manner. The implementation is generic, meaning we can use any kind of object or structure for our items that we choose.
This data structure will be used in some upcoming videos about compression.
=[ 🔗 Links 🔗 ]=
🎥 Series Playlist:
💌 Updates to your inbox: https://tinyletter.com/lowleveljavascript
🗣 Discord: https://discord.gg/FPWaVgk
⭐️ Patreon: https://www.patreon.com/lowleveljavascript
💻 Github Repo: https://github.com/LowLevelJavaScript/Priority-Queue Implementing A Generic Priority Queue](https://i.ytimg.com/vi/M6OW0KNkhhs/mqdefault.jpg)
![Programmatic Painting: Flow Fields
In this video, were drawing generative art in the form of flow fields! Flow fields are mathematical structures where every point of a space is associated with an angle, and by carefully choosing those angles, we can trace out the path of particles moving across the field, creating some beautiful images.
=[ 🔗 Links 🔗 ]=
🗣 Discord: https://discord.gg/FPWaVgk
⭐️ Patreon: https://www.patreon.com/lowleveljavascript
💻 Github Repo: https://github.com/lowbyteproductions/flow-fields Programmatic Painting: Flow Fields](https://i.ytimg.com/vi/M_SUcX66SDA/mqdefault.jpg)
![How does KERNEL memory allocation work? //Source Dive// 004
In this installment of //Source Dive//, were deep in the xv6 operating system, trying to understand how physical memory of the system is tracked, distributed, and returned to the kernel. Its a fascinatingly simple algorithm, which can be paradoxically kind of hard to understand!
=[ 🔗 Links 🔗 ]=
🐋 RISC-V Docker Image: https://github.com/francisrstokes/rv-toolchain-docker/pkgs/container/rv-toolchain-docker
🎥 Series Playlist:
🗣 Discord: https://discord.gg/FPWaVgk
⭐️ Patreon: https://www.patreon.com/lowleveljavascript
💻 Github Repo: https://github.com/mit-pdos/xv6-riscv How does KERNEL memory allocation work? //Source Dive// 004](https://i.ytimg.com/vi/NC_qkXznvkg/mqdefault.jpg)
![Implementing LOAD instructions: RISC-V ep.5
=[ 🔗 Links 🔗 ]=
🎥 Series Playlist: https://www.youtube.com/watch?v=ER7h4ZTe19A&list=PLP29wDx6QmW4sXTvFYgbHrLygqH8_oNEH
💌 Updates to your inbox: https://tinyletter.com/lowleveljavascript
🗣 Discord: https://discord.gg/FPWaVgk
⭐️ Patreon: https://www.patreon.com/lowleveljavascript
💻 Github Repo (emulator): https://github.com/LowLevelJavaScript/RISC-V-Emulator Implementing LOAD instructions: RISC-V ep.5](https://i.ytimg.com/vi/NrOdQu8Spxo/mqdefault.jpg)
![Understanding AES Encryption Mechanics: BMPS
In this video were taking some time to grok the mechanics of AES. We cover the core operations of the algorithm, the mathematics of finite fields, and the all-important modes of operation.
=[ 🔗 Links 🔗 ]=
AES Blog Post: https://github.com/francisrstokes/githublog/blob/main/2022/6/15/rolling-your-own-crypto-aes.md
Spec: https://nvlpubs.nist.gov/nistpubs/fips/nist.fips.197.pdf
Deeper justifications and analysis: https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/aes-development/rijndael-ammended.pdf
Attacking AES with power analysis: https://www.youtube.com/watch?v=5Hn2D5lrzVo
🎥 Series Playlist: https://www.youtube.com/playlist?list=PLP29wDx6QmW7HaCrRydOnxcy8QmW0SNdQ
🗣 Discord: https://discord.gg/FPWaVgk
⭐️ Patreon: https://www.patreon.com/lowleveljavascript
💻 Github Repo: https://github.com/lowbyteproductions/bare-metal-series Understanding AES Encryption Mechanics: BMPS](https://i.ytimg.com/vi/OnhtzFJW_4I/mqdefault.jpg)
![Building FPGA Hardware Using TypeScript: Driving An RGB LED Panel
In this video were taking a look at gateware-ts, a TypeScript library for describing and building digital hardware for FPGAs in TypeScript. Specifically, were building a driver for a 64x64 RGB LED Panel - the same as those used in large video wall displays.
If you want to try this project out for yourself, you can find the LED panels in many different places - including the 1bitsquared store mentioned in the video, but also sites like adafruit and other general electronics stockists have these kinds of panels available. If you dont mind the wait time, you can order them from China on sites like aliexpress - where theyre usually a little cheaper.
00:00 - Introduction
05:38 - The LED Panel
11:43 - The icebreaker FPGA Board
14:51 - Writing the driver
52:18 - Testing the panel
54:16 - Creating a pattern on screen
58:58 - Testing the pattern
=[ 🔗 Links 🔗 ]=
- FPGA: https://en.wikipedia.org/wiki/Field-programmable_gate_array
- gateware-ts: https://github.com/gateware-ts/gateware-ts
- gateware-ts documentation: https://gateware-ts.github.io/gateware-ts/
- icebreaker FPGA: https://1bitsquared.com/collections/fpga/products/icebreaker
- LED Panel: https://1bitsquared.com/collections/fpga/products/led-panel
- Great Sparkfun article about driving LED panels: https://www.sparkfun.com/news/2650
- Verilog: https://en.wikipedia.org/wiki/Verilog
- Summon FPGA Tools (script to download and build the OSS FPGA toolchain): https://github.com/open-tool-forge/summon-fpga-tools
- Prebuilt FPGA toolchain releases: https://github.com/YosysHQ/fpga-toolchain
- Yosys: http://www.clifford.at/yosys/
- NextPNR: https://github.com/YosysHQ/nextpnr
- Symbiflow: https://symbiflow.github.io/
- nMigen (like gateware-ts, but for python): https://github.com/m-labs/nmigen
💌 Updates to your inbox: https://tinyletter.com/lowleveljavascript
🗣 Discord: https://discord.gg/FPWaVgk
⭐️ Patreon: https://www.patreon.com/lowleveljavascript
💻 Github Repo: https://github.com/LowLevelJavaScript/led-panel-driver-in-gateware-ts Building FPGA Hardware Using TypeScript: Driving An RGB LED Panel](https://i.ytimg.com/vi/Otx96lJnLeo/mqdefault.jpg)
![Building A Language Parser and Interpreter [Parser Combinators from Scratch] Episode 5
In this episode we dive into parsing recursive structures, and build a very simple functional language parser and interpreter.
=[ ℹ About ℹ ]=
During this series we will develop an understanding of the concept of parsing, and build our own parser combinator system from scratch. The system we build will be capable of parsing both binary and text data. Well make use of both object-oriented and function programming principles to develop an effective and intuitive library.
=[ 🔗 Links 🔗 ]=
- ⭐️ Patreon: https://www.patreon.com/lowleveljavascript
- 💌 Updates to your inbox: https://tinyletter.com/lowleveljavascript
- Playlist: https://www.youtube.com/watch?v=6oQLRhw5Ah0&list=PLP29wDx6QmW5yfO1LAgO8kU3aQEj8SIrU
- Code: https://github.com/LowLevelJavaScript/Parser-Combinators-From-Scratch
- LLJS Subreddit: https://reddit.com/r/lowleveljavascript Building A Language Parser and Interpreter [Parser Combinators from Scratch] Episode 5](https://i.ytimg.com/vi/PzodUuERBZc/mqdefault.jpg)
![Programmatic Flash Control :: Bare Metal Programming Series 8
In this installment of the bare metal programming series, were diving into how the flash peripheral of the STM32F401 chip works, and building out a little layer to be able to write a new main application from the bootloader. This serves as an excellent opportunity to cross reference the details of the reference manual with the APIs provided by libopencm3 - going from a register level understanding, to a higher level implementation!
=[ 🔗 Links 🔗 ]=
🎥 Series Playlist: https://www.youtube.com/playlist?list=PLP29wDx6QmW7HaCrRydOnxcy8QmW0SNdQ
🗣 Discord: https://discord.gg/FPWaVgk
⭐️ Patreon: https://www.patreon.com/lowleveljavascript
💻 Github Repo: https://github.com/lowbyteproductions/bare-metal-series Programmatic Flash Control :: Bare Metal Programming Series 8](https://i.ytimg.com/vi/QcE3Y_8hroU/mqdefault.jpg)
![The Emulator Is Done?!: RISC-V ep.12
In this final installment of the RISC-V (emulator) series, we implement a multi-cycle memory interface. With this in place, the design is complete enough to move forward and begin design honest-to-goodness FPGA hardware!
=[ 🔗 Links 🔗 ]=
🎥 Series Playlist: https://www.youtube.com/watch?v=ER7h4ZTe19A&list=PLP29wDx6QmW4sXTvFYgbHrLygqH8_oNEH
💌 Updates to your inbox: https://tinyletter.com/lowleveljavascript
🗣 Discord: https://discord.gg/FPWaVgk
⭐️ Patreon: https://www.patreon.com/lowleveljavascript
💻 Github Repo (emulator): https://github.com/LowLevelJavaScript/RISC-V-Emulator The Emulator Is Done?!: RISC-V ep.12](https://i.ytimg.com/vi/QmHAN1vOtjs/mqdefault.jpg)