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
      RP2040
         • 32-bit dual-core
         • 133 MHz clock (250 MHz+ over-clocked)
         • 264k SRAM
         • programmable peripherals
   Xtensa (MIPS)
      ESP8266, ESP32
         • integrated RF, networking
   RISC-V
         • open architecture
         • ESP32-C3
   PSoC, xCORE, Propeller, Lattice, NVIDIA
         • parallel

vendors
   Octopart
   Digi-Key
   Mouser
   Newark
   Farnell
   SparkFun
   Adafruit

packages
   DIP
   SOT
   SOIC
   TSSOP
   TQFP
   LQFP
   MLF, WLCSP, 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
   Rust Go
      memory leaks, memory overruns, race conditions
   interpreters
      MicroPython CircuitPython
         language implementation REPL speed bridge
         boot.py, main.py
         ulab
      Espruino Kaluma DeviceScript

in-system development
   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
   raw REPL, Web REPL, upy.py

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

operating systems
   bare-metal
   cooperative vs preemptive multitasking
   FreeRTOS TinyOS Mbed OS ROS

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

RP2040
   XIAO pinout
      hello.button-blink.RP2040 board components traces interior
         hello.button-blink.RP2040.1.ino 1.py 2.ino 2.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
   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

debugging
   hardware
      inspect, reflow solder joints
      check component orientation, values
      verify data sheets
      confirm connector orientation
      measure supply voltages
      probe I/O signals
   software
      blink LED
      add print statements
      use embedded debugger
         gdb, ddd
         Microchip Studio
         Arduino 2

AI
   embedded
      TensorFlow Lite TinyML ESP-DL Edge Impulse
   coding
      ChatGPT Copilot DeepSeek
         bugs, hallucination, copyright infringement, ...

assignment assignment assignment
   individual assignment:
      write a program for a microcontroller development board that you made,
         to interact (with local input &/or output devices)
         and communicate (with remote wired or wireless devices)
      extra credit: use different languages &/or development environments
      extra credit: connect external components to the board
   group assignment:
      browse through the data sheet for your microcontroller
      compare the performance and development workflows for other architectures