Added first rp2040 code example
This commit is contained in:
parent
f281d32774
commit
29c325a94c
2
.gitignore
vendored
2
.gitignore
vendored
@ -1,3 +1,5 @@
|
||||
firmware/compile_commands.json
|
||||
firmware/.cache/clangd/index
|
||||
firmware/.ccls-cache
|
||||
rp2040/target
|
||||
rp2040/Cargo.lock
|
||||
|
||||
42
rp2040/.cargo/config
Normal file
42
rp2040/.cargo/config
Normal file
@ -0,0 +1,42 @@
|
||||
#
|
||||
# Cargo Configuration for the https://github.com/rp-rs/rp-hal.git repository.
|
||||
#
|
||||
# Copyright (c) The RP-RS Developers, 2021
|
||||
#
|
||||
# You might want to make a similar file in your own repository if you are
|
||||
# writing programs for Raspberry Silicon microcontrollers.
|
||||
#
|
||||
# This file is MIT or Apache-2.0 as per the repository README.md file
|
||||
#
|
||||
|
||||
[build]
|
||||
# Set the default target to match the Cortex-M0+ in the RP2040
|
||||
target = "thumbv6m-none-eabi"
|
||||
|
||||
# Target specific options
|
||||
[target.thumbv6m-none-eabi]
|
||||
# Pass some extra options to rustc, some of which get passed on to the linker.
|
||||
#
|
||||
# * linker argument --nmagic turns off page alignment of sections (which saves
|
||||
# flash space)
|
||||
# * linker argument -Tlink.x tells the linker to use link.x as the linker
|
||||
# script. This is usually provided by the cortex-m-rt crate, and by default
|
||||
# the version in that crate will include a file called `memory.x` which
|
||||
# describes the particular memory layout for your specific chip.
|
||||
# * inline-threshold=5 makes the compiler more aggressive and inlining functions
|
||||
# * no-vectorize-loops turns off the loop vectorizer (seeing as the M0+ doesn't
|
||||
# have SIMD)
|
||||
rustflags = [
|
||||
"-C", "link-arg=--nmagic",
|
||||
"-C", "link-arg=-Tlink.x",
|
||||
"-C", "inline-threshold=5",
|
||||
"-C", "no-vectorize-loops",
|
||||
]
|
||||
|
||||
# This runner will make a UF2 file and then copy it to a mounted RP2040 in USB
|
||||
# Bootloader mode:
|
||||
runner = "elf2uf2-rs -d"
|
||||
|
||||
# This runner will find a supported SWD debug probe and flash your RP2040 over
|
||||
# SWD:
|
||||
# runner = "probe-run --chip RP2040"
|
||||
45
rp2040/Cargo.toml
Normal file
45
rp2040/Cargo.toml
Normal file
@ -0,0 +1,45 @@
|
||||
[package]
|
||||
name = "rp2040"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
cortex-m = "0.7.2"
|
||||
waveshare-rp2040-zero = "0.6.0"
|
||||
rp2040-boot2 = { version = "0.2.0", optional = true }
|
||||
rp2040-hal = { version = "0.8.0" }
|
||||
cortex-m-rt = { version = "0.7", optional = true }
|
||||
panic-halt= "0.2.0"
|
||||
embedded-hal ="0.2.5"
|
||||
fugit = "0.3.5"
|
||||
nb = "1.0.0"
|
||||
smart-leds = "0.3.0"
|
||||
ws2812-pio = "0.6.0"
|
||||
|
||||
[features]
|
||||
# This is the set of features we enable by default
|
||||
default = ["boot2", "rt", "critical-section-impl", "rom-func-cache"]
|
||||
|
||||
# critical section that is safe for multicore use
|
||||
critical-section-impl = ["rp2040-hal/critical-section-impl"]
|
||||
|
||||
# 2nd stage bootloaders for rp2040
|
||||
boot2 = ["rp2040-boot2"]
|
||||
|
||||
# Minimal startup / runtime for Cortex-M microcontrollers
|
||||
rt = ["cortex-m-rt","rp2040-hal/rt"]
|
||||
|
||||
# This enables a fix for USB errata 5: USB device fails to exit RESET state on busy USB bus.
|
||||
# Only required for RP2040 B0 and RP2040 B1, but it doesn't hurt to enable it
|
||||
rp2040-e5 = ["rp2040-hal/rp2040-e5"]
|
||||
|
||||
# Memoize(cache) ROM function pointers on first use to improve performance
|
||||
rom-func-cache = ["rp2040-hal/rom-func-cache"]
|
||||
|
||||
# Disable automatic mapping of language features (like floating point math) to ROM functions
|
||||
disable-intrinsics = ["rp2040-hal/disable-intrinsics"]
|
||||
|
||||
# This enables ROM functions for f64 math that were not present in the earliest RP2040s
|
||||
rom-v2-intrinsics = ["rp2040-hal/rom-v2-intrinsics"]
|
||||
15
rp2040/memory.x
Normal file
15
rp2040/memory.x
Normal file
@ -0,0 +1,15 @@
|
||||
MEMORY {
|
||||
BOOT2 : ORIGIN = 0x10000000, LENGTH = 0x100
|
||||
FLASH : ORIGIN = 0x10000100, LENGTH = 2048K - 0x100
|
||||
RAM : ORIGIN = 0x20000000, LENGTH = 256K
|
||||
}
|
||||
|
||||
EXTERN(BOOT2_FIRMWARE)
|
||||
|
||||
SECTIONS {
|
||||
/* ### Boot loader */
|
||||
.boot2 ORIGIN(BOOT2) :
|
||||
{
|
||||
KEEP(*(.boot2));
|
||||
} > BOOT2
|
||||
} INSERT BEFORE .text;
|
||||
12
rp2040/pico-load
Executable file
12
rp2040/pico-load
Executable file
@ -0,0 +1,12 @@
|
||||
#!/bin/bash
|
||||
sudo umount /mnt/usb
|
||||
while [ ! -f /mnt/usb/INFO_UF2.TXT ]; do
|
||||
sudo mount /dev/sda1 /mnt/usb -o umask=000
|
||||
sleep 1
|
||||
done
|
||||
set -e
|
||||
# cargo build --release --example waveshare_rp2040_zero_neopixel_rainbow
|
||||
cargo run --release
|
||||
# elf2uf2-rs $1
|
||||
# cp $1.uf2 /mnt/usb
|
||||
sudo umount /mnt/usb
|
||||
76
rp2040/src/main.rs
Normal file
76
rp2040/src/main.rs
Normal file
@ -0,0 +1,76 @@
|
||||
//! Rainbow effect color wheel using the onboard NeoPixel on an Waveshare RP2040 Zero board
|
||||
//!
|
||||
//! This flows smoothly through various colors on the onboard NeoPixel.
|
||||
//! Uses the `ws2812_pio` driver to control the NeoPixel, which in turns uses the
|
||||
//! RP2040's PIO block.
|
||||
#![no_std]
|
||||
#![no_main]
|
||||
|
||||
use embedded_hal::timer::CountDown;
|
||||
use fugit::ExtU32;
|
||||
use panic_halt as _;
|
||||
use smart_leds::{SmartLedsWrite, RGB8};
|
||||
use waveshare_rp2040_zero::entry;
|
||||
use waveshare_rp2040_zero::{
|
||||
hal::{
|
||||
clocks::{init_clocks_and_plls, Clock},
|
||||
pac,
|
||||
pio::PIOExt,
|
||||
timer::Timer,
|
||||
watchdog::Watchdog,
|
||||
Sio,
|
||||
},
|
||||
Pins, XOSC_CRYSTAL_FREQ,
|
||||
};
|
||||
use ws2812_pio::Ws2812;
|
||||
|
||||
#[entry]
|
||||
fn main() -> ! {
|
||||
let mut pac = pac::Peripherals::take().unwrap();
|
||||
|
||||
let mut watchdog = Watchdog::new(pac.WATCHDOG);
|
||||
|
||||
let clocks = init_clocks_and_plls(
|
||||
XOSC_CRYSTAL_FREQ,
|
||||
pac.XOSC,
|
||||
pac.CLOCKS,
|
||||
pac.PLL_SYS,
|
||||
pac.PLL_USB,
|
||||
&mut pac.RESETS,
|
||||
&mut watchdog,
|
||||
)
|
||||
.ok()
|
||||
.unwrap();
|
||||
|
||||
let sio = Sio::new(pac.SIO);
|
||||
let pins = Pins::new(
|
||||
pac.IO_BANK0,
|
||||
pac.PADS_BANK0,
|
||||
sio.gpio_bank0,
|
||||
&mut pac.RESETS,
|
||||
);
|
||||
|
||||
let timer = Timer::new(pac.TIMER, &mut pac.RESETS);
|
||||
let mut delay = timer.count_down();
|
||||
|
||||
// Configure the addressable LED
|
||||
let (mut pio, sm0, _, _, _) = pac.PIO0.split(&mut pac.RESETS);
|
||||
let mut ws = Ws2812::new(
|
||||
// The onboard NeoPixel is attached to GPIO pin #16 on the Feather RP2040.
|
||||
pins.neopixel.into_mode(),
|
||||
&mut pio,
|
||||
sm0,
|
||||
clocks.peripheral_clock.freq(),
|
||||
timer.count_down(),
|
||||
);
|
||||
|
||||
// Infinite colour wheel loop
|
||||
loop {
|
||||
let color_green : RGB8 = (0, 10, 10).into();
|
||||
ws.write([color_green].iter().copied()).unwrap();
|
||||
|
||||
delay.start(25.millis());
|
||||
let _ = nb::block!(delay.wait());
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user