- Introduction
- 1. Background
- 2. Hardware/knowledge requirements
- 3. Setting up a development environment
- 3.1. Linux
- 3.2. Windows
- 3.3. macOS
- 3.4. Verify the installation
- 4. Meet your hardware
- 5. LED roulette
- 5.1. Build it
- 5.2. Flash it
- 5.3. Debug it
- 5.4. The led and delay abstractions
- 5.5. The challenge
- 5.6. My solution
- 6. Hello, world!
- 6.1. panic!
- 7. Registers
- 7.1. RTRM
- 7.2. (mis)Optimization
- 7.3. 0xBAAAAAAD address
- 7.4. Spooky action at a distance
- 7.5. Type safe manipulation
- 8. LEDs, again
- 8.1. Power
- 8.2. Configuration
- 8.3. The solution
- 9. Clocks and timers
- 9.1. for loop delays
- 9.2. NOP
- 9.3. One-shot timer
- 9.4. Initialization
- 9.5. Busy waiting
- 9.6. Putting it all together
- 10. Serial communication
- 10.1. *nix tooling
- 10.2. Windows tooling
- 10.3. Loopbacks
- 11. USART
- 11.1. Send a single byte
- 11.2. Send a string
- 11.3. Buffer overrun
- 11.4. uprintln!
- 11.5. Receive a single byte
- 11.6. Echo server
- 11.7. Reverse a string
- 11.8. My solution
- 12. Bluetooth setup
- 12.1. Linux
- 12.2. Loopback
- 12.3. AT commands
- 13. Serial over Bluetooth
- 14. I2C
- 14.1. The general protocol
- 14.2. LSM303DLHC
- 14.3. Read a single register
- 14.4. The solution
- 14.5. Read several registers
- 15. LED compass
- 15.1. Take 1
- 15.2. Solution 1
- 15.3. Take 2
- 15.4. Solution 2
- 15.5. Magnitude
- 15.6. Calibration
- 16. Punch-o-meter
- 16.1. Gravity is up?
- 16.2. The challenge
- 16.3. My solution
- 17. What's left for you to explore
- General troubleshooting
- How to use GDB