summaryrefslogtreecommitdiff
path: root/blinky/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'blinky/src/main.rs')
-rw-r--r--blinky/src/main.rs112
1 files changed, 112 insertions, 0 deletions
diff --git a/blinky/src/main.rs b/blinky/src/main.rs
new file mode 100644
index 0000000..c027b11
--- /dev/null
+++ b/blinky/src/main.rs
@@ -0,0 +1,112 @@
+//! # Pico Blinky Example
+//!
+//! Blinks the LED on a Pico board.
+//!
+//! This will blink an LED attached to GP25, which is the pin the Pico uses for
+//! the on-board LED.
+//!
+//! See the `Cargo.toml` file for Copyright and license details.
+
+#![no_std]
+#![no_main]
+
+// The macro for our start-up function
+use rp_pico::entry;
+
+// GPIO traits
+use embedded_hal::digital::OutputPin;
+
+// Ensure we halt the program on panic (if we don't mention this crate it won't
+// be linked)
+use panic_halt as _;
+
+// Pull in any important traits
+use rp_pico::hal::prelude::*;
+
+// A shorter alias for the Peripheral Access Crate, which provides low-level
+// register access
+use rp_pico::hal::pac;
+
+// A shorter alias for the Hardware Abstraction Layer, which provides
+// higher-level drivers.
+use rp_pico::hal;
+
+fn is_prime (a : u64) -> bool {
+ if a % 2 == 0 {return false};
+ for i in (3..a.isqrt()).step_by(2) {
+ if a % i == 0 {
+ return false;
+ }
+ }
+ return true;
+}
+
+fn find_next_smaller_prime(mut x : u64) -> u64 {
+ if x <= 1 {return x};
+ if x % 2 == 0 {x=x-1};
+ while !is_prime(x) {x = x - 2};
+ return x;
+}
+
+/// Entry point to our bare-metal application.
+///
+/// The `#[entry]` macro ensures the Cortex-M start-up code calls this function
+/// as soon as all global variables are initialised.
+///
+/// The function configures the RP2040 peripherals, then blinks the LED in an
+/// infinite loop.
+#[entry]
+fn main() -> ! {
+ // Grab our singleton objects
+ let mut pac = pac::Peripherals::take().unwrap();
+ let core = pac::CorePeripherals::take().unwrap();
+
+ // Set up the watchdog driver - needed by the clock setup code
+ let mut watchdog = hal::Watchdog::new(pac.WATCHDOG);
+
+ // Configure the clocks
+ //
+ // The default is to generate a 125 MHz system clock
+ let clocks = hal::clocks::init_clocks_and_plls(
+ rp_pico::XOSC_CRYSTAL_FREQ,
+ pac.XOSC,
+ pac.CLOCKS,
+ pac.PLL_SYS,
+ pac.PLL_USB,
+ &mut pac.RESETS,
+ &mut watchdog,
+ )
+ .ok()
+ .unwrap();
+
+ // The delay object lets us wait for specified amounts of time (in
+ // milliseconds)
+ let mut delay = cortex_m::delay::Delay::new(core.SYST, clocks.system_clock.freq().to_Hz());
+
+ // The single-cycle I/O block controls our GPIO pins
+ let sio = hal::Sio::new(pac.SIO);
+
+ // Set the pins up according to their function on this particular board
+ let pins = rp_pico::Pins::new(
+ pac.IO_BANK0,
+ pac.PADS_BANK0,
+ sio.gpio_bank0,
+ &mut pac.RESETS,
+ );
+
+ // Set the LED to be an output
+ let mut led_pin = pins.led.into_push_pull_output();
+
+ // Blink the LED at 1 Hz
+ loop {
+ led_pin.set_high().unwrap();
+ delay.delay_ms(500);
+ if find_next_smaller_prime(1<<36) > 5 {
+ led_pin.set_high().unwrap();
+ }
+ led_pin.set_low().unwrap();
+ delay.delay_ms(500);
+ }
+}
+
+// End of file \ No newline at end of file