76 lines
2.3 KiB
Markdown
76 lines
2.3 KiB
Markdown
|
|
# pico-blinky
|
||
|
|
|
||
|
|
Rust firmware for the Raspberry Pi Pico. Flashes the on-board LED with the
|
||
|
|
digits of pi: three flashes, a pause, one flash, a pause, four, one, five,
|
||
|
|
then a longer pause before it repeats.
|
||
|
|
|
||
|
|
## Board
|
||
|
|
|
||
|
|
This targets the **RP2040**, the original Pico. It will not run on a Pico 2.
|
||
|
|
Check which one you have by holding BOOTSEL while plugging it in and looking
|
||
|
|
at the volume that mounts:
|
||
|
|
|
||
|
|
| Volume label | Chip | This firmware |
|
||
|
|
|--------------|---------|---------------|
|
||
|
|
| `RPI-RP2` | RP2040 | yes |
|
||
|
|
| `RP2350` | RP2350 | no |
|
||
|
|
|
||
|
|
## Build
|
||
|
|
|
||
|
|
```
|
||
|
|
rustup target add thumbv6m-none-eabi
|
||
|
|
cargo install elf2uf2-rs --locked
|
||
|
|
cargo build --release
|
||
|
|
elf2uf2-rs target/thumbv6m-none-eabi/release/blinky pi-blink.uf2
|
||
|
|
```
|
||
|
|
|
||
|
|
## Flash
|
||
|
|
|
||
|
|
Hold the BOOTSEL button down **before** the cable goes in, keep it held for a
|
||
|
|
second after, then release. The button is only read at power-on, so pressing
|
||
|
|
it while the board is already running does nothing.
|
||
|
|
|
||
|
|
The board mounts as `RPI-RP2`. Copy the `.uf2` onto it. The volume ejects
|
||
|
|
itself once the write completes, which is the bootloader confirming it took
|
||
|
|
the image and jumped to it.
|
||
|
|
|
||
|
|
Prebuilt images are in `uf2/` if you just want to drag one across.
|
||
|
|
|
||
|
|
## Getting back into the bootloader
|
||
|
|
|
||
|
|
The firmware exposes a USB serial port, so after the first flash you do not
|
||
|
|
need the button again. Either:
|
||
|
|
|
||
|
|
- send `b` to the serial port, or
|
||
|
|
- open the port at 1200 baud and drop DTR, the convention `picotool` and the
|
||
|
|
Arduino IDE use
|
||
|
|
|
||
|
|
Both call `reset_to_usb_boot`, and the board comes back up as `RPI-RP2`.
|
||
|
|
|
||
|
|
The LED pattern is driven from the hardware timer rather than blocking sleeps,
|
||
|
|
so USB stays responsive while the sequence runs.
|
||
|
|
|
||
|
|
## Layout
|
||
|
|
|
||
|
|
```
|
||
|
|
src/main.rs pi digits + USB reboot-to-bootloader
|
||
|
|
alt/simple-blink.rs plain 250 ms on/off blink, the first version
|
||
|
|
memory.x flash/RAM layout, reserves 0x100 for the boot2 stage
|
||
|
|
build.rs puts memory.x on the linker search path
|
||
|
|
uf2/ prebuilt images
|
||
|
|
```
|
||
|
|
|
||
|
|
## Timing
|
||
|
|
|
||
|
|
Edit the constants at the top of `src/main.rs`:
|
||
|
|
|
||
|
|
```rust
|
||
|
|
const FLASH_ON_US: u64 = 150_000;
|
||
|
|
const FLASH_OFF_US: u64 = 200_000;
|
||
|
|
const DIGIT_GAP_US: u64 = 800_000;
|
||
|
|
const CYCLE_GAP_US: u64 = 3_000_000;
|
||
|
|
```
|
||
|
|
|
||
|
|
`DIGIT_GAP_US` is the one worth raising if the sequence is hard to count by
|
||
|
|
eye, since 1 and 4 sit next to each other and can run together.
|