add manual overclock example, finalize API, cleanup
This commit is contained in:
@@ -1,9 +1,13 @@
|
||||
//! # Overclocking the RP2040 to 200 MHz
|
||||
//!
|
||||
//! This example demonstrates how to configure the RP2040 to run at 200 MHz using a higher level API.
|
||||
|
||||
#![no_std]
|
||||
#![no_main]
|
||||
|
||||
use defmt::*;
|
||||
use embassy_executor::Spawner;
|
||||
use embassy_rp::clocks::{clk_sys_freq, ClockConfig, VoltageScale};
|
||||
use embassy_rp::clocks::{clk_sys_freq, ClockConfig};
|
||||
use embassy_rp::config::Config;
|
||||
use embassy_rp::gpio::{Level, Output};
|
||||
use embassy_time::{Duration, Instant, Timer};
|
||||
@@ -15,15 +19,10 @@ const COUNT_TO: i64 = 10_000_000;
|
||||
async fn main(_spawner: Spawner) -> ! {
|
||||
// Set up for clock frequency of 200 MHz
|
||||
// This will set all the necessary defaults including slightly raised voltage
|
||||
// See embassy_rp::clocks::ClockConfig for more options, including full manual control
|
||||
let config = Config::new(ClockConfig::at_sys_frequency_mhz(200));
|
||||
|
||||
// Show the voltage scale and brownout-detection for verification
|
||||
// Show the voltage scale for verification
|
||||
info!("System core voltage: {}", Debug2Format(&config.clocks.voltage_scale));
|
||||
// info!(
|
||||
// "Brownout detection: {}",
|
||||
// Debug2Format(&config.clocks.brownout_detection)
|
||||
// );
|
||||
|
||||
// Initialize the peripherals
|
||||
let p = embassy_rp::init(config);
|
||||
@@ -64,14 +63,3 @@ async fn main(_spawner: Spawner) -> ! {
|
||||
Timer::after(Duration::from_secs(2)).await;
|
||||
}
|
||||
}
|
||||
|
||||
// let config = Config::new(ClockConfig::with_speed_mhz_test_voltage(125, Some(VoltageScale::V1_10)));
|
||||
// let config = Config::default();
|
||||
// let config = Config::new(ClockConfig::with_speed_mhz_test_voltage_extended_delay(
|
||||
// 200, // Standard 125MHz clock
|
||||
// Some(VoltageScale::V1_15), // 1.15V voltage
|
||||
// Some(1000), // 1000μs (1ms) stabilization delay - significantly longer than default
|
||||
// ));
|
||||
// Initialize the peripherals
|
||||
|
||||
// let p = embassy_rp::init(Default::default()); //testing the bog standard
|
||||
|
||||
81
examples/rp/src/bin/overclock_manual.rs
Normal file
81
examples/rp/src/bin/overclock_manual.rs
Normal file
@@ -0,0 +1,81 @@
|
||||
//! # Overclocking the RP2040 to 200 MHz manually
|
||||
//!
|
||||
//! This example demonstrates how to manually configure the RP2040 to run at 200 MHz.
|
||||
|
||||
#![no_std]
|
||||
#![no_main]
|
||||
|
||||
use defmt::*;
|
||||
use embassy_executor::Spawner;
|
||||
use embassy_rp::clocks;
|
||||
use embassy_rp::clocks::{ClockConfig, PllConfig, VoltageScale};
|
||||
use embassy_rp::config::Config;
|
||||
use embassy_rp::gpio::{Level, Output};
|
||||
use embassy_time::{Duration, Instant, Timer};
|
||||
use {defmt_rtt as _, panic_probe as _};
|
||||
|
||||
const COUNT_TO: i64 = 10_000_000;
|
||||
|
||||
/// Configure the RP2040 for 200 MHz operation by manually specifying
|
||||
/// all the required parameters instead of using higher-level APIs.
|
||||
fn configure_manual_overclock() -> Config {
|
||||
// Set the PLL configuration manually, starting from default values
|
||||
let mut config = Config::default();
|
||||
|
||||
// Set the system clock to 200 MHz using a PLL with a reference frequency of 12 MHz
|
||||
config.clocks = ClockConfig::manual_pll(
|
||||
12_000_000,
|
||||
PllConfig {
|
||||
refdiv: 1,
|
||||
fbdiv: 100,
|
||||
post_div1: 3,
|
||||
post_div2: 2,
|
||||
},
|
||||
// For 200 MHz, we need a voltage scale of 1.15V
|
||||
Some(VoltageScale::V1_15),
|
||||
);
|
||||
|
||||
config
|
||||
}
|
||||
|
||||
#[embassy_executor::main]
|
||||
async fn main(_spawner: Spawner) -> ! {
|
||||
// Initialize with our manual overclock configuration
|
||||
let p = embassy_rp::init(configure_manual_overclock());
|
||||
|
||||
// Verify the actual system clock frequency
|
||||
let sys_freq = clocks::clk_sys_freq();
|
||||
info!("System clock frequency: {} MHz", sys_freq / 1_000_000);
|
||||
|
||||
// LED to indicate the system is running
|
||||
let mut led = Output::new(p.PIN_25, Level::Low);
|
||||
|
||||
loop {
|
||||
// Reset the counter at the start of measurement period
|
||||
let mut counter = 0;
|
||||
|
||||
// Turn LED on while counting
|
||||
led.set_high();
|
||||
|
||||
let start = Instant::now();
|
||||
|
||||
// This is a busy loop that will take some time to complete
|
||||
while counter < COUNT_TO {
|
||||
counter += 1;
|
||||
}
|
||||
|
||||
let elapsed = Instant::now() - start;
|
||||
|
||||
// Report the elapsed time
|
||||
led.set_low();
|
||||
info!(
|
||||
"At {}Mhz: Elapsed time to count to {}: {}ms",
|
||||
sys_freq / 1_000_000,
|
||||
counter,
|
||||
elapsed.as_millis()
|
||||
);
|
||||
|
||||
// Wait 2 seconds before starting the next measurement
|
||||
Timer::after(Duration::from_secs(2)).await;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user