Embedded Programming

architectures
   von Neumann, Harvard, bugs
   RISC, CISC
   microprocessor, microcontroller
   multi-core
   GPU, embedded
   FPGA, TinyFPGA, IceStorm, Symbiflow
   SiliconCompiler
   spatial

memory
   registers (instructions)
   SRAM (fast)
   DRAM (big)
   EEPROM (non-volatile)
   FLASH (programs, strings)
   fuse (configuration)

peripherals
   ports
   A/D
   comparator
   D/A
   timer/counter/PWM
   USART
   USB
   math
   crypto
   ...

word size
   8
   16
   32
   64

processor families
   hardware, software benchmarks
   LOGIC
   Megaprocessor
   MOnSter 6502
   8051
   PIC
   MSP
   AVR
         • 6-100 pin packages
      ATtiny10
         • SOT23-6
      ATtiny45V, ATtiny44A
         • prior
      ATtiny412, ATtiny1614, ATtiny3216
         • 1-series
         • 8 bit, 1.8-5.5V, 20 MHz
         • single-cycle global instructions
         • simple peripheral register access
         • low pin-count packages
         • one-pin serial programming
      ATtiny1624
         • 2-series
         • programmable gain amplifier
      AVR128DB32
         • 24 MHz
         • analog signal conditioning
         • level shifting
         • hardware multiplier
   ARM
      D11C, D11D, D21E, D51
         • 32 bit, 1.6-3.6V
         • 48 MHz clock, more complex clock distribution and synchronization
         • more powerful peripherals, more complex register access and libraries
         • diverse family, larger packages
         • standard in-circuit debugging
      STM32
         • 8-265 pins
         • good software support
      Raspberry Pi
         RP2040
            • 32-bit dual-core
            • 133 MHz clock (250 MHz+ over-clocked)
            • 264k SRAM
            • programmable peripherals
         RP2350
   Xtensa (MIPS)
      ESP8266, ESP32
         • integrated RF, networking
   RISC-V
         • open architecture
         • ESP32-C3, ESP32-C6
   PSoC, xCORE, Propeller, Lattice, NVIDIA
         • parallel

vendors
   Octopart
   Digi-Key
   Mouser
   Newark
   Farnell
   SparkFun
   Adafruit

packages
   DIP
   SOT
   SOIC
   TSSOP
   TQFP
   LQFP
   LGA, QFN, CSP, BGA

embedded languages
   modifying code
   assembly
      hex file
      instruction set, opcodes
      mnemonics, directives, expressions
      avr-as
      inline
   C C++
      programming types
      GCC
         make files (tabs)
         bit operations
      AVR
         libc modules types math benchmarks
         avr-libc binutils-avr gcc-avr
         homebrew-avr
      ARM
         gcc-arm-none-eabi gdb-multiarch
         homebrew-arm
         libopencm3
      Microchip
         Studio
         toolchains packs (zip)
         ASF START
      Espressif
         ESP-IDF
         ESP-DSP
   Rust
      memory leaks, memory overruns, race conditions
      RP template
      ESP32
      AVR
   interpreters
      MicroPython CircuitPython
         language implementation REPL speed bridge
         boot.py, main.py
         asyncio (threads)
         ulab
      Espruino Kaluma DeviceScript

