Embedded Systems 1

Introduction
This course is an introduction to bare-metal embedded systems programming. Assuming solid foundational knowledge of Rust, each lab should take 1 day, except the final project, which could take anywhere from a few days to multiple weeks. The time required is very approximate, and depends on the student's learning style and target thoroughness. This course is roughly equivalent to half of a semester-long college course.

The course will roughly follow the Embedded Rust Book (CC BY-SA 4.0), using it as assigned reading, and occasionally borrowing files and the like.

It is important to note that this course is for bare-metal programming, which entails things like modifying registers, configuring peripherals, and using interrupts. For a microcontroller course based on a higher level abstraction, consider Arduino

Prerequisites

 * Computer Architecture I
 * A very basic understanding of Git (cloning, committing, ignoring, what a repository is)
 * The Rust programming language

Platform Agnosticism
It would be ideal for this class to be platform-agnostic, but due to the nature of embedded systems and how they can go wrong, it would be ideal for students to use the same platform as the teacher. While the information presented and the experience gained will be easy to adapt to other platforms once learned, I cannot recommend highly enough to take this class using Linux, Rust, and the STM32 SoC. After completing this class, it may be straightforward to redo it on another platform, but troubleshooting issues without fully understanding the content may prove difficult. Optimally, this class will eventually support other platforms, but that is not currently a priority.

Terms

 * SoC (System on a Chip): Also known as a microcontroller, this will be the device you program in the course.
 * Debugger: Though there are many tools used for debugging, this term generally refers to a software program run on your computer to examine the states of various parts of your SoC, such as registers or memory locations.
 * Processor: Each SoC has a primary processing unit that runs the code that you put on it. Generally this will be either an ARM, Atmel, or RISC-V CPU.
 * Peripheral: A set of hardware devices, either built into your SoC or connected to it externally using the pins.
 * IC (Integrated Circuit): A circuit built into a single package, generally a flat black box with metal 'legs' sticking out of it. The SoC is an example of an IC.