# 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.

## Course Checklist

| Lesson Name | Description |
| Lab 00: Hello, World! | Get your code from your brain, through your computer, onto your target chip |
| Lab 01: Debugging | Enable communication between your computer and your chip so that you can more easily see what is going on inside of it |
| Lab 02: Types of data | An overview of the many types of data in embedded systems programming, and how using them differs from traditional computer programming |
| Lab 03: Input | Read digital and analog data from the outside world |
| Lab 03: Output | Write digital and analog data to the outside world |
| Lab 04: Timing | Measure time using a Timer peripheral |
| Lab 05: Communication protocols | Implement three of the most widely used communication protocols to interface your SoC to external ICs |
| Lab 06: Final project | Implement one of 3 different projects that uses all of the concepts from the course, or even better, design and create your own! |

## See Also

* Computer Programming