AI
coding ChatGPT Copilot Duo DeepSeek bugs, hallucination, copyright infringement, ... embedded TensorFlow Lite TinyML ESP-DL Edge Impulse operating systems bare-metal cooperative vs preemptive multitasking FreeRTOS TinyOS Mbed OS ROS in-system development raw REPL, Web REPL, upy.py bootloader, bootloaders JTAG SWD (ARM) software OpenOCD EDBG program: edbg -b -t target_type -epv -f binary_file read fuses: edbg -b -t target_type -F r,*,file_name write fuses: edbg -b -t target_type -F w,high_bit:low_bit,bit_value disable SAMD bootloader protection: edbg -b -t target_type -F w,2:0,7 hardware Atmel-ICE PICO GoodFET Raspberry Pi Free-DAP USB-D11C-SWD-10 pin board components traces traces+exterior interior USB-D11C-SWD-4 pin board components traces traces+exterior interior SWD-10-4-0.05 pitch board components traces traces+exterior interior SWD-10-4-0.1 pitch board components traces traces+exterior interior binary video USB-D11C-SWD-10 pin Eagle brd sch USB-D11C-SWD-10 pin KiCad sch pcb prl pro USB-D11C-SWD-10 pin SVG-PCB js UPDI (newer AVR) software pyupdi install: pip3 install intelhex pylint pyserial program: python3 pyupdi.py -d your_processor -c your_port -b your_baud_rate -f your_hex_file -v pymcuprog install: apt install libusb-1.0-0-dev, libudev-dev pip3 install pymcuprog program: pymcuprog -d your_processor -t uart -u your_port -c your_baud_rate -v info erase pymcuprog -d your_processor -t uart -u your_port -c your_baud_rate -v info write -f your_hex_file hardware USB-D11C-serial board components top top+exterior interior bootloader SAMD11C SAMD11C_serial video serial-UPDI-2 pin board components traces traces+exterior interior connector(less) serial UPDI-3 pin board components traces traces+exterior interior USB-FT230X-UPDI board components traces traces+exterior interior dual serial SWD+UPDI ISP (original AVR) software avrdude hardware header pads clip pins Atmel-ICE Arduino ATmega16U2 Zaerc ATtiny45 Sean Alex Tomás Jonathan Brian Zaerc ATtiny44 Ali Valentin Bas Andy David USB-t44-ISP board components traces traces+exterior interior firmware.zip programming breakout development environments Microchip Studio Eclipse VS Code Thonny Codebra PlatformIO Arduino board + toolchain + libraries + IDE + bootloader + header programming C++ Create Codebender Ardublock CLI original Fabkit Fabio satshakit hello.328P cores Arduino-Pico ESP32 ESP8266 fab-sam tinyAVR DxCore ATTinyCore overhead millis interrupts ISR development boards XIAO (CT) Adafruit Pololu Olimex Micro:bit Beagle Rasberry Pi Quentorres Fab-Xiao SAMDino Adrianino D11C devkit D21E devkit clocks types RC (10%, 1% calibrated) ceramic (0.5%) quartz (50 ppm) PLL instruction cycles overclocking underclocking serial communication RS232 bit timing VT100/ANSI/ISO/ECMA terminal Arduino serial monitor Screen screen port speed, ctrl-a k to quit pySerial miniterm python -m serial.tools.miniterm /dev/your_device_port your_baud_rate SerialPort terminal serialport-terminal Web Serial USB ASF Arduino TinyUSB USB-D11C-serial board components top interior bootloader serial.ino video SAMD11C_serial FTDI drivers libFTDI cable chip hello.USB-serial.FT230X board components traces traces+exterior interior debugging blink LED add print statements use an embedded debugger gdb, ddd Microchip Studio Arduino 2 simulation Tinkercad digital Wokwi video mixed-signal AVR8js video RP2040 XIAO pinout hello.button-blink.RP2040 board components traces interior hello.button-blink.RP2040.1.ino 1.py 2.ino 2.py video blink-echo.ino blink-echo.py ws2812.py video Pico Doom ESP32 ESP32-C3 XIAO pinout hello.button-blink.C3 board components traces interior hello.button-blink.C3.ino hello.button-blink.C3.py video ESP32-WROOM-32 module versions ESP32-WROOM-echo board components traces traces+exterior holes interior echo.ino video ring.ino Python video ESP8266 ESP-01 module ESP-01-echo board components traces traces+exterior holes interior echo.ino video ESP-WROOM-02D module ESP-WROOM-02D-echo board components traces traces+exterior holes interior echo.ino video Python video ATSAMD11C D11C-blink board components traces traces+exterior interior D11C-blink-reset board components traces traces+exterior interior D11C-blink-reset-clock board components traces traces+exterior interior blink.c blink.make bootloader blink.ino video ring.ino D11C-echo board components traces traces+exterior interior D11C-echo-10 board components traces traces+exterior interior D11C-echo-mini board components traces traces+exterior holes interior D11C-echo-micro board components traces traces+exterior holes interior echo.ino video D11C-serial board components top interior D11C-serial-micro-4 board components traces traces+exterior holes interior D11C-serial-large vias board components top top+exterior bottom holes interior D11C-serial-small vias board components top top+exterior bottom holes interior Gerber serial.ino video SAMD11C_serial ATSAMD11D D11D-echo board components traces traces+exterior interior openocd.cfg bootloader echo.ino video ATSAMD21E D21E-echo board components traces traces+exterior interior bootloader echo.ino video Python ATSAMD51 hello worlds ring.ino ATtiny412 t412-blink-3 pin board components traces mask traces+exterior interior blink.ino blink.c make video t412-blink-2 pin board components traces traces+exterior interior blink.ino video ring.ino t412-echo board componenets traces traces+exterior interior echo.ino video echo.c echo.make video ATtiny45 t45-echo board components traces traces+exterior interior pin re-use ports port.c port.make port.ino port.write.ino bit-bang echo.c echo.make echo.ino echo.serial.ino video ATtiny1614 ATtiny1624 hello.t1624-XU.0603 pro sch pcb board components traces interior blink.ino t1614-echo board components traces traces+exterior interior echo.ino video ATtiny44 t44-echo board components traces traces+exterior interior t44-echo-2 sided board components top top+exterior bottom holes interior programming mods echo.c echo.c.make echo.interrupt.c echo.interrupt.c.make echo.asm echo.asm.make ATtiny3216 ATtiny3226 t3216-echo board components traces traces+exterior interior echo.ino video AVR128DB32 128DB32-echo board components traces traces+exterior interior ring.c ring.make echo.c echo.make video assignment assignment assignment group assignment: demonstrate and compare the toolchains and development workflows for available embedded architectures individual assignment: browse through the data sheet for your microcontroller write a program for a microcontroller, and simulate its operation, to interact (with local input &/or output devices) and communicate (with remote wired or wireless connections) extra credit: test it on a development board extra credit: try different languages &/or development environments