A collection of various little projects for a Raspberry Pi Pico (rp2040 uC) written in Rust.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

4.7 KiB

Rust Raspberry Pi Pico / Rust rp2040 Resources

Setup your Rust installation for rp2040 development:

# Add the rp2040 CPU architecture:
rustup self update
rustup update stable
rustup target add thumbv6m-none-eabi

# Useful to creating UF2 images for the RP2040 USB Bootloader
cargo install elf2uf2-rs --locked

# Useful for flashing over the SWD pins using a supported JTAG probe
cargo install --git https://github.com/rp-rs/probe-run.git --branch rp2040-support 

# flip-link detect stack-overflows on the first core
# (which is the only supported target for now.)
cargo install flip-link

A broad overview of the rp2040 Rust ecosystem:

See also a another big link list about Embedded Rust here: https://github.com/rust-embedded/awesome-embedded-rust

Reading material

Determining rp2040 Rust Program Size on Flash and RAM

The easiest overview you can achieve with the size tool that comes with Linux:

./target/thumbv6m-none-eabi/release$ size rp2040-pwm-dac-sine-saw-synth
   text	   data	    bss	    dec	    hex	filename
  12176	     48	   1032	  13256	   33c8	rp2040-pwm-dac-sine-saw-synth
  • text is the program code, which resides in flash.
  • data is the static data of your program, which will end up in flash and RAM.
  • bss is uninitialized data, which will consume RAM.

You can also install binutils for cargo:

    cargo install cargo-binutils

    # also this, or otherwise you will get a "No such file or directory"
    # error when using `cargo nm`:
    rustup component add llvm-tools-preview

And then run cargo nm:

./rp2040_code/pwm_dac_saw_sampling$ cargo nm --release | sort
00000000 N {"package":"defmt","tag":"defmt_prim","data":"{=__internal_Display}","disambiguator":"14725451269531928465"}
...
10000000 r rp2040_pwm_dac_sine_saw_synth::BOOT2::h4551b8283fee8692
10002fe0 D __veneer_limit
2003fbc8 A _stack_start
...
20040000 B __sheap

The addresses starting with a 100* are in flash, and the addresses starting with 200* are in RAM.

If you want to know the size of the individual elements, you can use this command (which I found via cargo nm -h):

./p2040_code/pwm_dac_saw_sampling$ cargo nm --release -- --print-size --size-sort
100013f6 00000000 T ADC_IRQ_FIFO
...
100001f0 0000000a T main
...
100001fc 00000848 t rp2040_pwm_dac_sine_saw_synth::__cortex_m_rt_main::hff61f1c9c409d1f1

The second column is the size of the given symbols. As you can see, the main function which contains the most code is also the biggest. The numbers are in hexadecimal, so 0x848 are actually 2120 bytes.

See also: https://github.com/rust-embedded/cargo-binutils

Raspberry Pi Pico Pinout

Raspberry Pi Pico Pinout

Connecting the Raspberry Pi Pico Probe

Raspberry Pi Pico Connection

Assorted Projects / Crates