Rework hal initialization (#1970)

* Rework hal initialization

* Turn sw interrupt control into a virtual peripheral

* Return a tuple instead of a named struct

* Fix docs

* Remove SystemClockControl

* Move software interrupts under interrupt

* Re-document what's left in system

* Update time docs

* Update sw int docs

* Introduce Config

* Fix tests

* Remove redundant inits

* Doc

* Clean up examples&tests

* Update tests

* Add changelog entry

* Start migration guide

* Restore some convenience-imports

* Remove Config from prelude
This commit is contained in:
Dániel Buga 2024-09-02 15:38:46 +02:00 committed by GitHub
parent d60bafbf05
commit 447411fb58
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
180 changed files with 1413 additions and 2296 deletions

View File

@ -7,6 +7,7 @@ To help us review it efficiently, please ensure you've gone through the followin
- [ ] I have updated existing examples or added new ones (if applicable). - [ ] I have updated existing examples or added new ones (if applicable).
- [ ] I have used `cargo xtask fmt-packages` command to ensure that all changed code is formatted correctly. - [ ] I have used `cargo xtask fmt-packages` command to ensure that all changed code is formatted correctly.
- [ ] My changes were added to the [`CHANGELOG.md`](https://github.com/esp-rs/esp-hal/blob/main/esp-hal/CHANGELOG.md) in the **_proper_** section. - [ ] My changes were added to the [`CHANGELOG.md`](https://github.com/esp-rs/esp-hal/blob/main/esp-hal/CHANGELOG.md) in the **_proper_** section.
- [ ] I have added necessary changes to user code to the [Migration Guide](https://github.com/esp-rs/esp-hal/blob/main/esp-hal/MIGRATING-0.21.md).
- [ ] My changes are in accordance to the [esp-rs API guidelines](https://github.com/esp-rs/esp-hal/blob/main/documentation/API-GUIDELINES.md) - [ ] My changes are in accordance to the [esp-rs API guidelines](https://github.com/esp-rs/esp-hal/blob/main/documentation/API-GUIDELINES.md)
#### Extra: #### Extra:

View File

@ -84,11 +84,11 @@ By taking these extra steps to test your contributions, you help maintain the hi
Ensuring the quality and reliability of `esp-hal` is a shared responsibility, and testing plays a critical role in this process. Our GitHub CI automatically checks the buildability of all examples and drivers within the project. However, automated tests can't catch everything, especially when it comes to the nuanced behavior of hardware interactions. So make sure that the example affected by your change works as expected. Ensuring the quality and reliability of `esp-hal` is a shared responsibility, and testing plays a critical role in this process. Our GitHub CI automatically checks the buildability of all examples and drivers within the project. However, automated tests can't catch everything, especially when it comes to the nuanced behavior of hardware interactions. So make sure that the example affected by your change works as expected.
Further steps that can (or should) be taken in testing: Further steps that can (or should) be taken in testing:
* Using [xtask], build examples for the specified chip. * Using [xtask], build examples for the specified chip.
* Build the documentation and run the doctests if they have been modified using the `build-documentation` and `run-doc-test` commands in [xtask]. * Build the documentation and run the doctests if they have been modified using the `build-documentation` and `run-doc-test` commands in [xtask].
* Run the [HIL] tests locally if changes have been made to them. * Run the [HIL] tests locally if changes have been made to them.
[xtask]: https://github.com/esp-rs/esp-hal/tree/main/xtask [xtask]: https://github.com/esp-rs/esp-hal/tree/main/xtask
@ -122,6 +122,7 @@ This will use `rustfmt` to ensure that all source code is formatted correctly pr
* [Link your PR] to any relevant issues it addresses. * [Link your PR] to any relevant issues it addresses.
* [Allow edits from maintainers] so the branch can be updated for a merge. Once you submit your PR, a Docs team member will review your proposal. We may ask questions or request additional information. * [Allow edits from maintainers] so the branch can be updated for a merge. Once you submit your PR, a Docs team member will review your proposal. We may ask questions or request additional information.
* Make sure you add an entry with your changes to the [Changelog]. Also make sure that it is in the appropriate section of the document. * Make sure you add an entry with your changes to the [Changelog]. Also make sure that it is in the appropriate section of the document.
* Make sure you add your changes to the current [migration guide].
* We may ask for changes to be made before a PR can be merged, either using [suggested changes] or pull request comments. You can apply suggested changes directly through the UI. You can make any other changes in your fork, then commit them to your branch. * We may ask for changes to be made before a PR can be merged, either using [suggested changes] or pull request comments. You can apply suggested changes directly through the UI. You can make any other changes in your fork, then commit them to your branch.
* As you update your PR and apply changes, mark each conversation as [resolved]. * As you update your PR and apply changes, mark each conversation as [resolved].
* Resolve merge conflicts if they arise, using resources like [this git tutorial] for help. * Resolve merge conflicts if they arise, using resources like [this git tutorial] for help.
@ -129,6 +130,7 @@ This will use `rustfmt` to ensure that all source code is formatted correctly pr
[Link your PR]: https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue [Link your PR]: https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue
[Allow edits from maintainers]: https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/allowing-changes-to-a-pull-request-branch-created-from-a-forkmember [Allow edits from maintainers]: https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/allowing-changes-to-a-pull-request-branch-created-from-a-forkmember
[Changelog]: esp-hal/CHANGELOG.md [Changelog]: esp-hal/CHANGELOG.md
[migration guide]: esp-hal/MIGRATING-0.20.md
[suggested changes]: https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/reviewing-changes-in-pull-requests/incorporating-feedback-in-your-pull-request [suggested changes]: https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/reviewing-changes-in-pull-requests/incorporating-feedback-in-your-pull-request
[resolved]: https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/reviewing-changes-in-pull-requests/commenting-on-a-pull-request#resolving-conversations [resolved]: https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/reviewing-changes-in-pull-requests/commenting-on-a-pull-request#resolving-conversations
[this git tutorial]: https://github.com/skills/resolve-merge-conflicts [this git tutorial]: https://github.com/skills/resolve-merge-conflicts

View File

@ -5,8 +5,7 @@ use core::{cell::UnsafeCell, mem::MaybeUninit};
use embassy_executor::{raw, SendSpawner}; use embassy_executor::{raw, SendSpawner};
use esp_hal::{ use esp_hal::{
get_core, get_core,
interrupt::{self, InterruptHandler}, interrupt::{self, software::SoftwareInterrupt, InterruptHandler},
system::SoftwareInterrupt,
}; };
use portable_atomic::{AtomicUsize, Ordering}; use portable_atomic::{AtomicUsize, Ordering};

View File

@ -5,7 +5,7 @@ mod thread;
#[export_name = "__pender"] #[export_name = "__pender"]
fn __pender(context: *mut ()) { fn __pender(context: *mut ()) {
use esp_hal::system::SoftwareInterrupt; use esp_hal::interrupt::software::SoftwareInterrupt;
let context = (context as usize).to_le_bytes(); let context = (context as usize).to_le_bytes();

View File

@ -77,7 +77,7 @@ This will use software-interrupt 3 which isn't available for anything else to wa
pub fn new() -> Self { pub fn new() -> Self {
#[cfg(multi_core)] #[cfg(multi_core)]
unsafe { unsafe {
esp_hal::system::SoftwareInterrupt::<3>::steal() esp_hal::interrupt::software::SoftwareInterrupt::<3>::steal()
.set_interrupt_handler(software3_interrupt) .set_interrupt_handler(software3_interrupt)
} }

View File

@ -9,6 +9,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added ### Added
- Added `esp_hal::init` to simplify HAL initialisation (#1970)
### Changed ### Changed
### Fixed ### Fixed

26
esp-hal/MIGRATING-0.20.md Normal file
View File

@ -0,0 +1,26 @@
Migration Guide from 0.20.x to vNext
====================================
HAL initialsation
-----------------
Instead of manually grabbing peripherals and setting up clocks, you should now call `esp_hal::init`.
```diff
use esp_hal::{
- clock::ClockControl,
- peripherals::Peripherals,
prelude::*,
- system::SystemControl,
};
#[entry]
fn main() -> ! {
- let peripherals = Peripherals::take();
- let system = SystemControl::new(peripherals.SYSTEM);
- let clocks = ClockControl::boot_defaults(system.clock_control).freeze();
+ let (peripherals, clocks) = esp_hal::init(esp_hal::Config::default());
// ...
}
```

View File

@ -28,26 +28,30 @@
//! # let plaintext = b"message"; //! # let plaintext = b"message";
//! # let mut keybuf = [0_u8; 16]; //! # let mut keybuf = [0_u8; 16];
//! # keybuf[..keytext.len()].copy_from_slice(keytext); //! # keybuf[..keytext.len()].copy_from_slice(keytext);
//! let mut block_buf = [0_u8; 16]; //! #
//! block_buf[..plaintext.len()].copy_from_slice(plaintext); //! let mut block = [0_u8; 16];
//! let mut block = block_buf.clone(); //! block[..plaintext.len()].copy_from_slice(plaintext);
//! //!
//! let mut aes = Aes::new(peripherals.AES); //! let mut aes = Aes::new(peripherals.AES);
//! aes.process(&mut block, Mode::Encryption128, keybuf); //! aes.process(&mut block, Mode::Encryption128, keybuf);
//! let hw_encrypted = block.clone(); //!
//! // The encryption happens in-place, so the ciphertext is in `block`
//! //!
//! aes.process(&mut block, Mode::Decryption128, keybuf); //! aes.process(&mut block, Mode::Decryption128, keybuf);
//! let hw_decrypted = block; //!
//! // The decryption happens in-place, so the plaintext is in `block`
//! # } //! # }
//! ``` //! ```
//! //!
//! ### AES-DMA //! ### AES-DMA
//!
//! Visit the [AES-DMA] test for a more advanced example of using AES-DMA //! Visit the [AES-DMA] test for a more advanced example of using AES-DMA
//! mode. //! mode.
//! //!
//! [AES-DMA]: https://github.com/esp-rs/esp-hal/blob/main/hil-test/tests/aes_dma.rs //! [AES-DMA]: https://github.com/esp-rs/esp-hal/blob/main/hil-test/tests/aes_dma.rs
//! //!
//! ## Implementation State //! ## Implementation State
//!
//! * AES-DMA mode is currently not supported on ESP32 and ESP32S2 //! * AES-DMA mode is currently not supported on ESP32 and ESP32S2
//! * AES-DMA Initialization Vector (IV) is currently not supported //! * AES-DMA Initialization Vector (IV) is currently not supported

View File

@ -32,7 +32,6 @@
//! # use esp_hal::analog::adc::Adc; //! # use esp_hal::analog::adc::Adc;
//! # use esp_hal::delay::Delay; //! # use esp_hal::delay::Delay;
//! # use esp_hal::gpio::Io; //! # use esp_hal::gpio::Io;
//!
//! # let io = Io::new(peripherals.GPIO, peripherals.IO_MUX); //! # let io = Io::new(peripherals.GPIO, peripherals.IO_MUX);
#![cfg_attr(esp32, doc = "let analog_pin = io.pins.gpio32;")] #![cfg_attr(esp32, doc = "let analog_pin = io.pins.gpio32;")]
#![cfg_attr(any(esp32s2, esp32s3), doc = "let analog_pin = io.pins.gpio3;")] #![cfg_attr(any(esp32s2, esp32s3), doc = "let analog_pin = io.pins.gpio3;")]
@ -41,8 +40,10 @@
doc = "let analog_pin = io.pins.gpio2;" doc = "let analog_pin = io.pins.gpio2;"
)] )]
//! let mut adc1_config = AdcConfig::new(); //! let mut adc1_config = AdcConfig::new();
//! let mut pin = adc1_config.enable_pin(analog_pin, //! let mut pin = adc1_config.enable_pin(
//! Attenuation::Attenuation11dB); //! analog_pin,
//! Attenuation::Attenuation11dB,
//! );
//! let mut adc1 = Adc::new(peripherals.ADC1, adc1_config); //! let mut adc1 = Adc::new(peripherals.ADC1, adc1_config);
//! //!
//! let mut delay = Delay::new(&clocks); //! let mut delay = Delay::new(&clocks);
@ -54,8 +55,10 @@
//! } //! }
//! # } //! # }
//! ``` //! ```
//!
//! ## Implementation State //! ## Implementation State
//! - [ADC calibration is not implemented for all targets]. //!
//! - [ADC calibration is not implemented for all targets].
//! //!
//! [ADC calibration is not implemented for all targets]: https://github.com/esp-rs/esp-hal/issues/326 //! [ADC calibration is not implemented for all targets]: https://github.com/esp-rs/esp-hal/issues/326
use core::marker::PhantomData; use core::marker::PhantomData;

View File

@ -13,20 +13,14 @@
//! module clocks. //! module clocks.
//! //!
//! ## Configuration //! ## Configuration
//! Proper clock configuration is essential for the correct functioning of the
//! microcontroller and its peripherals.
//! //!
//! The `Clock` driver supports configuring multiple clocks, including: //! During HAL initialization, specify a CPU clock speed to configure the
//! * CPU clock //! desired clock frequencies.
//! * APB (Advanced Peripheral Bus) clock
//! * XTAL (External Crystal) clock
//! * PLL (Phase Lock Loop) clock
//!
//! and other specific clocks based on the ESP microcontroller's architecture.
//! //!
//! The `CPU clock` is responsible for defining the speed at which the central //! The `CPU clock` is responsible for defining the speed at which the central
//! processing unit (CPU) operates. This driver provides predefined options for //! processing unit (CPU) operates. This driver provides predefined options for
//! different CPU clock speeds, such //! different CPU clock speeds, such as
//!
//! * 80 MHz //! * 80 MHz
//! * 96 MHz //! * 96 MHz
//! * 120 MHz //! * 120 MHz
@ -35,52 +29,56 @@
//! //!
//! and others, depending on the microcontroller model. //! and others, depending on the microcontroller model.
//! //!
//! ### Clock Control
//! The `ClockControl` struct allows users to configure the desired clock
//! frequencies before applying them. It offers flexibility in selecting
//! appropriate clock frequencies based on specific application requirements.
//!
//! ### Frozen Clock Frequencies //! ### Frozen Clock Frequencies
//! Once the clock configuration is applied using the `freeze` function of the //!
//! ClockControl struct, the clock frequencies become `frozen` and cannot be //! Once the clock configuration is applied, the clock frequencies become
//! changed. The `Clocks` struct is returned after freezing, providing read-only //! `frozen` and cannot be changed. The `Clocks` struct is returned as part of
//! access to the configured clock frequencies. //! the `System` struct, providing read-only access to the configured clock
//! frequencies.
//! //!
//! ## Examples //! ## Examples
//!
//! ### Initialize With Different Clock Frequencies //! ### Initialize With Different Clock Frequencies
//! ```rust, no_run //! ```rust, no_run
//! # #![no_std] //! # #![no_std]
//! # use esp_hal::peripherals::Peripherals; //! # use esp_hal::prelude::*;
//! # use esp_hal::clock::ClockControl;
//! # use esp_hal::system::SystemControl;
//! # #[panic_handler] //! # #[panic_handler]
//! # fn panic(_ : &core::panic::PanicInfo) -> ! { //! # fn panic(_ : &core::panic::PanicInfo) -> ! {
//! # loop {} //! # loop {}
//! # } //! # }
//! # fn main() { //! # fn main() {
//! # let peripherals = Peripherals::take();
//! # let system = SystemControl::new(peripherals.SYSTEM);
//! // Initialize with the highest possible frequency for this chip //! // Initialize with the highest possible frequency for this chip
//! let clocks = ClockControl::max(system.clock_control).freeze(); //! let (peripherals, clocks) = esp_hal::init({
//! let mut config = esp_hal::Config::default();
//! config.cpu_clock = CpuClock::max();
//! config
//! });
//! //!
//! // Initialize with custom clock frequency //! // Initialize with custom clock frequency
//! // let clocks = ClockControl::configure(system.clock_control, CpuClock::Clock160MHz).freeze(); //! // let (peripherals, clocks) = esp_hal::init({
//! // let mut config = esp_hal::Config::default();
#![cfg_attr(
not(any(esp32c2, esp32h2)),
doc = "// config.cpu_clock = CpuClock::Clock160MHz;"
)]
#![cfg_attr(esp32c2, doc = "// config.cpu_clock = CpuClock::Clock120MHz;")]
#![cfg_attr(esp32h2, doc = "// config.cpu_clock = CpuClock::Clock96MHz;")]
//! // config
//! // });
//! // //! //
//! // Initialize with default clock frequency for this chip //! // Initialize with default clock frequency for this chip
//! // let clocks = ClockControl::boot_defaults(system.clock_control).freeze(); //! // let (peripherals, clocks) = esp_hal::init(esp_hal::Config::default());
//! # } //! # }
//! ``` //! ```
use core::marker::PhantomData;
use fugit::HertzU32; use fugit::HertzU32;
#[cfg(esp32c2)] #[cfg(esp32c2)]
use portable_atomic::{AtomicU32, Ordering}; use portable_atomic::{AtomicU32, Ordering};
#[cfg(any(esp32, esp32c2))] #[cfg(any(esp32, esp32c2))]
use crate::rtc_cntl::RtcClock; use crate::rtc_cntl::RtcClock;
use crate::{
peripheral::{Peripheral, PeripheralRef},
system::SystemClockControl,
};
#[cfg_attr(esp32, path = "clocks_ll/esp32.rs")] #[cfg_attr(esp32, path = "clocks_ll/esp32.rs")]
#[cfg_attr(esp32c2, path = "clocks_ll/esp32c2.rs")] #[cfg_attr(esp32c2, path = "clocks_ll/esp32c2.rs")]
@ -108,40 +106,63 @@ pub trait Clock {
} }
/// CPU clock speed /// CPU clock speed
#[derive(Debug, Clone, Copy)] #[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum CpuClock { pub enum CpuClock {
/// 80MHz CPU clock /// 80MHz CPU clock
#[cfg(not(esp32h2))] #[cfg(not(esp32h2))]
Clock80MHz, Clock80MHz = 80,
/// 96MHz CPU clock /// 96MHz CPU clock
#[cfg(esp32h2)] #[cfg(esp32h2)]
Clock96MHz, Clock96MHz = 96,
/// 120MHz CPU clock /// 120MHz CPU clock
#[cfg(esp32c2)] #[cfg(esp32c2)]
Clock120MHz, Clock120MHz = 120,
/// 160MHz CPU clock /// 160MHz CPU clock
#[cfg(not(any(esp32c2, esp32h2)))] #[cfg(not(any(esp32c2, esp32h2)))]
Clock160MHz, Clock160MHz = 160,
/// 240MHz CPU clock /// 240MHz CPU clock
#[cfg(xtensa)] #[cfg(xtensa)]
Clock240MHz, Clock240MHz = 240,
}
impl Default for CpuClock {
fn default() -> Self {
cfg_if::cfg_if! {
if #[cfg(esp32h2)] {
Self::Clock96MHz
} else {
// FIXME: I don't think this is correct in general?
Self::Clock80MHz
}
}
}
}
impl CpuClock {
/// Use the highest possible frequency for a particular chip.
pub const fn max() -> Self {
cfg_if::cfg_if! {
if #[cfg(esp32c2)] {
Self::Clock120MHz
} else if #[cfg(any(esp32c3, esp32c6))] {
Self::Clock160MHz
} else if #[cfg(esp32h2)] {
Self::Clock96MHz
} else {
Self::Clock240MHz
}
}
}
} }
#[allow(dead_code)]
impl Clock for CpuClock { impl Clock for CpuClock {
fn frequency(&self) -> HertzU32 { fn frequency(&self) -> HertzU32 {
match self { HertzU32::MHz(*self as u32)
#[cfg(not(esp32h2))]
CpuClock::Clock80MHz => HertzU32::MHz(80),
#[cfg(esp32h2)]
CpuClock::Clock96MHz => HertzU32::MHz(96),
#[cfg(esp32c2)]
CpuClock::Clock120MHz => HertzU32::MHz(120),
#[cfg(not(any(esp32c2, esp32h2)))]
CpuClock::Clock160MHz => HertzU32::MHz(160),
#[cfg(xtensa)]
CpuClock::Clock240MHz => HertzU32::MHz(240),
}
} }
} }
@ -257,81 +278,65 @@ impl Clock for ApbClock {
/// Frozen clock frequencies /// Frozen clock frequencies
/// ///
/// The instantiation of this type indicates that the clock configuration can no /// The instantiation of this type indicates that the clock configuration can no
/// longer be changed /// longer be changed.
pub struct Clocks<'d> { pub struct Clocks<'a> {
_private: PeripheralRef<'d, SystemClockControl>, _private: PhantomData<&'a ()>,
/// CPU clock frequency rates: RawClocks,
pub cpu_clock: HertzU32,
/// APB clock frequency
pub apb_clock: HertzU32,
/// XTAL clock frequency
pub xtal_clock: HertzU32,
/// I2C clock frequency
#[cfg(esp32)]
pub i2c_clock: HertzU32,
/// PWM clock frequency
#[cfg(esp32)]
pub pwm_clock: HertzU32,
/// Crypto PWM clock frequency
#[cfg(esp32s3)]
pub crypto_pwm_clock: HertzU32,
/// Crypto clock frequency
#[cfg(any(esp32c6, esp32h2))]
pub crypto_clock: HertzU32,
/// PLL 48M clock frequency (fixed)
#[cfg(esp32h2)]
pub pll_48m_clock: HertzU32,
/// PLL 96M clock frequency (fixed)
#[cfg(esp32h2)]
pub pll_96m_clock: HertzU32,
} }
#[doc(hidden)] impl<'a> Clocks<'a> {
impl<'d> Clocks<'d> {
/// This should not be used in user code. /// This should not be used in user code.
/// The whole point this exists is make it possible to have other crates /// The whole point this exists is make it possible to have other crates
/// (i.e. esp-wifi) create `Clocks` /// (i.e. esp-wifi) create `Clocks`
#[doc(hidden)] #[doc(hidden)]
pub fn from_raw_clocks( pub(crate) fn from_raw_clocks(raw_clocks: RawClocks) -> Clocks<'a> {
system_clock_control: PeripheralRef<'d, SystemClockControl>,
raw_clocks: RawClocks,
) -> Clocks<'d> {
Self { Self {
_private: system_clock_control, _private: PhantomData,
cpu_clock: raw_clocks.cpu_clock, rates: raw_clocks,
apb_clock: raw_clocks.apb_clock,
xtal_clock: raw_clocks.xtal_clock,
#[cfg(esp32)]
i2c_clock: raw_clocks.i2c_clock,
#[cfg(esp32)]
pwm_clock: raw_clocks.pwm_clock,
#[cfg(esp32s3)]
crypto_pwm_clock: raw_clocks.crypto_pwm_clock,
#[cfg(any(esp32c6, esp32h2))]
crypto_clock: raw_clocks.crypto_clock,
#[cfg(esp32h2)]
pll_48m_clock: raw_clocks.pll_48m_clock,
#[cfg(esp32h2)]
pll_96m_clock: raw_clocks.pll_96m_clock,
} }
} }
} }
#[doc(hidden)] impl core::ops::Deref for Clocks<'_> {
type Target = RawClocks;
fn deref(&self) -> &RawClocks {
&self.rates
}
}
/// The list of the clock frequencies that are used in the system.
pub struct RawClocks { pub struct RawClocks {
/// CPU clock frequency
pub cpu_clock: HertzU32, pub cpu_clock: HertzU32,
/// APB clock frequency
pub apb_clock: HertzU32, pub apb_clock: HertzU32,
/// XTAL clock frequency
pub xtal_clock: HertzU32, pub xtal_clock: HertzU32,
/// I2C clock frequency
#[cfg(esp32)] #[cfg(esp32)]
pub i2c_clock: HertzU32, pub i2c_clock: HertzU32,
/// PWM clock frequency
#[cfg(esp32)] #[cfg(esp32)]
pub pwm_clock: HertzU32, pub pwm_clock: HertzU32,
/// Crypto PWM clock frequency
#[cfg(esp32s3)] #[cfg(esp32s3)]
pub crypto_pwm_clock: HertzU32, pub crypto_pwm_clock: HertzU32,
/// Crypto clock frequency
#[cfg(any(esp32c6, esp32h2))] #[cfg(any(esp32c6, esp32h2))]
pub crypto_clock: HertzU32, pub crypto_clock: HertzU32,
/// PLL 48M clock frequency (fixed)
#[cfg(esp32h2)] #[cfg(esp32h2)]
pub pll_48m_clock: HertzU32, pub pll_48m_clock: HertzU32,
/// PLL 96M clock frequency (fixed)
#[cfg(esp32h2)] #[cfg(esp32h2)]
pub pll_96m_clock: HertzU32, pub pll_96m_clock: HertzU32,
} }
@ -360,72 +365,51 @@ cfg_if::cfg_if! {
/// ///
/// After setting all frequencies, call the freeze function to apply the /// After setting all frequencies, call the freeze function to apply the
/// configuration. /// configuration.
pub struct ClockControl<'d> { pub struct ClockControl {
_private: PeripheralRef<'d, SystemClockControl>,
desired_rates: RawClocks, desired_rates: RawClocks,
} }
impl<'d> ClockControl<'d> { impl ClockControl {
pub(crate) fn new(clock: CpuClock) -> Self {
Self::configure(clock)
}
/// Applies the clock configuration and returns a Clocks struct that /// Applies the clock configuration and returns a Clocks struct that
/// signifies that the clocks are frozen, and contains the frequencies /// signifies that the clocks are frozen, and contains the frequencies
/// used. After this function is called, the clocks can not change /// used. After this function is called, the clocks can not change
pub fn freeze(self) -> Clocks<'d> { pub fn freeze(self) -> Clocks<'static> {
Clocks::from_raw_clocks(self._private, self.desired_rates) Clocks::from_raw_clocks(self.desired_rates)
} }
} }
#[cfg(esp32)] #[cfg(esp32)]
impl<'d> ClockControl<'d> { impl ClockControl {
/// Use what is considered the default settings after boot.
pub fn boot_defaults(
clock_control: impl Peripheral<P = SystemClockControl> + 'd,
) -> ClockControl<'d> {
let xtal_freq = if RtcClock::estimate_xtal_frequency() > 33 {
40
} else {
26
};
ClockControl {
_private: clock_control.into_ref(),
desired_rates: RawClocks {
cpu_clock: HertzU32::MHz(80),
apb_clock: HertzU32::MHz(80),
xtal_clock: HertzU32::MHz(xtal_freq),
i2c_clock: HertzU32::MHz(80),
pwm_clock: HertzU32::MHz(160),
},
}
}
/// Configure the CPU clock speed. /// Configure the CPU clock speed.
pub fn configure( pub(crate) fn configure(cpu_clock_speed: CpuClock) -> ClockControl {
clock_control: impl Peripheral<P = SystemClockControl> + 'd,
cpu_clock_speed: CpuClock,
) -> ClockControl<'d> {
let xtal_freq = if RtcClock::estimate_xtal_frequency() > 33 { let xtal_freq = if RtcClock::estimate_xtal_frequency() > 33 {
XtalClock::RtcXtalFreq40M XtalClock::RtcXtalFreq40M
} else { } else {
XtalClock::RtcXtalFreq26M XtalClock::RtcXtalFreq26M
}; };
let pll_freq = match cpu_clock_speed { if cpu_clock_speed != CpuClock::default() {
CpuClock::Clock80MHz => PllClock::Pll320MHz, let pll_freq = match cpu_clock_speed {
CpuClock::Clock160MHz => PllClock::Pll320MHz, CpuClock::Clock80MHz => PllClock::Pll320MHz,
CpuClock::Clock240MHz => PllClock::Pll480MHz, CpuClock::Clock160MHz => PllClock::Pll320MHz,
}; CpuClock::Clock240MHz => PllClock::Pll480MHz,
};
clocks_ll::esp32_rtc_update_to_xtal(xtal_freq, 1); clocks_ll::esp32_rtc_update_to_xtal(xtal_freq, 1);
clocks_ll::esp32_rtc_bbpll_enable(); clocks_ll::esp32_rtc_bbpll_enable();
clocks_ll::esp32_rtc_bbpll_configure(xtal_freq, pll_freq); clocks_ll::esp32_rtc_bbpll_configure(xtal_freq, pll_freq);
clocks_ll::set_cpu_freq(cpu_clock_speed); clocks_ll::set_cpu_freq(cpu_clock_speed);
}
ClockControl { ClockControl {
_private: clock_control.into_ref(),
desired_rates: RawClocks { desired_rates: RawClocks {
cpu_clock: cpu_clock_speed.frequency(), cpu_clock: cpu_clock_speed.frequency(),
apb_clock: HertzU32::MHz(80), apb_clock: HertzU32::MHz(80),
xtal_clock: HertzU32::MHz(40), xtal_clock: HertzU32::MHz(xtal_freq.mhz()),
i2c_clock: HertzU32::MHz(80), i2c_clock: HertzU32::MHz(80),
// The docs are unclear here. pwm_clock seems to be tied to clocks.apb_clock // The docs are unclear here. pwm_clock seems to be tied to clocks.apb_clock
// while simultaneously being fixed at 160 MHz. // while simultaneously being fixed at 160 MHz.
@ -434,43 +418,12 @@ impl<'d> ClockControl<'d> {
}, },
} }
} }
/// Use the highest possible frequency for a particular chip
pub fn max(clock_control: impl Peripheral<P = SystemClockControl> + 'd) -> ClockControl<'d> {
Self::configure(clock_control, CpuClock::Clock240MHz)
}
} }
#[cfg(esp32c2)] #[cfg(esp32c2)]
impl<'d> ClockControl<'d> { impl ClockControl {
/// Use what is considered the default settings after boot.
pub fn boot_defaults(
clock_control: impl Peripheral<P = SystemClockControl> + 'd,
) -> ClockControl<'d> {
let xtal_freq = if RtcClock::estimate_xtal_frequency() > 33 {
40
} else {
26
};
XTAL_FREQ_MHZ.store(xtal_freq, Ordering::Relaxed);
ClockControl {
_private: clock_control.into_ref(),
desired_rates: RawClocks {
cpu_clock: HertzU32::MHz(80),
apb_clock: HertzU32::MHz(40),
xtal_clock: HertzU32::MHz(xtal_freq),
},
}
}
/// Configure the CPU clock speed. /// Configure the CPU clock speed.
pub fn configure( pub(crate) fn configure(cpu_clock_speed: CpuClock) -> ClockControl {
clock_control: impl Peripheral<P = SystemClockControl> + 'd,
cpu_clock_speed: CpuClock,
) -> ClockControl<'d> {
let apb_freq;
let xtal_freq = if RtcClock::estimate_xtal_frequency() > 33 { let xtal_freq = if RtcClock::estimate_xtal_frequency() > 33 {
XtalClock::RtcXtalFreq40M XtalClock::RtcXtalFreq40M
} else { } else {
@ -478,22 +431,26 @@ impl<'d> ClockControl<'d> {
}; };
XTAL_FREQ_MHZ.store(xtal_freq.mhz(), Ordering::Relaxed); XTAL_FREQ_MHZ.store(xtal_freq.mhz(), Ordering::Relaxed);
let pll_freq = PllClock::Pll480MHz; let apb_freq;
if cpu_clock_speed != CpuClock::default() {
let pll_freq = PllClock::Pll480MHz;
if cpu_clock_speed.mhz() <= xtal_freq.mhz() { if cpu_clock_speed.mhz() <= xtal_freq.mhz() {
apb_freq = ApbClock::ApbFreqOther(cpu_clock_speed.mhz()); apb_freq = ApbClock::ApbFreqOther(cpu_clock_speed.mhz());
clocks_ll::esp32c2_rtc_update_to_xtal(xtal_freq, 1); clocks_ll::esp32c2_rtc_update_to_xtal(xtal_freq, 1);
clocks_ll::esp32c2_rtc_apb_freq_update(apb_freq); clocks_ll::esp32c2_rtc_apb_freq_update(apb_freq);
} else {
apb_freq = ApbClock::ApbFreq40MHz;
clocks_ll::esp32c2_rtc_bbpll_enable();
clocks_ll::esp32c2_rtc_bbpll_configure(xtal_freq, pll_freq);
clocks_ll::esp32c2_rtc_freq_to_pll_mhz(cpu_clock_speed);
clocks_ll::esp32c2_rtc_apb_freq_update(apb_freq);
}
} else { } else {
apb_freq = ApbClock::ApbFreq40MHz; apb_freq = ApbClock::ApbFreq40MHz;
clocks_ll::esp32c2_rtc_bbpll_enable();
clocks_ll::esp32c2_rtc_bbpll_configure(xtal_freq, pll_freq);
clocks_ll::esp32c2_rtc_freq_to_pll_mhz(cpu_clock_speed);
clocks_ll::esp32c2_rtc_apb_freq_update(apb_freq);
} }
ClockControl { ClockControl {
_private: clock_control.into_ref(),
desired_rates: RawClocks { desired_rates: RawClocks {
cpu_clock: cpu_clock_speed.frequency(), cpu_clock: cpu_clock_speed.frequency(),
apb_clock: apb_freq.frequency(), apb_clock: apb_freq.frequency(),
@ -501,52 +458,33 @@ impl<'d> ClockControl<'d> {
}, },
} }
} }
/// Use the highest possible frequency for a particular chip
pub fn max(clock_control: impl Peripheral<P = SystemClockControl> + 'd) -> ClockControl<'d> {
Self::configure(clock_control, CpuClock::Clock120MHz)
}
} }
#[cfg(esp32c3)] #[cfg(esp32c3)]
impl<'d> ClockControl<'d> { impl ClockControl {
/// Use what is considered the default settings after boot.
pub fn boot_defaults(
clock_control: impl Peripheral<P = SystemClockControl> + 'd,
) -> ClockControl<'d> {
ClockControl {
_private: clock_control.into_ref(),
desired_rates: RawClocks {
cpu_clock: HertzU32::MHz(80),
apb_clock: HertzU32::MHz(80),
xtal_clock: HertzU32::MHz(40),
},
}
}
/// Configure the CPU clock speed. /// Configure the CPU clock speed.
pub fn configure( pub(crate) fn configure(cpu_clock_speed: CpuClock) -> ClockControl {
clock_control: impl Peripheral<P = SystemClockControl> + 'd,
cpu_clock_speed: CpuClock,
) -> ClockControl<'d> {
let apb_freq;
let xtal_freq = XtalClock::RtcXtalFreq40M; let xtal_freq = XtalClock::RtcXtalFreq40M;
let pll_freq = PllClock::Pll480MHz;
if cpu_clock_speed.mhz() <= xtal_freq.mhz() { let apb_freq;
apb_freq = ApbClock::ApbFreqOther(cpu_clock_speed.mhz()); if cpu_clock_speed != CpuClock::default() {
clocks_ll::esp32c3_rtc_update_to_xtal(xtal_freq, 1); if cpu_clock_speed.mhz() <= xtal_freq.mhz() {
clocks_ll::esp32c3_rtc_apb_freq_update(apb_freq); apb_freq = ApbClock::ApbFreqOther(cpu_clock_speed.mhz());
clocks_ll::esp32c3_rtc_update_to_xtal(xtal_freq, 1);
clocks_ll::esp32c3_rtc_apb_freq_update(apb_freq);
} else {
let pll_freq = PllClock::Pll480MHz;
apb_freq = ApbClock::ApbFreq80MHz;
clocks_ll::esp32c3_rtc_bbpll_enable();
clocks_ll::esp32c3_rtc_bbpll_configure(xtal_freq, pll_freq);
clocks_ll::esp32c3_rtc_freq_to_pll_mhz(cpu_clock_speed);
clocks_ll::esp32c3_rtc_apb_freq_update(apb_freq);
}
} else { } else {
apb_freq = ApbClock::ApbFreq80MHz; apb_freq = ApbClock::ApbFreq80MHz;
clocks_ll::esp32c3_rtc_bbpll_enable();
clocks_ll::esp32c3_rtc_bbpll_configure(xtal_freq, pll_freq);
clocks_ll::esp32c3_rtc_freq_to_pll_mhz(cpu_clock_speed);
clocks_ll::esp32c3_rtc_apb_freq_update(apb_freq);
} }
ClockControl { ClockControl {
_private: clock_control.into_ref(),
desired_rates: RawClocks { desired_rates: RawClocks {
cpu_clock: cpu_clock_speed.frequency(), cpu_clock: cpu_clock_speed.frequency(),
apb_clock: apb_freq.frequency(), apb_clock: apb_freq.frequency(),
@ -554,53 +492,33 @@ impl<'d> ClockControl<'d> {
}, },
} }
} }
/// Use the highest possible frequency for a particular chip
pub fn max(clock_control: impl Peripheral<P = SystemClockControl> + 'd) -> ClockControl<'d> {
Self::configure(clock_control, CpuClock::Clock160MHz)
}
} }
#[cfg(esp32c6)] #[cfg(esp32c6)]
impl<'d> ClockControl<'d> { impl ClockControl {
/// Use what is considered the default settings after boot.
pub fn boot_defaults(
clock_control: impl Peripheral<P = SystemClockControl> + 'd,
) -> ClockControl<'d> {
ClockControl {
_private: clock_control.into_ref(),
desired_rates: RawClocks {
cpu_clock: HertzU32::MHz(80),
apb_clock: HertzU32::MHz(80),
xtal_clock: HertzU32::MHz(40),
crypto_clock: HertzU32::MHz(160),
},
}
}
/// Configure the CPU clock speed. /// Configure the CPU clock speed.
pub fn configure( pub(crate) fn configure(cpu_clock_speed: CpuClock) -> ClockControl {
clock_control: impl Peripheral<P = SystemClockControl> + 'd,
cpu_clock_speed: CpuClock,
) -> ClockControl<'d> {
let apb_freq;
let xtal_freq = XtalClock::RtcXtalFreq40M; let xtal_freq = XtalClock::RtcXtalFreq40M;
let pll_freq = PllClock::Pll480MHz;
if cpu_clock_speed.mhz() <= xtal_freq.mhz() { let apb_freq;
apb_freq = ApbClock::ApbFreqOther(cpu_clock_speed.mhz()); if cpu_clock_speed != CpuClock::default() {
clocks_ll::esp32c6_rtc_update_to_xtal(xtal_freq, 1); if cpu_clock_speed.mhz() <= xtal_freq.mhz() {
clocks_ll::esp32c6_rtc_apb_freq_update(apb_freq); apb_freq = ApbClock::ApbFreqOther(cpu_clock_speed.mhz());
clocks_ll::esp32c6_rtc_update_to_xtal(xtal_freq, 1);
clocks_ll::esp32c6_rtc_apb_freq_update(apb_freq);
} else {
let pll_freq = PllClock::Pll480MHz;
apb_freq = ApbClock::ApbFreq80MHz;
clocks_ll::esp32c6_rtc_bbpll_enable();
clocks_ll::esp32c6_rtc_bbpll_configure(xtal_freq, pll_freq);
clocks_ll::esp32c6_rtc_freq_to_pll_mhz(cpu_clock_speed);
clocks_ll::esp32c6_rtc_apb_freq_update(apb_freq);
}
} else { } else {
apb_freq = ApbClock::ApbFreq80MHz; apb_freq = ApbClock::ApbFreq80MHz;
clocks_ll::esp32c6_rtc_bbpll_enable();
clocks_ll::esp32c6_rtc_bbpll_configure(xtal_freq, pll_freq);
clocks_ll::esp32c6_rtc_freq_to_pll_mhz(cpu_clock_speed);
clocks_ll::esp32c6_rtc_apb_freq_update(apb_freq);
} }
ClockControl { ClockControl {
_private: clock_control.into_ref(),
desired_rates: RawClocks { desired_rates: RawClocks {
cpu_clock: cpu_clock_speed.frequency(), cpu_clock: cpu_clock_speed.frequency(),
apb_clock: apb_freq.frequency(), apb_clock: apb_freq.frequency(),
@ -609,55 +527,33 @@ impl<'d> ClockControl<'d> {
}, },
} }
} }
/// Use the highest possible frequency for a particular chip
pub fn max(clock_control: impl Peripheral<P = SystemClockControl> + 'd) -> ClockControl<'d> {
Self::configure(clock_control, CpuClock::Clock160MHz)
}
} }
#[cfg(esp32h2)] #[cfg(esp32h2)]
impl<'d> ClockControl<'d> { impl ClockControl {
/// Use what is considered the default settings after boot.
pub fn boot_defaults(
clock_control: impl Peripheral<P = SystemClockControl> + 'd,
) -> ClockControl<'d> {
ClockControl {
_private: clock_control.into_ref(),
desired_rates: RawClocks {
cpu_clock: HertzU32::MHz(96),
apb_clock: HertzU32::MHz(32),
xtal_clock: HertzU32::MHz(32),
pll_48m_clock: HertzU32::MHz(48),
crypto_clock: HertzU32::MHz(96),
pll_96m_clock: HertzU32::MHz(96),
},
}
}
/// Configure the CPU clock speed. /// Configure the CPU clock speed.
pub fn configure( pub(crate) fn configure(cpu_clock_speed: CpuClock) -> ClockControl {
clock_control: impl Peripheral<P = SystemClockControl> + 'd,
cpu_clock_speed: CpuClock,
) -> ClockControl<'d> {
let apb_freq;
let xtal_freq = XtalClock::RtcXtalFreq32M; let xtal_freq = XtalClock::RtcXtalFreq32M;
let pll_freq = PllClock::Pll96MHz;
if cpu_clock_speed.mhz() <= xtal_freq.mhz() { let apb_freq;
apb_freq = ApbClock::ApbFreqOther(cpu_clock_speed.mhz()); if cpu_clock_speed != CpuClock::default() {
clocks_ll::esp32h2_rtc_update_to_xtal(xtal_freq, 1); if cpu_clock_speed.mhz() <= xtal_freq.mhz() {
clocks_ll::esp32h2_rtc_apb_freq_update(apb_freq); apb_freq = ApbClock::ApbFreqOther(cpu_clock_speed.mhz());
clocks_ll::esp32h2_rtc_update_to_xtal(xtal_freq, 1);
clocks_ll::esp32h2_rtc_apb_freq_update(apb_freq);
} else {
let pll_freq = PllClock::Pll96MHz;
apb_freq = ApbClock::ApbFreq32MHz;
clocks_ll::esp32h2_rtc_bbpll_enable();
clocks_ll::esp32h2_rtc_bbpll_configure(xtal_freq, pll_freq);
clocks_ll::esp32h2_rtc_freq_to_pll_mhz(cpu_clock_speed);
clocks_ll::esp32h2_rtc_apb_freq_update(apb_freq);
}
} else { } else {
apb_freq = ApbClock::ApbFreq32MHz; apb_freq = ApbClock::ApbFreq32MHz;
clocks_ll::esp32h2_rtc_bbpll_enable();
clocks_ll::esp32h2_rtc_bbpll_configure(xtal_freq, pll_freq);
clocks_ll::esp32h2_rtc_freq_to_pll_mhz(cpu_clock_speed);
clocks_ll::esp32h2_rtc_apb_freq_update(apb_freq);
} }
ClockControl { ClockControl {
_private: clock_control.into_ref(),
desired_rates: RawClocks { desired_rates: RawClocks {
cpu_clock: cpu_clock_speed.frequency(), cpu_clock: cpu_clock_speed.frequency(),
apb_clock: apb_freq.frequency(), apb_clock: apb_freq.frequency(),
@ -668,38 +564,17 @@ impl<'d> ClockControl<'d> {
}, },
} }
} }
/// Use the highest possible frequency for a particular chip
pub fn max(clock_control: impl Peripheral<P = SystemClockControl> + 'd) -> ClockControl<'d> {
Self::configure(clock_control, CpuClock::Clock96MHz)
}
} }
#[cfg(esp32s2)] #[cfg(esp32s2)]
impl<'d> ClockControl<'d> { impl ClockControl {
/// Use what is considered the default settings after boot.
pub fn boot_defaults(
clock_control: impl Peripheral<P = SystemClockControl> + 'd,
) -> ClockControl<'d> {
ClockControl {
_private: clock_control.into_ref(),
desired_rates: RawClocks {
cpu_clock: HertzU32::MHz(80),
apb_clock: HertzU32::MHz(80),
xtal_clock: HertzU32::MHz(40),
},
}
}
/// Configure the CPU clock speed. /// Configure the CPU clock speed.
pub fn configure( pub(crate) fn configure(cpu_clock_speed: CpuClock) -> ClockControl {
clock_control: impl Peripheral<P = SystemClockControl> + 'd, if cpu_clock_speed != CpuClock::default() {
cpu_clock_speed: CpuClock, clocks_ll::set_cpu_clock(cpu_clock_speed);
) -> ClockControl<'d> { }
clocks_ll::set_cpu_clock(cpu_clock_speed);
ClockControl { ClockControl {
_private: clock_control.into_ref(),
desired_rates: RawClocks { desired_rates: RawClocks {
cpu_clock: cpu_clock_speed.frequency(), cpu_clock: cpu_clock_speed.frequency(),
apb_clock: HertzU32::MHz(80), apb_clock: HertzU32::MHz(80),
@ -707,39 +582,17 @@ impl<'d> ClockControl<'d> {
}, },
} }
} }
/// Use the highest possible frequency for a particular chip
pub fn max(clock_control: impl Peripheral<P = SystemClockControl> + 'd) -> ClockControl<'d> {
Self::configure(clock_control, CpuClock::Clock240MHz)
}
} }
#[cfg(esp32s3)] #[cfg(esp32s3)]
impl<'d> ClockControl<'d> { impl ClockControl {
/// Use what is considered the default settings after boot.
pub fn boot_defaults(
clock_control: impl Peripheral<P = SystemClockControl> + 'd,
) -> ClockControl<'d> {
ClockControl {
_private: clock_control.into_ref(),
desired_rates: RawClocks {
cpu_clock: HertzU32::MHz(80),
apb_clock: HertzU32::MHz(80),
xtal_clock: HertzU32::MHz(40),
crypto_pwm_clock: HertzU32::MHz(160),
},
}
}
/// Configure the CPU clock speed. /// Configure the CPU clock speed.
pub fn configure( pub(crate) fn configure(cpu_clock_speed: CpuClock) -> ClockControl {
clock_control: impl Peripheral<P = SystemClockControl> + 'd, if cpu_clock_speed != CpuClock::default() {
cpu_clock_speed: CpuClock, clocks_ll::set_cpu_clock(cpu_clock_speed);
) -> ClockControl<'d> { }
clocks_ll::set_cpu_clock(cpu_clock_speed);
ClockControl { ClockControl {
_private: clock_control.into_ref(),
desired_rates: RawClocks { desired_rates: RawClocks {
cpu_clock: cpu_clock_speed.frequency(), cpu_clock: cpu_clock_speed.frequency(),
apb_clock: HertzU32::MHz(80), apb_clock: HertzU32::MHz(80),
@ -748,9 +601,4 @@ impl<'d> ClockControl<'d> {
}, },
} }
} }
/// Use the highest possible frequency for a particular chip
pub fn max(clock_control: impl Peripheral<P = SystemClockControl> + 'd) -> ClockControl<'d> {
Self::configure(clock_control, CpuClock::Clock240MHz)
}
} }

View File

@ -1,16 +1,18 @@
//! # Delay //! # Delay
//! //!
//! ## Overview //! ## Overview
//!
//! The Delay driver provides blocking delay functionalities using the //! The Delay driver provides blocking delay functionalities using the
//! `SYSTIMER` peripheral for RISC-V devices and the built-in Xtensa timer for //! [current_time] function.
//! Xtensa devices.
//! //!
//! ## Configuration //! ## Configuration
//!
//! The delays are implemented in a "best-effort" way, meaning that the CPU will //! The delays are implemented in a "best-effort" way, meaning that the CPU will
//! block for at least the amount of time specified, but accuracy can be //! block for at least the amount of time specified, but accuracy can be
//! affected by many factors, including interrupt usage. //! affected by many factors, including interrupt usage.
//! //!
//! ## Usage //! ## Usage
//!
//! This module implements the blocking [DelayMs] and [DelayUs] traits from //! This module implements the blocking [DelayMs] and [DelayUs] traits from
//! [embedded-hal], both 0.2.x and 1.x.x. //! [embedded-hal], both 0.2.x and 1.x.x.
//! //!
@ -29,6 +31,7 @@
//! [DelayMs]: embedded_hal_02::blocking::delay::DelayMs //! [DelayMs]: embedded_hal_02::blocking::delay::DelayMs
//! [DelayUs]: embedded_hal_02::blocking::delay::DelayUs //! [DelayUs]: embedded_hal_02::blocking::delay::DelayUs
//! [embedded-hal]: https://docs.rs/embedded-hal/1.0.0/embedded_hal/delay/index.html //! [embedded-hal]: https://docs.rs/embedded-hal/1.0.0/embedded_hal/delay/index.html
//! [current_time]: crate::time::current_time
pub use fugit::MicrosDurationU64; pub use fugit::MicrosDurationU64;

View File

@ -21,7 +21,6 @@
//! # use esp_hal::gpio::Io; //! # use esp_hal::gpio::Io;
//! # use esp_hal::spi::{master::Spi, SpiMode}; //! # use esp_hal::spi::{master::Spi, SpiMode};
//! # use esp_hal::dma::{Dma, DmaPriority}; //! # use esp_hal::dma::{Dma, DmaPriority};
//! # use crate::esp_hal::prelude::_fugit_RateExtU32;
//! let dma = Dma::new(peripherals.DMA); //! let dma = Dma::new(peripherals.DMA);
#![cfg_attr(any(esp32, esp32s2), doc = "let dma_channel = dma.spi2channel;")] #![cfg_attr(any(esp32, esp32s2), doc = "let dma_channel = dma.spi2channel;")]
#![cfg_attr(not(any(esp32, esp32s2)), doc = "let dma_channel = dma.channel0;")] #![cfg_attr(not(any(esp32, esp32s2)), doc = "let dma_channel = dma.channel0;")]
@ -31,7 +30,12 @@
//! let mosi = io.pins.gpio4; //! let mosi = io.pins.gpio4;
//! let cs = io.pins.gpio5; //! let cs = io.pins.gpio5;
//! //!
//! let mut spi = Spi::new(peripherals.SPI2, 100.kHz(), SpiMode::Mode0, &clocks) //! let mut spi = Spi::new(
//! peripherals.SPI2,
//! 100.kHz(),
//! SpiMode::Mode0,
//! &clocks
//! )
//! .with_pins(Some(sclk), Some(mosi), Some(miso), Some(cs)) //! .with_pins(Some(sclk), Some(mosi), Some(miso), Some(cs))
//! .with_dma(dma_channel.configure( //! .with_dma(dma_channel.configure(
//! false, //! false,
@ -43,10 +47,10 @@
//! ⚠️ Note: Descriptors should be sized as `(max_transfer_size + CHUNK_SIZE - 1) / CHUNK_SIZE`. //! ⚠️ Note: Descriptors should be sized as `(max_transfer_size + CHUNK_SIZE - 1) / CHUNK_SIZE`.
//! I.e., to transfer buffers of size `1..=CHUNK_SIZE`, you need 1 descriptor. //! I.e., to transfer buffers of size `1..=CHUNK_SIZE`, you need 1 descriptor.
//! //!
//! ⚠️ Note: For chips that support DMA to/from PSRAM (esp32s3) DMA transfers to/from PSRAM //! ⚠️ Note: For chips that support DMA to/from PSRAM (ESP32-S3) DMA transfers to/from PSRAM
//! have extra alignment requirements. The address and size of the buffer pointed to by //! have extra alignment requirements. The address and size of the buffer pointed to by
//! each descriptor must be a multiple of the cache line (block) size. This is 32 bytes //! each descriptor must be a multiple of the cache line (block) size. This is 32 bytes
//! on esp32s3. //! on ESP32-S3.
//! //!
//! For convenience you can use the [crate::dma_buffers] macro. //! For convenience you can use the [crate::dma_buffers] macro.
@ -288,7 +292,7 @@ mod gdma;
#[cfg(pdma)] #[cfg(pdma)]
mod pdma; mod pdma;
/// Kinds of interrupt to listen to /// Kinds of interrupt to listen to.
#[derive(EnumSetType)] #[derive(EnumSetType)]
pub enum DmaInterrupt { pub enum DmaInterrupt {
/// TX is done /// TX is done
@ -297,15 +301,21 @@ pub enum DmaInterrupt {
RxDone, RxDone,
} }
/// The default CHUNK_SIZE used for DMA transfers /// The default chunk size used for DMA transfers.
pub const CHUNK_SIZE: usize = 4092; pub const CHUNK_SIZE: usize = 4092;
/// Convenience macro to create DMA buffers and descriptors /// Convenience macro to create DMA buffers and descriptors.
/// ///
/// ## Usage /// ## Usage
/// ```rust,ignore /// ```rust,no_run
/// // TX and RX buffers are 32000 bytes - passing only one parameter makes TX and RX the same size #[doc = crate::before_snippet!()]
/// let (tx_buffer, tx_descriptors, rx_buffer, rx_descriptors) = dma_buffers!(32000, 32000); /// use esp_hal::dma_buffers;
///
/// // TX and RX buffers are 32000 bytes - passing only one parameter makes TX
/// // and RX the same size.
/// let (tx_buffer, tx_descriptors, rx_buffer, rx_descriptors) =
/// dma_buffers!(32000, 32000);
/// # }
/// ``` /// ```
#[macro_export] #[macro_export]
macro_rules! dma_buffers { macro_rules! dma_buffers {
@ -317,13 +327,18 @@ macro_rules! dma_buffers {
}; };
} }
/// Convenience macro to create circular DMA buffers and descriptors /// Convenience macro to create circular DMA buffers and descriptors.
/// ///
/// ## Usage /// ## Usage
/// ```rust,ignore /// ```rust,no_run
/// // TX and RX buffers are 32000 bytes - passing only one parameter makes TX and RX the same size #[doc = crate::before_snippet!()]
/// use esp_hal::dma_circular_buffers;
///
/// // TX and RX buffers are 32000 bytes - passing only one parameter makes TX
/// // and RX the same size.
/// let (tx_buffer, tx_descriptors, rx_buffer, rx_descriptors) = /// let (tx_buffer, tx_descriptors, rx_buffer, rx_descriptors) =
/// dma_circular_buffers!(32000, 32000); /// dma_circular_buffers!(32000, 32000);
/// # }
/// ``` /// ```
#[macro_export] #[macro_export]
macro_rules! dma_circular_buffers { macro_rules! dma_circular_buffers {
@ -336,12 +351,17 @@ macro_rules! dma_circular_buffers {
}; };
} }
/// Convenience macro to create DMA descriptors /// Convenience macro to create DMA descriptors.
/// ///
/// ## Usage /// ## Usage
/// ```rust,ignore /// ```rust,no_run
/// // Create TX and RX descriptors for transactions up to 32000 bytes - passing only one parameter assumes TX and RX are the same size #[doc = crate::before_snippet!()]
/// use esp_hal::dma_descriptors;
///
/// // Create TX and RX descriptors for transactions up to 32000 bytes - passing
/// // only one parameter assumes TX and RX are the same size.
/// let (tx_descriptors, rx_descriptors) = dma_descriptors!(32000, 32000); /// let (tx_descriptors, rx_descriptors) = dma_descriptors!(32000, 32000);
/// # }
/// ``` /// ```
#[macro_export] #[macro_export]
macro_rules! dma_descriptors { macro_rules! dma_descriptors {
@ -354,12 +374,18 @@ macro_rules! dma_descriptors {
}; };
} }
/// Convenience macro to create circular DMA descriptors /// Convenience macro to create circular DMA descriptors.
/// ///
/// ## Usage /// ## Usage
/// ```rust,ignore /// ```rust,no_run
/// // Create TX and RX descriptors for transactions up to 32000 bytes - passing only one parameter assumes TX and RX are the same size #[doc = crate::before_snippet!()]
/// let (tx_descriptors, rx_descriptors) = dma_circular_descriptors!(32000, 32000); /// use esp_hal::dma_circular_descriptors;
///
/// // Create TX and RX descriptors for transactions up to 32000
/// // bytes - passing only one parameter assumes TX and RX are the same size.
/// let (tx_descriptors, rx_descriptors) =
/// dma_circular_descriptors!(32000, 32000);
/// # }
/// ``` /// ```
#[macro_export] #[macro_export]
macro_rules! dma_circular_descriptors { macro_rules! dma_circular_descriptors {
@ -373,12 +399,18 @@ macro_rules! dma_circular_descriptors {
} }
/// Convenience macro to create DMA buffers and descriptors with specific chunk /// Convenience macro to create DMA buffers and descriptors with specific chunk
/// size /// size.
/// ///
/// ## Usage /// ## Usage
/// ```rust,ignore /// ```rust,no_run
/// // TX and RX buffers are 32000 bytes - passing only one parameter makes TX and RX the same size #[doc = crate::before_snippet!()]
/// let (tx_buffer, tx_descriptors, rx_buffer, rx_descriptors) = dma_buffers!(32000, 32000, 4032); /// use esp_hal::dma_buffers_chunk_size;
///
/// // TX and RX buffers are 32000 bytes - passing only one parameter makes TX
/// // and RX the same size.
/// let (tx_buffer, tx_descriptors, rx_buffer, rx_descriptors) =
/// dma_buffers_chunk_size!(32000, 32000, 4032);
/// # }
/// ``` /// ```
#[macro_export] #[macro_export]
macro_rules! dma_buffers_chunk_size { macro_rules! dma_buffers_chunk_size {
@ -403,13 +435,18 @@ macro_rules! dma_buffers_chunk_size {
} }
/// Convenience macro to create circular DMA buffers and descriptors with /// Convenience macro to create circular DMA buffers and descriptors with
/// specific chunk size /// specific chunk size.
/// ///
/// ## Usage /// ## Usage
/// ```rust,ignore /// ```rust,no_run
/// // TX and RX buffers are 32000 bytes - passing only one parameter makes TX and RX the same size #[doc = crate::before_snippet!()]
/// use esp_hal::dma_circular_buffers_chunk_size;
///
/// // TX and RX buffers are 32000 bytes - passing only one parameter makes TX
/// // and RX the same size.
/// let (tx_buffer, tx_descriptors, rx_buffer, rx_descriptors) = /// let (tx_buffer, tx_descriptors, rx_buffer, rx_descriptors) =
/// dma_circular_buffers!(32000, 32000, 4032); /// dma_circular_buffers_chunk_size!(32000, 32000, 4032);
/// # }
/// ``` /// ```
#[macro_export] #[macro_export]
macro_rules! dma_circular_buffers_chunk_size { macro_rules! dma_circular_buffers_chunk_size {
@ -436,9 +473,15 @@ macro_rules! dma_circular_buffers_chunk_size {
/// Convenience macro to create DMA descriptors with specific chunk size /// Convenience macro to create DMA descriptors with specific chunk size
/// ///
/// ## Usage /// ## Usage
/// ```rust,ignore /// ```rust,no_run
/// // Create TX and RX descriptors for transactions up to 32000 bytes - passing only one parameter assumes TX and RX are the same size #[doc = crate::before_snippet!()]
/// let (tx_descriptors, rx_descriptors) = dma_descriptors_chunk_size!(32000, 32000, 4032); /// use esp_hal::dma_descriptors_chunk_size;
///
/// // Create TX and RX descriptors for transactions up to 32000 bytes - passing
/// // only one parameter assumes TX and RX are the same size.
/// let (tx_descriptors, rx_descriptors) =
/// dma_descriptors_chunk_size!(32000, 32000, 4032);
/// # }
/// ``` /// ```
#[macro_export] #[macro_export]
macro_rules! dma_descriptors_chunk_size { macro_rules! dma_descriptors_chunk_size {
@ -465,9 +508,15 @@ macro_rules! dma_descriptors_chunk_size {
/// size /// size
/// ///
/// ## Usage /// ## Usage
/// ```rust,ignore /// ```rust,no_run
/// // Create TX and RX descriptors for transactions up to 32000 bytes - passing only one parameter assumes TX and RX are the same size #[doc = crate::before_snippet!()]
/// let (tx_descriptors, rx_descriptors) = dma_circular_descriptors!(32000, 32000, 4032); /// use esp_hal::dma_circular_descriptors_chunk_size;
///
/// // Create TX and RX descriptors for transactions up to 32000 bytes - passing
/// // only one parameter assumes TX and RX are the same size.
/// let (tx_descriptors, rx_descriptors) =
/// dma_circular_descriptors_chunk_size!(32000, 32000, 4032);
/// # }
/// ``` /// ```
#[macro_export] #[macro_export]
macro_rules! dma_circular_descriptors_chunk_size { macro_rules! dma_circular_descriptors_chunk_size {

View File

@ -1,10 +1,12 @@
//! RTC IO //! RTC IO
//! //!
//! # Overview //! # Overview
//!
//! The hardware provides a couple of GPIO pins with low power (LP) //! The hardware provides a couple of GPIO pins with low power (LP)
//! capabilities and analog functions. //! capabilities and analog functions.
//! //!
//! ## Configuration //! ## Configuration
//!
//! These pins can be controlled by either IO MUX or RTC IO. //! These pins can be controlled by either IO MUX or RTC IO.
//! //!
//! If controlled by RTC IO, these pins will bypass IO MUX and GPIO //! If controlled by RTC IO, these pins will bypass IO MUX and GPIO
@ -14,12 +16,18 @@
//! the peripherals in RTC system during chip Deep-sleep, and wake up the //! the peripherals in RTC system during chip Deep-sleep, and wake up the
//! chip from Deep-sleep. //! chip from Deep-sleep.
//! //!
//! # Example //! ## Example
//! ## Configure a ULP Pin as Output //!
//! ```rust, ignore //! ### Configure a ULP Pin as Output
//!
//! ```rust, no_run
#![doc = crate::before_snippet!()]
//! # use esp_hal::gpio::rtc_io::LowPowerOutput;
//! # use esp_hal::gpio::Io;
//! let io = Io::new(peripherals.GPIO, peripherals.IO_MUX); //! let io = Io::new(peripherals.GPIO, peripherals.IO_MUX);
//! // configure GPIO 1 as ULP output pin //! // configure GPIO 1 as ULP output pin
//! let lp_pin = LowPowerOutput::new(io.pins.gpio1); //! let lp_pin = LowPowerOutput::<'static, 1>::new(io.pins.gpio1);
//! # }
//! ``` //! ```
use core::marker::PhantomData; use core::marker::PhantomData;

View File

@ -5,54 +5,38 @@
//! same bus. I2C uses two bidirectional open-drain lines: serial data line //! same bus. I2C uses two bidirectional open-drain lines: serial data line
//! (SDA) and serial clock line (SCL), pulled up by resistors. //! (SDA) and serial clock line (SCL), pulled up by resistors.
//! //!
//! Espressif devices sometimes have more than one I2C controller (also called //! Espressif devices sometimes have more than one I2C controller, responsible
//! port), responsible for handling communication on the I2C bus. A single I2C //! for handling communication on the I2C bus. A single I2C controller can be
//! controller can be a master or a slave. //! a master or a slave.
//! //!
//! Typically, an I2C slave device has a 7-bit address or 10-bit address. //! Typically, an I2C slave device has a 7-bit address or 10-bit address.
//! Espressif devices supports both I2C Standard-mode (Sm) and Fast-mode //! Devices supports both I2C Standard-mode (Sm) and Fast-mode (Fm) which can
//! (Fm) which can go up to 100KHz and 400KHz respectively. //! go up to 100KHz and 400KHz respectively.
//! //!
//! ## Configuration //! ## Configuration
//! //!
//! Each I2C controller is individually configurable, and the usual setting //! Each I2C controller is individually configurable, and the usual setting
//! such as frequency, timeout, and SDA/SCL pins can easily be configured. //! such as frequency, timeout, and SDA/SCL pins can easily be configured.
//! //!
//! ```rust, no_run
#![doc = crate::before_snippet!()]
//! # use esp_hal::i2c::I2C;
//! # use esp_hal::gpio::Io;
//! # use crate::esp_hal::prelude::_fugit_RateExtU32;
//! let io = Io::new(peripherals.GPIO, peripherals.IO_MUX);
//! // Create a new peripheral object with the described wiring
//! // and standard I2C clock speed
//! let mut i2c = I2C::new(
//! peripherals.I2C0,
//! io.pins.gpio1,
//! io.pins.gpio2,
//! 100.kHz(),
//! &clocks,
//! );
//! # }
//! ```
//!
//! ## Usage //! ## Usage
//! //!
//! The I2C driver implements a number of third-party traits, with the //! The I2C driver implements a number of third-party traits, with the
//! intention of making the HAL inter-compatible with various device drivers //! intention of making the HAL inter-compatible with various device drivers
//! from the community. This includes the [embedded-hal] for both 0.2.x and //! from the community. This includes the [embedded-hal] for both 0.2.x and
//! 1.x.x versions. //! 1.0.x versions.
//! //!
//! ## Examples //! ## Examples
//!
//! ### Read Data from a BMP180 Sensor //! ### Read Data from a BMP180 Sensor
//!
//! ```rust, no_run //! ```rust, no_run
#![doc = crate::before_snippet!()] #![doc = crate::before_snippet!()]
//! # use esp_hal::i2c::I2C; //! # use esp_hal::i2c::I2C;
//! # use esp_hal::gpio::Io; //! # use esp_hal::gpio::Io;
//! # use crate::esp_hal::prelude::_fugit_RateExtU32;
//! let io = Io::new(peripherals.GPIO, peripherals.IO_MUX); //! let io = Io::new(peripherals.GPIO, peripherals.IO_MUX);
//!
//! // Create a new peripheral object with the described wiring //! // Create a new peripheral object with the described wiring
//! // and standard I2C clock speed //! // and standard I2C clock speed.
//! let mut i2c = I2C::new( //! let mut i2c = I2C::new(
//! peripherals.I2C0, //! peripherals.I2C0,
//! io.pins.gpio1, //! io.pins.gpio1,
@ -60,6 +44,7 @@
//! 100.kHz(), //! 100.kHz(),
//! &clocks, //! &clocks,
//! ); //! );
//!
//! loop { //! loop {
//! let mut data = [0u8; 22]; //! let mut data = [0u8; 22];
//! i2c.write_read(0x77, &[0xaa], &mut data).ok(); //! i2c.write_read(0x77, &[0xaa], &mut data).ok();

View File

@ -1,14 +1,15 @@
//! # Inter-IC Sound (I2S) //! # Inter-IC Sound (I2S)
//! //!
//! ## Overview //! ## Overview
//!
//! I2S (Inter-IC Sound) is a synchronous serial communication protocol usually //! I2S (Inter-IC Sound) is a synchronous serial communication protocol usually
//! used for transmitting audio data between two digital audio devices. //! used for transmitting audio data between two digital audio devices.
//! Espressif devices may contain more than one I2S peripheral(s). These //! Espressif devices may contain more than one I2S peripheral(s). These
//! peripherals can be configured to input and output sample data via the I2S //! peripherals can be configured to input and output sample data via the I2S
//! driver. //! driver.
//! //!
//!
//! ## Configuration //! ## Configuration
//!
//! I2S supports different data formats, including varying data and channel //! I2S supports different data formats, including varying data and channel
//! widths, different standards, such as the Philips standard and configurable //! widths, different standards, such as the Philips standard and configurable
//! pin mappings for I2S clock (BCLK), word select (WS), and data input/output //! pin mappings for I2S clock (BCLK), word select (WS), and data input/output
@ -18,24 +19,23 @@
//! supports various configurations, such as different data formats, standards //! supports various configurations, such as different data formats, standards
//! (e.g., Philips) and pin configurations. It relies on other peripheral //! (e.g., Philips) and pin configurations. It relies on other peripheral
//! modules, such as //! modules, such as
//! - `GPIO` //! - `GPIO`
//! - `DMA` //! - `DMA`
//! - `system` (to configure and enable the I2S peripheral) //! - `system` (to configure and enable the I2S peripheral)
//!
//! ## Example
//! //!
//! ## Examples
//! ### Initialization //! ### Initialization
//!
//! ```rust, no_run //! ```rust, no_run
#![doc = crate::before_snippet!()] #![doc = crate::before_snippet!()]
//! # use esp_hal::i2s::I2s; //! # use esp_hal::i2s::I2s;
//! # use esp_hal::i2s::Standard; //! # use esp_hal::i2s::Standard;
//! # use esp_hal::i2s::DataFormat; //! # use esp_hal::i2s::DataFormat;
//! # use esp_hal::i2s::I2sReadDma;
//! # use esp_hal::gpio::Io; //! # use esp_hal::gpio::Io;
//! # use esp_hal::dma_buffers; //! # use esp_hal::dma_buffers;
//! # use esp_hal::dma::{Dma, DmaPriority}; //! # use esp_hal::dma::{Dma, DmaPriority};
//! # use crate::esp_hal::prelude::_fugit_RateExtU32;
//! # use crate::esp_hal::peripherals::Peripherals;
//! # use crate::esp_hal::i2s::I2sReadDma;
//! # use core::ptr::addr_of_mut;
//! # let io = Io::new(peripherals.GPIO, peripherals.IO_MUX); //! # let io = Io::new(peripherals.GPIO, peripherals.IO_MUX);
//! let dma = Dma::new(peripherals.DMA); //! let dma = Dma::new(peripherals.DMA);
#![cfg_attr(any(esp32, esp32s2), doc = "let dma_channel = dma.i2s0channel;")] #![cfg_attr(any(esp32, esp32s2), doc = "let dma_channel = dma.i2s0channel;")]

View File

@ -30,43 +30,35 @@
//! //!
//! ```rust, no_run //! ```rust, no_run
#![doc = crate::before_snippet!()] #![doc = crate::before_snippet!()]
//! # use core::cell::RefCell; //! let mut sw_int =
//! SoftwareInterruptControl::new(peripherals.SW_INTERRUPT);
//! critical_section::with(|cs| {
//! sw_int
//! .software_interrupt0
//! .set_interrupt_handler(swint0_handler);
//! SWINT0
//! .borrow_ref_mut(cs)
//! .replace(sw_int.software_interrupt0);
//! });
//! //!
//! critical_section::with(|cs| {
//! SWINT0.borrow_ref(cs).as_ref().unwrap().raise();
//! });
//! #
//! # loop {}
//! # }
//!
//! # use core::cell::RefCell;
//! #
//! # use critical_section::Mutex; //! # use critical_section::Mutex;
//! # use esp_hal::{ //! # use esp_hal::interrupt::software::{SoftwareInterrupt, SoftwareInterruptControl};
//! # prelude::*,
//! # system::{SoftwareInterrupt, SystemControl},
//! # };
//! # use esp_hal::interrupt::Priority; //! # use esp_hal::interrupt::Priority;
//! # use esp_hal::interrupt::InterruptHandler; //! # use esp_hal::interrupt::InterruptHandler;
//! //! #
//! static SWINT0: Mutex<RefCell<Option<SoftwareInterrupt<0>>>> = //! static SWINT0: Mutex<RefCell<Option<SoftwareInterrupt<0>>>> =
//! Mutex::new(RefCell::new(None)); //! Mutex::new(RefCell::new(None));
//! //!
//! let mut sw_int = system.software_interrupt_control; //! #[handler(priority = Priority::Priority1)]
//! critical_section::with(|cs| {
//! sw_int
//! .software_interrupt0
//! .set_interrupt_handler(swint0_handler);
//! SWINT0
//! .borrow_ref_mut(cs)
//! .replace(sw_int.software_interrupt0);
//! });
//!
//! critical_section::with(|cs| {
//! SWINT0.borrow_ref(cs).as_ref().unwrap().raise();
//! });
//!
//! loop {}
//! }
//!
//! # use procmacros::handler;
//! # use esp_hal::interrupt;
//! # use critical_section::Mutex;
//! # use core::cell::RefCell;
//! # use esp_hal::system::SoftwareInterrupt;
//! # static SWINT0: Mutex<RefCell<Option<SoftwareInterrupt<0>>>> = Mutex::new(RefCell::new(None));
//! #[handler(priority = esp_hal::interrupt::Priority::Priority1)]
//! fn swint0_handler() { //! fn swint0_handler() {
//! // esp_println::println!("SW interrupt0"); //! // esp_println::println!("SW interrupt0");
//! critical_section::with(|cs| { //! critical_section::with(|cs| {
@ -87,6 +79,8 @@ mod riscv;
#[cfg(xtensa)] #[cfg(xtensa)]
mod xtensa; mod xtensa;
pub mod software;
/// An interrupt handler /// An interrupt handler
#[cfg_attr( #[cfg_attr(
multi_core, multi_core,

View File

@ -0,0 +1,192 @@
//! # Software Interrupts
//!
//! The [`SoftwareInterruptControl`] struct gives access to the available
//! software interrupts.
//!
//! The [`SoftwareInterrupt`] struct allows raising or resetting software
//! interrupts using the [`raise()`][SoftwareInterrupt::raise] and
//! [`reset()`][SoftwareInterrupt::reset] methods.
//!
//! ## Examples
//!
//! ```rust, no_run
#![doc = crate::before_snippet!()]
//! let sw_ints =
//! SoftwareInterruptControl::new(peripherals.SW_INTERRUPT);
//!
//! // Take the interrupt you want to use.
//! let mut int0 = sw_ints.software_interrupt0;
//!
//! // Set up the interrupt handler. Do this in a critical section so the global
//! // contains the interrupt object before the interrupt is triggered.
//! critical_section::with(|cs| {
//! int0.set_interrupt_handler(interrupt_handler);
//! SWINT0.borrow_ref_mut(cs).replace(int0);
//! });
//! # }
//!
//! # use core::cell::RefCell;
//! # use critical_section::Mutex;
//! # use esp_hal::interrupt::software::{SoftwareInterrupt, SoftwareInterruptControl};
//! // ... somewhere outside of your main function
//!
//! // Define a shared handle to the software interrupt.
//! static SWINT0: Mutex<RefCell<Option<SoftwareInterrupt<0>>>> =
//! Mutex::new(RefCell::new(None));
//!
//! #[handler]
//! fn interrupt_handler() {
//! // esp_println::println!("SW interrupt0 handled");
//!
//! // Clear the interrupt request.
//! critical_section::with(|cs| {
//! SWINT0.borrow_ref(cs).as_ref().unwrap().reset();
//! });
//! }
//! ```
use crate::{interrupt::InterruptHandler, InterruptConfigurable};
/// A software interrupt can be triggered by software.
#[non_exhaustive]
pub struct SoftwareInterrupt<const NUM: u8>;
impl<const NUM: u8> SoftwareInterrupt<NUM> {
/// Sets the interrupt handler for this software-interrupt
pub fn set_interrupt_handler(&mut self, handler: InterruptHandler) {
let interrupt = match NUM {
0 => crate::peripherals::Interrupt::FROM_CPU_INTR0,
1 => crate::peripherals::Interrupt::FROM_CPU_INTR1,
2 => crate::peripherals::Interrupt::FROM_CPU_INTR2,
3 => crate::peripherals::Interrupt::FROM_CPU_INTR3,
_ => unreachable!(),
};
unsafe {
crate::interrupt::bind_interrupt(interrupt, handler.handler());
crate::interrupt::enable(interrupt, handler.priority()).unwrap();
}
}
/// Trigger this software-interrupt
pub fn raise(&self) {
cfg_if::cfg_if! {
if #[cfg(any(esp32c6, esp32h2))] {
let system = unsafe { &*crate::peripherals::INTPRI::PTR };
} else {
let system = unsafe { &*crate::peripherals::SYSTEM::PTR };
}
}
match NUM {
0 => system
.cpu_intr_from_cpu_0()
.write(|w| w.cpu_intr_from_cpu_0().set_bit()),
1 => system
.cpu_intr_from_cpu_1()
.write(|w| w.cpu_intr_from_cpu_1().set_bit()),
2 => system
.cpu_intr_from_cpu_2()
.write(|w| w.cpu_intr_from_cpu_2().set_bit()),
3 => system
.cpu_intr_from_cpu_3()
.write(|w| w.cpu_intr_from_cpu_3().set_bit()),
_ => unreachable!(),
}
}
/// Resets this software-interrupt
pub fn reset(&self) {
cfg_if::cfg_if! {
if #[cfg(any(esp32c6, esp32h2))] {
let system = unsafe { &*crate::peripherals::INTPRI::PTR };
} else {
let system = unsafe { &*crate::peripherals::SYSTEM::PTR };
}
}
match NUM {
0 => system
.cpu_intr_from_cpu_0()
.write(|w| w.cpu_intr_from_cpu_0().clear_bit()),
1 => system
.cpu_intr_from_cpu_1()
.write(|w| w.cpu_intr_from_cpu_1().clear_bit()),
2 => system
.cpu_intr_from_cpu_2()
.write(|w| w.cpu_intr_from_cpu_2().clear_bit()),
3 => system
.cpu_intr_from_cpu_3()
.write(|w| w.cpu_intr_from_cpu_3().clear_bit()),
_ => unreachable!(),
}
}
/// Unsafely create an instance of this peripheral out of thin air.
///
/// # Safety
///
/// You must ensure that you're only using one instance of this type at a
/// time.
#[inline]
pub unsafe fn steal() -> Self {
Self
}
}
impl<const NUM: u8> crate::peripheral::Peripheral for SoftwareInterrupt<NUM> {
type P = SoftwareInterrupt<NUM>;
#[inline]
unsafe fn clone_unchecked(&mut self) -> Self::P {
Self::steal()
}
}
impl<const NUM: u8> crate::private::Sealed for SoftwareInterrupt<NUM> {}
impl<const NUM: u8> InterruptConfigurable for SoftwareInterrupt<NUM> {
fn set_interrupt_handler(&mut self, handler: crate::interrupt::InterruptHandler) {
SoftwareInterrupt::set_interrupt_handler(self, handler);
}
}
/// This gives access to the available software interrupts.
///
/// This struct contains several instances of software interrupts that can be
/// used for signaling between different parts of a program or system. Each
/// interrupt is identified by an index (0 to 3).
#[cfg_attr(
multi_core,
doc = r#"
Please note: Software interrupt 3 is reserved
for inter-processor communication when using
`esp-hal-embassy`."#
)]
#[non_exhaustive]
pub struct SoftwareInterruptControl {
/// Software interrupt 0.
pub software_interrupt0: SoftwareInterrupt<0>,
/// Software interrupt 1.
pub software_interrupt1: SoftwareInterrupt<1>,
/// Software interrupt 2.
pub software_interrupt2: SoftwareInterrupt<2>,
#[cfg(not(all(feature = "__esp_hal_embassy", multi_core)))]
/// Software interrupt 3. Only available when not using `esp-hal-embassy`,
/// or on single-core systems.
pub software_interrupt3: SoftwareInterrupt<3>,
}
impl SoftwareInterruptControl {
/// Create a new instance of the software interrupt control.
pub fn new(_peripheral: crate::peripherals::SW_INTERRUPT) -> Self {
SoftwareInterruptControl {
software_interrupt0: SoftwareInterrupt {},
software_interrupt1: SoftwareInterrupt {},
software_interrupt2: SoftwareInterrupt {},
#[cfg(not(all(feature = "__esp_hal_embassy", multi_core)))]
software_interrupt3: SoftwareInterrupt {},
}
}
}

View File

@ -1,14 +1,17 @@
//! # LCD - I8080/MOTO6800 Mode. //! # LCD - I8080/MOTO6800 Mode.
//! //!
//! ## Overview //! ## Overview
//!
//! The LCD_CAM peripheral I8080 driver provides support for the I8080 //! The LCD_CAM peripheral I8080 driver provides support for the I8080
//! format/timing. The driver mandates DMA for DMA (Direct Memory Access) for //! format/timing. The driver mandates DMA (Direct Memory Access) for
//! efficient data transfer. //! efficient data transfer.
//! //!
//! ## Examples //! ## Example
//!
//! ### MIPI-DSI Display //! ### MIPI-DSI Display
//! Following code show how to send a command to a MIPI-DSI display over I8080 //!
//! protocol. //! The following example shows how to send a command to a MIPI-DSI display over
//! the I8080 protocol.
//! //!
//! ```rust, no_run //! ```rust, no_run
#![doc = crate::before_snippet!()] #![doc = crate::before_snippet!()]
@ -16,8 +19,6 @@
//! # use esp_hal::lcd_cam::{LcdCam, lcd::i8080::{Config, I8080, TxEightBits}}; //! # use esp_hal::lcd_cam::{LcdCam, lcd::i8080::{Config, I8080, TxEightBits}};
//! # use esp_hal::dma_buffers; //! # use esp_hal::dma_buffers;
//! # use esp_hal::dma::{Dma, DmaPriority}; //! # use esp_hal::dma::{Dma, DmaPriority};
//! # use fugit::RateExtU32;
//!
//! # let io = Io::new(peripherals.GPIO, peripherals.IO_MUX); //! # let io = Io::new(peripherals.GPIO, peripherals.IO_MUX);
//! //!
//! # let dma = Dma::new(peripherals.DMA); //! # let dma = Dma::new(peripherals.DMA);

View File

@ -18,8 +18,10 @@
//! ## Examples //! ## Examples
//! //!
//! ### Low Speed Channel //! ### Low Speed Channel
//! The following will configure the Low Speed Channel0 to 24kHz output with //!
//! 10% duty using the ABPClock //! The following example will configure the Low Speed Channel0 to 24kHz output
//! with 10% duty using the ABPClock.
//!
//! ```rust, no_run //! ```rust, no_run
#![doc = crate::before_snippet!()] #![doc = crate::before_snippet!()]
//! # use esp_hal::ledc::Ledc; //! # use esp_hal::ledc::Ledc;
@ -28,10 +30,6 @@
//! # use esp_hal::ledc::LowSpeed; //! # use esp_hal::ledc::LowSpeed;
//! # use esp_hal::ledc::channel; //! # use esp_hal::ledc::channel;
//! # use esp_hal::gpio::Io; //! # use esp_hal::gpio::Io;
//! # use crate::esp_hal::prelude::_esp_hal_ledc_timer_TimerIFace;
//! # use crate::esp_hal::prelude::_fugit_RateExtU32;
//! # use crate::esp_hal::prelude::_esp_hal_ledc_channel_ChannelIFace;
//!
//! # let io = Io::new(peripherals.GPIO, peripherals.IO_MUX); //! # let io = Io::new(peripherals.GPIO, peripherals.IO_MUX);
//! # let led = io.pins.gpio0; //! # let led = io.pins.gpio0;
//! //!

View File

@ -17,7 +17,7 @@
#![cfg_attr(esp32c3, doc = "**ESP32-C3**")] #![cfg_attr(esp32c3, doc = "**ESP32-C3**")]
#![cfg_attr(esp32c6, doc = "**ESP32-C6**")] #![cfg_attr(esp32c6, doc = "**ESP32-C6**")]
#![cfg_attr(esp32h2, doc = "**ESP32-H2**")] #![cfg_attr(esp32h2, doc = "**ESP32-H2**")]
//! please ensure you are reading the correct [documentation] for your target //! . Please ensure you are reading the correct [documentation] for your target
//! device. //! device.
//! //!
//! ## Choosing a Device //! ## Choosing a Device
@ -60,26 +60,20 @@
//! #![no_std] //! #![no_std]
//! #![no_main] //! #![no_main]
//! //!
//! // A panic - handler e.g. `use esp_backtrace as _;` //! // You'll need a panic handler e.g. `use esp_backtrace as _;`
//!
//! use esp_hal::{
//! clock::ClockControl,
//! delay::Delay,
//! gpio::{Io, Level, Output},
//! peripherals::Peripherals,
//! prelude::*,
//! system::SystemControl,
//! };
//! # #[panic_handler] //! # #[panic_handler]
//! # fn panic(_ : &core::panic::PanicInfo) -> ! { //! # fn panic(_ : &core::panic::PanicInfo) -> ! {
//! # loop {} //! # loop {}
//! # } //! # }
//! use esp_hal::{
//! delay::Delay,
//! gpio::{Io, Level, Output},
//! prelude::*,
//! };
//! //!
//! #[entry] //! #[entry]
//! fn main() -> ! { //! fn main() -> ! {
//! let peripherals = Peripherals::take(); //! let (peripherals, clocks) = esp_hal::init(esp_hal::Config::default());
//! let system = SystemControl::new(peripherals.SYSTEM);
//! let clocks = ClockControl::boot_defaults(system.clock_control).freeze();
//! //!
//! // Set GPIO0 as an output, and set its state high initially. //! // Set GPIO0 as an output, and set its state high initially.
//! let io = Io::new(peripherals.GPIO, peripherals.IO_MUX); //! let io = Io::new(peripherals.GPIO, peripherals.IO_MUX);
@ -95,14 +89,11 @@
//! ``` //! ```
//! //!
//! The steps here are: //! The steps here are:
//! - Take all the peripherals from the PAC to pass them to the HAL drivers //! - Call [`init`] with the desired [`CpuClock`] configuration
//! later //! - Create [`gpio::Io`] which provides access to the GPIO pins
//! - Create [system::SystemControl] //! - Create an [`gpio::Output`] pin driver which lets us control the logical
//! - Configure the system clocks - in this case use the boot defaults
//! - Create [gpio::Io] which provides access to the GPIO pins
//! - Create an [gpio::Output] pin driver which lets us control the logical
//! level of an output pin //! level of an output pin
//! - Create a [delay::Delay] driver //! - Create a [`delay::Delay`] driver
//! - In a loop, toggle the output pin's logical level with a delay of 1000 ms //! - In a loop, toggle the output pin's logical level with a delay of 1000 ms
//! //!
//! ## `PeripheralRef` Pattern //! ## `PeripheralRef` Pattern
@ -111,7 +102,7 @@
//! This means you can pass the pin/peripheral or a mutable reference to the //! This means you can pass the pin/peripheral or a mutable reference to the
//! pin/peripheral. //! pin/peripheral.
//! //!
//! The later can be used to regain access to the pin when the driver gets //! The latter can be used to regain access to the pin when the driver gets
//! dropped. Then it's possible to reuse the pin/peripheral for a different //! dropped. Then it's possible to reuse the pin/peripheral for a different
//! purpose. //! purpose.
//! //!
@ -714,17 +705,38 @@ macro_rules! before_snippet {
() => { () => {
r#" r#"
# #![no_std] # #![no_std]
# use esp_hal::peripherals::Peripherals; # use esp_hal::prelude::*;
# use esp_hal::clock::ClockControl; # use procmacros::handler;
# use esp_hal::system::SystemControl; # use esp_hal::interrupt;
# #[panic_handler] # #[panic_handler]
# fn panic(_ : &core::panic::PanicInfo) -> ! { # fn panic(_ : &core::panic::PanicInfo) -> ! {
# loop {} # loop {}
# } # }
# fn main() { # fn main() {
# let peripherals = Peripherals::take(); # let (peripherals, clocks) = esp_hal::init(esp_hal::Config::default());
# let system = SystemControl::new(peripherals.SYSTEM);
# let mut clocks = ClockControl::boot_defaults(system.clock_control).freeze();
"# "#
}; };
} }
use crate::{
clock::{ClockControl, Clocks, CpuClock},
peripherals::Peripherals,
};
/// System configuration.
#[non_exhaustive]
#[derive(Default)]
pub struct Config {
/// The CPU clock configuration.
pub cpu_clock: CpuClock,
}
/// Initialize the system.
///
/// This function sets up the CPU clock and returns the peripherals and clocks.
pub fn init(config: Config) -> (Peripherals, Clocks<'static>) {
let peripherals = Peripherals::take();
let clocks = ClockControl::new(config.cpu_clock).freeze();
(peripherals, clocks)
}

View File

@ -42,14 +42,16 @@
#![cfg_attr(esp32h2, doc = "Clock source is XTAL")] #![cfg_attr(esp32h2, doc = "Clock source is XTAL")]
#![doc = ""] #![doc = ""]
//! ## Examples //! ## Examples
//!
//! ### Output a 20 kHz signal //! ### Output a 20 kHz signal
//! Uses timer0 and operator0 of the MCPWM0 peripheral to output a 50% duty //!
//! signal at 20 kHz. The signal will be output to the pin assigned to `pin`. //! This example uses timer0 and operator0 of the MCPWM0 peripheral to output a
//! 50% duty signal at 20 kHz. The signal will be output to the pin assigned to
//! `pin`.
//!
//! ```rust, no_run //! ```rust, no_run
#![doc = crate::before_snippet!()] #![doc = crate::before_snippet!()]
//! # use esp_hal::{mcpwm, prelude::*}; //! # use esp_hal::mcpwm::{operator::{DeadTimeCfg, PWMStream, PwmPinConfig}, timer::PwmWorkingMode, McPwm, PeripheralClockConfig};
//! # use esp_hal::mcpwm::operator::{DeadTimeCfg, PWMStream};
//! # use mcpwm::{operator::PwmPinConfig, timer::PwmWorkingMode, McPwm, PeripheralClockConfig};
//! # use esp_hal::gpio::Io; //! # use esp_hal::gpio::Io;
//! //!
//! # let io = Io::new(peripherals.GPIO, peripherals.IO_MUX); //! # let io = Io::new(peripherals.GPIO, peripherals.IO_MUX);

View File

@ -479,6 +479,7 @@ impl<'d, Pin: OutputPin, PWM: PwmPeripheral, const OP: u8, const IS_A: bool>
/// configured deadtime. /// configured deadtime.
/// ///
/// # H-Bridge example /// # H-Bridge example
///
/// ```rust, no_run /// ```rust, no_run
#[doc = crate::before_snippet!()] #[doc = crate::before_snippet!()]
/// # use esp_hal::{mcpwm, prelude::*}; /// # use esp_hal::{mcpwm, prelude::*};

View File

@ -38,4 +38,4 @@ pub use crate::timer::timg::{
pub use crate::timer::Timer as _esp_hal_timer_Timer; pub use crate::timer::Timer as _esp_hal_timer_Timer;
#[cfg(any(uart0, uart1, uart2))] #[cfg(any(uart0, uart1, uart2))]
pub use crate::uart::Instance as _esp_hal_uart_Instance; pub use crate::uart::Instance as _esp_hal_uart_Instance;
pub use crate::{entry, macros::*, InterruptConfigurable}; pub use crate::{clock::CpuClock, entry, macros::*, InterruptConfigurable};

View File

@ -18,24 +18,25 @@
//! the input signal //! the input signal
//! //!
//! ### Channels //! ### Channels
//!
//! There are //! There are
#![cfg_attr( #![cfg_attr(
esp32, esp32,
doc = "8 channels, each of them can be either receiver or transmitter" doc = "8 channels, each of them can be either receiver or transmitter."
)] )]
#![cfg_attr( #![cfg_attr(
esp32s2, esp32s2,
doc = "4 channels, each of them can be either receiver or transmitter" doc = "4 channels, each of them can be either receiver or transmitter."
)] )]
#![cfg_attr( #![cfg_attr(
esp32s3, esp32s3,
doc = "8 channels, `Channel<0>`-`Channel<3>` hardcoded for transmitting signals and `Channel<4>`-`Channel<7>` hardcoded for receiving signals" doc = "8 channels, `Channel<0>`-`Channel<3>` hardcoded for transmitting signals and `Channel<4>`-`Channel<7>` hardcoded for receiving signals."
)] )]
#![cfg_attr( #![cfg_attr(
any(esp32c3, esp32c6, esp32h2), any(esp32c3, esp32c6, esp32h2),
doc = "4 channels, `Channel<0>` and `Channel<1>` hardcoded for transmitting signals and `Channel<2>` and `Channel<3>` hardcoded for receiving signals." doc = "4 channels, `Channel<0>` and `Channel<1>` hardcoded for transmitting signals and `Channel<2>` and `Channel<3>` hardcoded for receiving signals."
)] )]
#![doc = " "] #![doc = ""]
//! For more information, please refer to the //! For more information, please refer to the
#![doc = concat!("[ESP-IDF documentation](https://docs.espressif.com/projects/esp-idf/en/latest/", crate::soc::chip!(), "/api-reference/peripherals/rmt.html)")] #![doc = concat!("[ESP-IDF documentation](https://docs.espressif.com/projects/esp-idf/en/latest/", crate::soc::chip!(), "/api-reference/peripherals/rmt.html)")]
//! ## Configuration //! ## Configuration
@ -44,8 +45,10 @@
//! channels are indicated by n which is used as a placeholder for the channel //! channels are indicated by n which is used as a placeholder for the channel
//! number, and by m for RX channels. //! number, and by m for RX channels.
//! //!
//! ## Examples //! ## Example
//!
//! ### Initialization //! ### Initialization
//!
//! ```rust, no_run //! ```rust, no_run
#![doc = crate::before_snippet!()] #![doc = crate::before_snippet!()]
//! # use esp_hal::peripherals::Peripherals; //! # use esp_hal::peripherals::Peripherals;
@ -54,7 +57,6 @@
//! # use esp_hal::gpio::Io; //! # use esp_hal::gpio::Io;
//! # use esp_hal::clock::ClockControl; //! # use esp_hal::clock::ClockControl;
//! # use crate::esp_hal::rmt::TxChannelCreator; //! # use crate::esp_hal::rmt::TxChannelCreator;
//! # use crate::esp_hal::prelude::_fugit_RateExtU32;
//! # let io = Io::new(peripherals.GPIO, peripherals.IO_MUX); //! # let io = Io::new(peripherals.GPIO, peripherals.IO_MUX);
#![cfg_attr(esp32h2, doc = "let freq = 32.MHz();")] #![cfg_attr(esp32h2, doc = "let freq = 32.MHz();")]
#![cfg_attr(not(esp32h2), doc = "let freq = 80.MHz();")] #![cfg_attr(not(esp32h2), doc = "let freq = 80.MHz();")]
@ -76,8 +78,8 @@
//! .unwrap(); //! .unwrap();
//! # } //! # }
//! ``` //! ```
//! (on ESP32 and ESP32-S2 you cannot specify a base frequency other than 80 //!
//! MHz) //! > Note: on ESP32 and ESP32-S2 you cannot specify a base frequency other than 80 MHz
use core::marker::PhantomData; use core::marker::PhantomData;

View File

@ -55,6 +55,7 @@
//! # let mut uart0 = Uart::new(peripherals.UART0, &clocks, io.pins.gpio1, io.pins.gpio2).unwrap(); //! # let mut uart0 = Uart::new(peripherals.UART0, &clocks, io.pins.gpio1, io.pins.gpio2).unwrap();
//! # let data0 = "Dummy"; //! # let data0 = "Dummy";
//! # let data1 = "Dummy"; //! # let data1 = "Dummy";
//! #
//! let mut ctx = md5::Context::new(); //! let mut ctx = md5::Context::new();
//! ctx.consume(&data0); //! ctx.consume(&data0);
//! ctx.consume(&data1); //! ctx.consume(&data1);

View File

@ -14,11 +14,10 @@
//! * Clock Configuration //! * Clock Configuration
//! * Calibration //! * Calibration
//! * Low-Power Management //! * Low-Power Management
//! * Real-Time Clock
//! * Handling Watchdog Timers //! * Handling Watchdog Timers
//! //!
//! ## Examples //! ## Example
//! ### Print Time in Milliseconds From the RTC Timer //!
//! ```rust, no_run //! ```rust, no_run
#![doc = crate::before_snippet!()] #![doc = crate::before_snippet!()]
//! # use core::cell::RefCell; //! # use core::cell::RefCell;
@ -33,28 +32,23 @@
//! let mut delay = Delay::new(&clocks); //! let mut delay = Delay::new(&clocks);
//! //!
//! let mut rtc = Rtc::new(peripherals.LPWR); //! let mut rtc = Rtc::new(peripherals.LPWR);
//!
//! rtc.set_interrupt_handler(interrupt_handler); //! rtc.set_interrupt_handler(interrupt_handler);
//! rtc.rwdt.set_timeout(2000.millis()); //! rtc.rwdt.set_timeout(2000.millis());
//! rtc.rwdt.listen(); //! rtc.rwdt.listen();
//! //!
//! critical_section::with(|cs| RWDT.borrow_ref_mut(cs).replace(rtc.rwdt)); //! critical_section::with(|cs| RWDT.borrow_ref_mut(cs).replace(rtc.rwdt));
//!
//!
//! loop {}
//! # } //! # }
//! //!
//! // Where the `LP_WDT` interrupt handler is defined as: //! // Where the `LP_WDT` interrupt handler is defined as:
//! // Handle the corresponding interrupt
//! # use core::cell::RefCell; //! # use core::cell::RefCell;
//! //!
//! # use critical_section::Mutex; //! # use critical_section::Mutex;
//! # use esp_hal::prelude::handler;
//! # use esp_hal::interrupt::InterruptHandler;
//! # use esp_hal::interrupt;
//! # use esp_hal::interrupt::Priority;
//! # use crate::esp_hal::prelude::_fugit_ExtU64;
//! # use esp_hal::rtc_cntl::Rwdt; //! # use esp_hal::rtc_cntl::Rwdt;
//!
//! static RWDT: Mutex<RefCell<Option<Rwdt>>> = Mutex::new(RefCell::new(None)); //! static RWDT: Mutex<RefCell<Option<Rwdt>>> = Mutex::new(RefCell::new(None));
//!
//! // Handle the corresponding interrupt
//! #[handler] //! #[handler]
//! fn interrupt_handler() { //! fn interrupt_handler() {
//! critical_section::with(|cs| { //! critical_section::with(|cs| {

View File

@ -63,6 +63,7 @@ crate::peripherals! {
SPI2 <= SPI2 (SPI2_DMA, SPI2), SPI2 <= SPI2 (SPI2_DMA, SPI2),
SPI3 <= SPI3 (SPI3_DMA, SPI3), SPI3 <= SPI3 (SPI3_DMA, SPI3),
SYSTEM <= DPORT, SYSTEM <= DPORT,
SW_INTERRUPT <= virtual,
TIMG0 <= TIMG0, TIMG0 <= TIMG0,
TIMG1 <= TIMG1, TIMG1 <= TIMG1,
TOUCH <= virtual, TOUCH <= virtual,

View File

@ -43,6 +43,7 @@ crate::peripherals! {
SPI2 <= SPI2 (SPI2), SPI2 <= SPI2 (SPI2),
SYSTEM <= SYSTEM, SYSTEM <= SYSTEM,
SYSTIMER <= SYSTIMER, SYSTIMER <= SYSTIMER,
SW_INTERRUPT <= virtual,
TIMG0 <= TIMG0, TIMG0 <= TIMG0,
UART0 <= UART0, UART0 <= UART0,
UART1 <= UART1, UART1 <= UART1,

View File

@ -50,6 +50,7 @@ crate::peripherals! {
SPI2 <= SPI2 (SPI2), SPI2 <= SPI2 (SPI2),
SYSTEM <= SYSTEM, SYSTEM <= SYSTEM,
SYSTIMER <= SYSTIMER, SYSTIMER <= SYSTIMER,
SW_INTERRUPT <= virtual,
TIMG0 <= TIMG0, TIMG0 <= TIMG0,
TIMG1 <= TIMG1, TIMG1 <= TIMG1,
TWAI0 <= TWAI0, TWAI0 <= TWAI0,

View File

@ -76,6 +76,7 @@ crate::peripherals! {
SPI2 <= SPI2 (SPI2), SPI2 <= SPI2 (SPI2),
SYSTEM <= PCR, SYSTEM <= PCR,
SYSTIMER <= SYSTIMER, SYSTIMER <= SYSTIMER,
SW_INTERRUPT <= virtual,
TEE <= TEE, TEE <= TEE,
TIMG0 <= TIMG0, TIMG0 <= TIMG0,
TIMG1 <= TIMG1, TIMG1 <= TIMG1,

View File

@ -68,6 +68,7 @@ crate::peripherals! {
SPI2 <= SPI2 (SPI2), SPI2 <= SPI2 (SPI2),
SYSTEM <= PCR, SYSTEM <= PCR,
SYSTIMER <= SYSTIMER, SYSTIMER <= SYSTIMER,
SW_INTERRUPT <= virtual,
TEE <= TEE, TEE <= TEE,
TIMG0 <= TIMG0, TIMG0 <= TIMG0,
TIMG1 <= TIMG1, TIMG1 <= TIMG1,

View File

@ -58,6 +58,7 @@ crate::peripherals! {
SYSCON <= SYSCON, SYSCON <= SYSCON,
SYSTEM <= SYSTEM, SYSTEM <= SYSTEM,
SYSTIMER <= SYSTIMER, SYSTIMER <= SYSTIMER,
SW_INTERRUPT <= virtual,
TIMG0 <= TIMG0, TIMG0 <= TIMG0,
TIMG1 <= TIMG1, TIMG1 <= TIMG1,
TWAI0 <= TWAI0, TWAI0 <= TWAI0,

View File

@ -17,17 +17,21 @@
#![doc = crate::before_snippet!()] #![doc = crate::before_snippet!()]
//! const CODE: &[u8] = &[ //! const CODE: &[u8] = &[
//! 0x17, 0x05, 0x00, 0x00, 0x13, 0x05, 0x05, 0x01, 0x81, 0x45, 0x85, 0x05, //! 0x17, 0x05, 0x00, 0x00, 0x13, 0x05, 0x05, 0x01, 0x81, 0x45, 0x85, 0x05,
//! 0x0c, 0xc1, 0xf5, 0xbf, 0x00, 0x00, 0x00, 0x00, //! 0x0c, 0xc1, 0xf5, 0xbf, 0x00, 0x00, 0x00, 0x00,
//! ]; //! ];
//! let mut ulp_core = //! let mut ulp_core =
//! esp_hal::ulp_core::UlpCore::new(peripherals.ULP_RISCV_CORE); //! esp_hal::ulp_core::UlpCore::new(peripherals.ULP_RISCV_CORE);
//! // ulp_core.stop(); currently not implemented //! // ulp_core.stop(); currently not implemented
//! //!
//! // copy code to RTC ram //! // copy code to RTC ram
//! let lp_ram = 0x5000_0000 as *mut u8; //! let lp_ram = 0x5000_0000 as *mut u8;
//! unsafe { //! unsafe {
//! core::ptr::copy_nonoverlapping(CODE as *const _ as *const u8, lp_ram, //! core::ptr::copy_nonoverlapping(
//! CODE.len()); } //! CODE as *const _ as *const u8,
//! lp_ram,
//! CODE.len(),
//! );
//! }
//! //!
//! // start ULP core //! // start ULP core
//! ulp_core.run(esp_hal::ulp_core::UlpCoreWakeupSource::HpCpu); //! ulp_core.run(esp_hal::ulp_core::UlpCoreWakeupSource::HpCpu);

View File

@ -13,10 +13,8 @@
//! # use esp_hal::cpu_control::{CpuControl, Stack}; //! # use esp_hal::cpu_control::{CpuControl, Stack};
//! # use core::{cell::RefCell, ptr::addr_of_mut}; //! # use core::{cell::RefCell, ptr::addr_of_mut};
//! # use critical_section::Mutex; //! # use critical_section::Mutex;
//! # use esp_hal::prelude::*;
//! static mut APP_CORE_STACK: Stack<8192> = Stack::new();
//!
//! # let delay = Delay::new(&clocks); //! # let delay = Delay::new(&clocks);
//! static mut APP_CORE_STACK: Stack<8192> = Stack::new();
//! //!
//! let counter = Mutex::new(RefCell::new(0)); //! let counter = Mutex::new(RefCell::new(0));
//! //!
@ -25,8 +23,10 @@
//! cpu1_task(&delay, &counter); //! cpu1_task(&delay, &counter);
//! }; //! };
//! let _guard = cpu_control //! let _guard = cpu_control
//! .start_app_core(unsafe { &mut *addr_of_mut!(APP_CORE_STACK) }, //! .start_app_core(
//! cpu1_fnctn) .unwrap(); //! unsafe { &mut *addr_of_mut!(APP_CORE_STACK) },
//! cpu1_fnctn,
//! ).unwrap();
//! //!
//! loop { //! loop {
//! delay.delay(1.secs()); //! delay.delay(1.secs());
@ -37,7 +37,7 @@
//! // Where `cpu1_task()` may be defined as: //! // Where `cpu1_task()` may be defined as:
//! # use esp_hal::delay::Delay; //! # use esp_hal::delay::Delay;
//! # use core::cell::RefCell; //! # use core::cell::RefCell;
//! # use esp_hal::prelude::*; //!
//! fn cpu1_task( //! fn cpu1_task(
//! delay: &Delay, //! delay: &Delay,
//! counter: &critical_section::Mutex<RefCell<i32>>, //! counter: &critical_section::Mutex<RefCell<i32>>,

View File

@ -63,6 +63,7 @@ crate::peripherals! {
SPI3 <= SPI3 (SPI3), SPI3 <= SPI3 (SPI3),
SYSTEM <= SYSTEM, SYSTEM <= SYSTEM,
SYSTIMER <= SYSTIMER, SYSTIMER <= SYSTIMER,
SW_INTERRUPT <= virtual,
TIMG0 <= TIMG0, TIMG0 <= TIMG0,
TIMG1 <= TIMG1, TIMG1 <= TIMG1,
TWAI0 <= TWAI0, TWAI0 <= TWAI0,

View File

@ -1,6 +1,7 @@
//! Control the ULP core //! Control the ULP core
//! //!
//! ## Overview //! ## Overview
//!
//! The `ULP CORE` peripheral allows control over the `Ultra-Low Power //! The `ULP CORE` peripheral allows control over the `Ultra-Low Power
//! (ULP) core` in `ESP` chips. The ULP core is a low-power processor //! (ULP) core` in `ESP` chips. The ULP core is a low-power processor
//! designed for executing tasks in deep sleep mode, enabling efficient power //! designed for executing tasks in deep sleep mode, enabling efficient power
@ -11,22 +12,28 @@
//! operation. The `UlpCore` struct is initialized with a peripheral reference //! operation. The `UlpCore` struct is initialized with a peripheral reference
//! to the `ULP CORE` instance. //! to the `ULP CORE` instance.
//! //!
//! ## Examples //! ## Example
//!
//! ```rust, no_run //! ```rust, no_run
#![doc = crate::before_snippet!()] #![doc = crate::before_snippet!()]
//! const CODE: &[u8] = &[ //! const CODE: &[u8] = &[
//! 0x17, 0x05, 0x00, 0x00, 0x13, 0x05, 0x05, 0x01, 0x81, 0x45, 0x85, 0x05, //! 0x17, 0x05, 0x00, 0x00, 0x13, 0x05, 0x05, 0x01, 0x81, 0x45, 0x85, 0x05,
//! 0x0c, 0xc1, 0xf5, 0xbf, 0x00, 0x00, 0x00, 0x00, //! 0x0c, 0xc1, 0xf5, 0xbf, 0x00, 0x00, 0x00, 0x00,
//! ]; //! ];
//!
//! let mut ulp_core = //! let mut ulp_core =
//! esp_hal::ulp_core::UlpCore::new(peripherals.ULP_RISCV_CORE); //! esp_hal::ulp_core::UlpCore::new(peripherals.ULP_RISCV_CORE);
//! ulp_core.stop(); //! ulp_core.stop();
//! //!
//! // copy code to RTC ram //! // copy code to RTC ram
//! let lp_ram = 0x5000_0000 as *mut u8; //! let lp_ram = 0x5000_0000 as *mut u8;
//! unsafe { //! unsafe {
//! core::ptr::copy_nonoverlapping(CODE as *const _ as *const u8, lp_ram, //! core::ptr::copy_nonoverlapping(
//! CODE.len()); } //! CODE as *const _ as *const u8,
//! lp_ram,
//! CODE.len(),
//! );
//! }
//! //!
//! // start ULP core //! // start ULP core
//! ulp_core.run(esp_hal::ulp_core::UlpCoreWakeupSource::HpCpu); //! ulp_core.run(esp_hal::ulp_core::UlpCoreWakeupSource::HpCpu);

View File

@ -38,7 +38,6 @@
//! ### SPI Initialization //! ### SPI Initialization
//! ```rust, no_run //! ```rust, no_run
#![doc = crate::before_snippet!()] #![doc = crate::before_snippet!()]
//! # use crate::esp_hal::prelude::_fugit_RateExtU32;
//! # use esp_hal::spi::SpiMode; //! # use esp_hal::spi::SpiMode;
//! # use esp_hal::spi::master::Spi; //! # use esp_hal::spi::master::Spi;
//! # use esp_hal::gpio::Io; //! # use esp_hal::gpio::Io;
@ -52,7 +51,7 @@
//! peripherals.SPI2, //! peripherals.SPI2,
//! 100.kHz(), //! 100.kHz(),
//! SpiMode::Mode0, //! SpiMode::Mode0,
//! &mut clocks, //! &clocks,
//! ) //! )
//! .with_pins(Some(sclk), Some(mosi), Some(miso), Some(cs)); //! .with_pins(Some(sclk), Some(mosi), Some(miso), Some(cs));
//! # } //! # }

View File

@ -48,8 +48,8 @@
//! let mut receive = rx_buffer; //! let mut receive = rx_buffer;
//! //!
//! let transfer = spi //! let transfer = spi
//! .dma_transfer(&mut send, &mut receive) //! .dma_transfer(&mut send, &mut receive)
//! .unwrap(); //! .unwrap();
//! //!
//! transfer.wait().unwrap(); //! transfer.wait().unwrap();
//! # } //! # }

View File

@ -1,46 +1,20 @@
//! # System Control //! # System Control
//! //!
//! ## Overview //! ## Overview
//! This `system` driver provides an interface to control and configure various
//! system-related features and peripherals on ESP chips. It includes
//! functionality to control peripheral clocks, manage software interrupts,
//! configure chip clocks, and control radio peripherals.
//! //!
//! ### Software Interrupts //! This `system` module defines the available radio peripherals and provides an
//! The `SoftwareInterruptControl` struct gives access to the available software //! interface to control and configure radio clocks.
//! interrupts.
//!
//! The `SoftwareInterrupt` struct allows raising or resetting software
//! interrupts using the `raise()` and `reset()` methods.
//!
//! ### Peripheral Clock Control
//! The `PeripheralClockControl` struct controls the enablement of peripheral
//! clocks.
//!
//! It provides an `enable()` method to enable and reset specific peripherals.
//! The available peripherals are represented by the `Peripheral` enum
//!
//! ## Examples
//! ```rust, no_run
#![doc = crate::before_snippet!()]
//! let peripherals = Peripherals::take();
//! let system = SystemControl::new(peripherals.SYSTEM);
//! let clocks = ClockControl::boot_defaults(system.clock_control).freeze();
//! # }
//! ```
use crate::{ use crate::peripherals::SYSTEM;
interrupt::InterruptHandler,
peripheral::PeripheralRef,
peripherals::SYSTEM,
InterruptConfigurable,
};
/// Peripherals which can be enabled via `PeripheralClockControl`. /// Peripherals which can be enabled via `PeripheralClockControl`.
/// ///
/// This enum represents various hardware peripherals that can be enabled /// This enum represents various hardware peripherals that can be enabled
/// by the system's clock control. Depending on the target device, different /// by the system's clock control. Depending on the target device, different
/// peripherals will be available for enabling. /// peripherals will be available for enabling.
// FIXME: This enum needs to be public because it's exposed via a bunch of traits, but it's not
// useful to users.
#[doc(hidden)]
pub enum Peripheral { pub enum Peripheral {
/// SPI2 peripheral. /// SPI2 peripheral.
#[cfg(spi2)] #[cfg(spi2)]
@ -146,183 +120,6 @@ pub enum Peripheral {
Systimer, Systimer,
} }
/// The `DPORT`/`PCR`/`SYSTEM` peripheral split into its different logical
/// components.
pub struct SystemControl<'d> {
/// Inner reference to the SYSTEM peripheral.
_inner: PeripheralRef<'d, SYSTEM>,
/// Controls the system's clock settings and configurations.
pub clock_control: SystemClockControl,
/// Controls the system's software interrupt settings.
pub software_interrupt_control: SoftwareInterruptControl,
}
impl<'d> SystemControl<'d> {
/// Construct a new instance of [`SystemControl`].
pub fn new(system: impl crate::peripheral::Peripheral<P = SYSTEM> + 'd) -> Self {
crate::into_ref!(system);
Self {
_inner: system,
clock_control: SystemClockControl::new(),
software_interrupt_control: SoftwareInterruptControl::new(),
}
}
}
/// A software interrupt can be triggered by software.
#[non_exhaustive]
pub struct SoftwareInterrupt<const NUM: u8>;
impl<const NUM: u8> SoftwareInterrupt<NUM> {
/// Sets the interrupt handler for this software-interrupt
pub fn set_interrupt_handler(&mut self, handler: InterruptHandler) {
let interrupt = match NUM {
0 => crate::peripherals::Interrupt::FROM_CPU_INTR0,
1 => crate::peripherals::Interrupt::FROM_CPU_INTR1,
2 => crate::peripherals::Interrupt::FROM_CPU_INTR2,
3 => crate::peripherals::Interrupt::FROM_CPU_INTR3,
_ => unreachable!(),
};
unsafe {
crate::interrupt::bind_interrupt(interrupt, handler.handler());
crate::interrupt::enable(interrupt, handler.priority()).unwrap();
}
}
/// Trigger this software-interrupt
pub fn raise(&self) {
#[cfg(not(any(esp32c6, esp32h2)))]
let system = unsafe { &*SYSTEM::PTR };
#[cfg(any(esp32c6, esp32h2))]
let system = unsafe { &*crate::peripherals::INTPRI::PTR };
match NUM {
0 => {
system
.cpu_intr_from_cpu_0()
.write(|w| w.cpu_intr_from_cpu_0().set_bit());
}
1 => {
system
.cpu_intr_from_cpu_1()
.write(|w| w.cpu_intr_from_cpu_1().set_bit());
}
2 => {
system
.cpu_intr_from_cpu_2()
.write(|w| w.cpu_intr_from_cpu_2().set_bit());
}
3 => {
system
.cpu_intr_from_cpu_3()
.write(|w| w.cpu_intr_from_cpu_3().set_bit());
}
_ => unreachable!(),
}
}
/// Resets this software-interrupt
pub fn reset(&self) {
#[cfg(not(any(esp32c6, esp32h2)))]
let system = unsafe { &*SYSTEM::PTR };
#[cfg(any(esp32c6, esp32h2))]
let system = unsafe { &*crate::peripherals::INTPRI::PTR };
match NUM {
0 => {
system
.cpu_intr_from_cpu_0()
.write(|w| w.cpu_intr_from_cpu_0().clear_bit());
}
1 => {
system
.cpu_intr_from_cpu_1()
.write(|w| w.cpu_intr_from_cpu_1().clear_bit());
}
2 => {
system
.cpu_intr_from_cpu_2()
.write(|w| w.cpu_intr_from_cpu_2().clear_bit());
}
3 => {
system
.cpu_intr_from_cpu_3()
.write(|w| w.cpu_intr_from_cpu_3().clear_bit());
}
_ => unreachable!(),
}
}
/// Unsafely create an instance of this peripheral out of thin air.
///
/// # Safety
///
/// You must ensure that you're only using one instance of this type at a
/// time.
#[inline]
pub unsafe fn steal() -> Self {
Self
}
}
impl<const NUM: u8> crate::peripheral::Peripheral for SoftwareInterrupt<NUM> {
type P = SoftwareInterrupt<NUM>;
#[inline]
unsafe fn clone_unchecked(&mut self) -> Self::P {
Self::steal()
}
}
impl<const NUM: u8> crate::private::Sealed for SoftwareInterrupt<NUM> {}
impl<const NUM: u8> InterruptConfigurable for SoftwareInterrupt<NUM> {
fn set_interrupt_handler(&mut self, handler: crate::interrupt::InterruptHandler) {
SoftwareInterrupt::set_interrupt_handler(self, handler);
}
}
/// This gives access to the available software interrupts.
///
/// This struct contains several instances of software interrupts that can be
/// used for signaling between different parts of a program or system. Each
/// interrupt is identified by an index (0 to 3).
#[cfg_attr(
multi_core,
doc = r#"
Please note: Software interrupt 3 is reserved
for inter-processor communication when using
`esp-hal-embassy`."#
)]
#[non_exhaustive]
pub struct SoftwareInterruptControl {
/// Software interrupt 0.
pub software_interrupt0: SoftwareInterrupt<0>,
/// Software interrupt 1.
pub software_interrupt1: SoftwareInterrupt<1>,
/// Software interrupt 2.
pub software_interrupt2: SoftwareInterrupt<2>,
#[cfg(not(all(feature = "__esp_hal_embassy", multi_core)))]
/// Software interrupt 3. Only available when not using `esp-hal-embassy`,
/// or on single-core systems.
pub software_interrupt3: SoftwareInterrupt<3>,
}
impl SoftwareInterruptControl {
fn new() -> Self {
SoftwareInterruptControl {
software_interrupt0: SoftwareInterrupt {},
software_interrupt1: SoftwareInterrupt {},
software_interrupt2: SoftwareInterrupt {},
#[cfg(not(all(feature = "__esp_hal_embassy", multi_core)))]
software_interrupt3: SoftwareInterrupt {},
}
}
}
/// Controls the enablement of peripheral clocks. /// Controls the enablement of peripheral clocks.
pub(crate) struct PeripheralClockControl; pub(crate) struct PeripheralClockControl;
@ -1187,35 +984,6 @@ impl PeripheralClockControl {
} }
} }
/// Controls the configuration of the chip's clocks.
pub struct SystemClockControl {
_private: (),
}
impl SystemClockControl {
/// Creates new instance of `SystemClockControl`.
pub fn new() -> Self {
Self { _private: () }
}
}
impl Default for SystemClockControl {
fn default() -> Self {
Self::new()
}
}
impl crate::peripheral::Peripheral for SystemClockControl {
type P = SystemClockControl;
#[inline]
unsafe fn clone_unchecked(&mut self) -> Self::P {
SystemClockControl { _private: () }
}
}
impl crate::private::Sealed for SystemClockControl {}
/// Enumeration of the available radio peripherals for this chip. /// Enumeration of the available radio peripherals for this chip.
#[cfg(any(bt, ieee802154, wifi))] #[cfg(any(bt, ieee802154, wifi))]
pub enum RadioPeripherals { pub enum RadioPeripherals {

View File

@ -1,17 +1,8 @@
//! # Time //! # Time
//! //!
//! ## Overview
//! The `time` module offers a way to get the system uptime. //! The `time` module offers a way to get the system uptime.
//!
//! ## Examples
//! ```rust, no_run
#![doc = crate::before_snippet!()]
//! # use esp_hal::time;
//! let time = time::current_time();
//! # }
//! ```
/// Provides time since system start in microseconds precision /// Provides time since system start in microseconds precision.
/// ///
/// The counter wont measure time in sleep-mode. /// The counter wont measure time in sleep-mode.
/// ///

View File

@ -17,7 +17,7 @@
//! ```rust, no_run //! ```rust, no_run
#![doc = crate::before_snippet!()] #![doc = crate::before_snippet!()]
//! # use esp_hal::timer::{OneShotTimer, PeriodicTimer, timg::TimerGroup}; //! # use esp_hal::timer::{OneShotTimer, PeriodicTimer, timg::TimerGroup};
//! # use esp_hal::prelude::*; //! #
//! let timg0 = TimerGroup::new(peripherals.TIMG0, &clocks); //! let timg0 = TimerGroup::new(peripherals.TIMG0, &clocks);
//! let one_shot = OneShotTimer::new(timg0.timer0); //! let one_shot = OneShotTimer::new(timg0.timer0);
//! //!
@ -29,7 +29,7 @@
//! ```rust, no_run //! ```rust, no_run
#![doc = crate::before_snippet!()] #![doc = crate::before_snippet!()]
//! # use esp_hal::timer::{PeriodicTimer, timg::TimerGroup}; //! # use esp_hal::timer::{PeriodicTimer, timg::TimerGroup};
//! # use esp_hal::prelude::*; //! #
//! let timg0 = TimerGroup::new(peripherals.TIMG0, &clocks); //! let timg0 = TimerGroup::new(peripherals.TIMG0, &clocks);
//! let mut periodic = PeriodicTimer::new(timg0.timer0); //! let mut periodic = PeriodicTimer::new(timg0.timer0);
//! //!

View File

@ -15,58 +15,57 @@
//! [Alarm]s can be configured in two modes: [Target] (one-shot) and [Periodic]. //! [Alarm]s can be configured in two modes: [Target] (one-shot) and [Periodic].
//! //!
//! ## Examples //! ## Examples
//!
//! ### Splitting up the System Timer into three alarms
//!
//! Use the [split][SystemTimer::split] method to create three alarms from the
//! System Timer, contained in a [SysTimerAlarms] struct.
//!
//! ```rust, no_run
#![doc = crate::before_snippet!()]
//! use esp_hal::timer::systimer::{
//! SystemTimer,
//! Periodic,
//! };
//!
//! let systimer = SystemTimer::new(
//! peripherals.SYSTIMER,
//! ).split::<Periodic>();
//!
//! // Reconfigure a periodic alarm to be a target alarm
//! let target_alarm = systimer.alarm0.into_target();
//! # }
//! ```
//!
//! ### General-purpose Timer //! ### General-purpose Timer
//! ```rust, no_run //! ```rust, no_run
#![doc = crate::before_snippet!()] #![doc = crate::before_snippet!()]
//! # use esp_hal::timer::systimer::SystemTimer; //! use esp_hal::timer::systimer::{
//! # use esp_hal::timer::timg::TimerGroup; //! Alarm,
//! # use crate::esp_hal::prelude::_esp_hal_timer_Timer; //! FrozenUnit,
//! # use esp_hal::prelude::*; //! SpecificUnit,
//! let systimer = SystemTimer::new(peripherals.SYSTIMER); //! SystemTimer,
//! };
//!
//! let mut systimer = SystemTimer::new(peripherals.SYSTIMER);
//! //!
//! // Get the current timestamp, in microseconds: //! // Get the current timestamp, in microseconds:
//! let now = SystemTimer::now(); //! let now = SystemTimer::now();
//! //!
//! let timg0 = TimerGroup::new( //! let frozen_unit = FrozenUnit::new(&mut systimer.unit0);
//! peripherals.TIMG0, //! let alarm0 = Alarm::new(systimer.comparator0, &frozen_unit);
//! &clocks, //!
//! alarm0.set_target(
//! SystemTimer::now() + SystemTimer::ticks_per_second() * 2
//! ); //! );
//! alarm0.enable_interrupt(true);
//! //!
//! let mut timer0 = timg0.timer0; //! while !alarm0.is_interrupt_set() {
//! timer0.set_interrupt_handler(tg0_t0_level); //! // Wait for the interrupt to be set
//!
//! // Wait for timeout:
//! timer0.load_value(1.secs());
//! timer0.start();
//!
//! while !timer0.is_interrupt_set() {
//! // Wait
//! } //! }
//!
//! alarm0.clear_interrupt();
//! # } //! # }
//!
//!
//! # use core::cell::RefCell;
//! # use critical_section::Mutex;
//! # use procmacros::handler;
//! # use esp_hal::interrupt::InterruptHandler;
//! # use esp_hal::interrupt;
//! # use esp_hal::peripherals::TIMG0;
//! # use esp_hal::timer::timg::{Timer, Timer0};
//! # use crate::esp_hal::prelude::_esp_hal_timer_Timer;
//! # static TIMER0: Mutex<RefCell<Option<Timer<Timer0<TIMG0>, esp_hal::Blocking>>>> = Mutex::new(RefCell::new(None));
//! #[handler]
//! fn tg0_t0_level() {
//! critical_section::with(|cs| {
//! let mut timer0 = TIMER0.borrow_ref_mut(cs);
//! let timer0 = timer0.as_mut().unwrap();
//!
//! timer0.clear_interrupt();
//!
//! // Counter value should be a very small number as the alarm triggered a
//! // counter reload to 0 and ETM stopped the counter quickly after
//! // esp_println::println!("counter in interrupt: {}", timer0.now());
//! });
//! }
//! ``` //! ```
use core::{ use core::{

View File

@ -27,8 +27,7 @@
//! ```rust, no_run //! ```rust, no_run
#![doc = crate::before_snippet!()] #![doc = crate::before_snippet!()]
//! # use esp_hal::timer::timg::TimerGroup; //! # use esp_hal::timer::timg::TimerGroup;
//! # use crate::esp_hal::prelude::_esp_hal_timer_Timer; //!
//! # use esp_hal::prelude::*;
//! let timg0 = TimerGroup::new(peripherals.TIMG0, &clocks); //! let timg0 = TimerGroup::new(peripherals.TIMG0, &clocks);
//! let timer0 = timg0.timer0; //! let timer0 = timg0.timer0;
//! //!
@ -42,6 +41,8 @@
//! while !timer0.is_interrupt_set() { //! while !timer0.is_interrupt_set() {
//! // Wait //! // Wait
//! } //! }
//!
//! timer0.clear_interrupt();
//! # } //! # }
//! ``` //! ```
//! //!
@ -49,7 +50,7 @@
//! ```rust, no_run //! ```rust, no_run
#![doc = crate::before_snippet!()] #![doc = crate::before_snippet!()]
//! # use esp_hal::timer::timg::TimerGroup; //! # use esp_hal::timer::timg::TimerGroup;
//! # use esp_hal::prelude::*; //!
//! let timg0 = TimerGroup::new(peripherals.TIMG0, &clocks); //! let timg0 = TimerGroup::new(peripherals.TIMG0, &clocks);
//! let mut wdt = timg0.wdt; //! let mut wdt = timg0.wdt;
//! //!

View File

@ -1,6 +1,7 @@
//! # Universal Asynchronous Receiver/Transmitter (UART) //! # Universal Asynchronous Receiver/Transmitter (UART)
//! //!
//! ## Overview //! ## Overview
//!
//! The UART is a hardware peripheral which handles communication using serial //! The UART is a hardware peripheral which handles communication using serial
//! communication interfaces, such as RS232 and RS485. This peripheral provides //! communication interfaces, such as RS232 and RS485. This peripheral provides
//! a cheap and ubiquitous method for full- and half-duplex communication //! a cheap and ubiquitous method for full- and half-duplex communication
@ -13,6 +14,7 @@
//! protocols. //! protocols.
//! //!
//! ## Configuration //! ## Configuration
//!
//! Each UART controller is individually configurable, and the usual setting //! Each UART controller is individually configurable, and the usual setting
//! such as baud rate, data bits, parity, and stop bits can easily be //! such as baud rate, data bits, parity, and stop bits can easily be
//! configured. Additionally, the transmit (TX) and receive (RX) pins need to //! configured. Additionally, the transmit (TX) and receive (RX) pins need to
@ -20,20 +22,26 @@
//! //!
//! ```rust, no_run //! ```rust, no_run
#![doc = crate::before_snippet!()] #![doc = crate::before_snippet!()]
//! # use esp_hal::uart::{config::Config, Uart}; //! # use esp_hal::uart::Uart;
//! use esp_hal::gpio::Io; //! use esp_hal::gpio::Io;
//!
//! let io = Io::new(peripherals.GPIO, peripherals.IO_MUX); //! let io = Io::new(peripherals.GPIO, peripherals.IO_MUX);
//! //!
//! let mut uart1 = Uart::new(peripherals.UART1, &clocks, io.pins.gpio1, //! let mut uart1 = Uart::new(
//! io.pins.gpio2).unwrap(); //! peripherals.UART1,
//! &clocks,
//! io.pins.gpio1,
//! io.pins.gpio2,
//! ).unwrap();
//! # } //! # }
//! ``` //! ```
//! //!
//! The UART controller can be configured to invert the polarity of the pins. //! The UART controller can be configured to invert the polarity of the pins.
//! This is achived by inverting the desired pins, and then constructing the //! This is achieved by inverting the desired pins, and then constructing the
//! UART instance using the inverted pins. //! UART instance using the inverted pins.
//! //!
//! ## Usage //! ## Usage
//!
//! The UART driver implements a number of third-party traits, with the //! The UART driver implements a number of third-party traits, with the
//! intention of making the HAL inter-compatible with various device drivers //! intention of making the HAL inter-compatible with various device drivers
//! from the community. This includes, but is not limited to, the [embedded-hal] //! from the community. This includes, but is not limited to, the [embedded-hal]
@ -49,7 +57,7 @@
//! ```rust, no_run //! ```rust, no_run
#![doc = crate::before_snippet!()] #![doc = crate::before_snippet!()]
//! # use esp_hal::uart::{config::Config, Uart}; //! # use esp_hal::uart::{config::Config, Uart};
//! use esp_hal::gpio::Io; //! # use esp_hal::gpio::Io;
//! # let io = Io::new(peripherals.GPIO, peripherals.IO_MUX); //! # let io = Io::new(peripherals.GPIO, peripherals.IO_MUX);
//! # let mut uart1 = Uart::new_with_config( //! # let mut uart1 = Uart::new_with_config(
//! # peripherals.UART1, //! # peripherals.UART1,
@ -67,7 +75,7 @@
//! ```rust, no_run //! ```rust, no_run
#![doc = crate::before_snippet!()] #![doc = crate::before_snippet!()]
//! # use esp_hal::uart::{config::Config, Uart}; //! # use esp_hal::uart::{config::Config, Uart};
//! use esp_hal::gpio::Io; //! # use esp_hal::gpio::Io;
//! # let io = Io::new(peripherals.GPIO, peripherals.IO_MUX); //! # let io = Io::new(peripherals.GPIO, peripherals.IO_MUX);
//! # let mut uart1 = Uart::new_with_config( //! # let mut uart1 = Uart::new_with_config(
//! # peripherals.UART1, //! # peripherals.UART1,
@ -88,21 +96,28 @@
//! ### Inverting TX and RX Pins //! ### Inverting TX and RX Pins
//! ```rust, no_run //! ```rust, no_run
#![doc = crate::before_snippet!()] #![doc = crate::before_snippet!()]
//! # use esp_hal::uart::{config::Config, Uart}; //! # use esp_hal::uart::Uart;
//! use esp_hal::gpio::{AnyPin, Io}; //! use esp_hal::gpio::{AnyPin, Io};
//!
//! let io = Io::new(peripherals.GPIO, peripherals.IO_MUX); //! let io = Io::new(peripherals.GPIO, peripherals.IO_MUX);
//! //!
//! let tx = AnyPin::new_inverted(io.pins.gpio1); //! let tx = AnyPin::new_inverted(io.pins.gpio1);
//! let rx = AnyPin::new_inverted(io.pins.gpio2); //! let rx = AnyPin::new_inverted(io.pins.gpio2);
//! let mut uart1 = Uart::new(peripherals.UART1, &clocks, tx, rx).unwrap(); //! let mut uart1 = Uart::new(
//! peripherals.UART1,
//! &clocks,
//! tx,
//! rx,
//! ).unwrap();
//! # } //! # }
//! ``` //! ```
//! //!
//! ### Constructing TX and RX Components //! ### Constructing TX and RX Components
//! ```rust, no_run //! ```rust, no_run
#![doc = crate::before_snippet!()] #![doc = crate::before_snippet!()]
//! # use esp_hal::uart::{config::Config, UartTx, UartRx}; //! # use esp_hal::uart::{UartTx, UartRx};
//! use esp_hal::gpio::{AnyPin, Io}; //! use esp_hal::gpio::{AnyPin, Io};
//!
//! let io = Io::new(peripherals.GPIO, peripherals.IO_MUX); //! let io = Io::new(peripherals.GPIO, peripherals.IO_MUX);
//! //!
//! let tx = UartTx::new(peripherals.UART0, &clocks, //! let tx = UartTx::new(peripherals.UART0, &clocks,
@ -167,7 +182,7 @@ cfg_if::cfg_if! {
/// Default RX pin for UART0 on ESP32-C3. /// Default RX pin for UART0 on ESP32-C3.
/// Corresponds to GPIO20. /// Corresponds to GPIO20.
pub type DefaultRxPin = crate::gpio::Gpio20; pub type DefaultRxPin = crate::gpio::Gpio20;
}else if #[cfg(esp32c6)] { } else if #[cfg(esp32c6)] {
/// Default TX pin for UART0 on ESP32-C6. /// Default TX pin for UART0 on ESP32-C6.
/// Corresponds to GPIO16. /// Corresponds to GPIO16.
pub type DefaultTxPin = crate::gpio::Gpio16; pub type DefaultTxPin = crate::gpio::Gpio16;
@ -175,7 +190,7 @@ cfg_if::cfg_if! {
/// Default RX pin for UART0 on ESP32-C6. /// Default RX pin for UART0 on ESP32-C6.
/// Corresponds to GPIO17. /// Corresponds to GPIO17.
pub type DefaultRxPin = crate::gpio::Gpio17; pub type DefaultRxPin = crate::gpio::Gpio17;
}else if #[cfg(esp32h2)] { } else if #[cfg(esp32h2)] {
/// Default TX pin for UART0 on ESP32-H2. /// Default TX pin for UART0 on ESP32-H2.
/// Corresponds to GPIO24. /// Corresponds to GPIO24.
pub type DefaultTxPin = crate::gpio::Gpio24; pub type DefaultTxPin = crate::gpio::Gpio24;

View File

@ -45,17 +45,19 @@
//! ```rust, no_run //! ```rust, no_run
#![doc = crate::before_snippet!()] #![doc = crate::before_snippet!()]
//! use esp_hal::usb_serial_jtag::UsbSerialJtag; //! use esp_hal::usb_serial_jtag::UsbSerialJtag;
//!
//! let mut usb_serial = UsbSerialJtag::new(peripherals.USB_DEVICE); //! let mut usb_serial = UsbSerialJtag::new(peripherals.USB_DEVICE);
//! //!
//! // Write bytes out over the USB Serial/JTAG: //! // Write bytes out over the USB Serial/JTAG:
//! usb_serial.write_bytes(b"Hello, world!").expect("write error!"); //! usb_serial.write_bytes(b"Hello, world!").expect("write error!");
//! } //! # }
//! ``` //! ```
//! //!
//! ### Splitting the USB Serial/JTAG into TX and RX Components //! ### Splitting the USB Serial/JTAG into TX and RX Components
//! ```rust, no_run //! ```rust, no_run
#![doc = crate::before_snippet!()] #![doc = crate::before_snippet!()]
//! # use esp_hal::usb_serial_jtag::UsbSerialJtag; //! use esp_hal::usb_serial_jtag::UsbSerialJtag;
//!
//! let mut usb_serial = UsbSerialJtag::new(peripherals.USB_DEVICE); //! let mut usb_serial = UsbSerialJtag::new(peripherals.USB_DEVICE);
//! // The USB Serial/JTAG can be split into separate Transmit and Receive //! // The USB Serial/JTAG can be split into separate Transmit and Receive
//! // components: //! // components:

View File

@ -19,20 +19,15 @@
use esp_backtrace as _; use esp_backtrace as _;
use esp_hal::{ use esp_hal::{
analog::adc::{Adc, AdcConfig, Attenuation}, analog::adc::{Adc, AdcConfig, Attenuation},
clock::ClockControl,
delay::Delay, delay::Delay,
gpio::Io, gpio::Io,
peripherals::Peripherals,
prelude::*, prelude::*,
system::SystemControl,
}; };
use esp_println::println; use esp_println::println;
#[entry] #[entry]
fn main() -> ! { fn main() -> ! {
let peripherals = Peripherals::take(); let (peripherals, clocks) = esp_hal::init(esp_hal::Config::default());
let system = SystemControl::new(peripherals.SYSTEM);
let clocks = ClockControl::boot_defaults(system.clock_control).freeze();
let io = Io::new(peripherals.GPIO, peripherals.IO_MUX); let io = Io::new(peripherals.GPIO, peripherals.IO_MUX);
cfg_if::cfg_if! { cfg_if::cfg_if! {

View File

@ -15,20 +15,15 @@
use esp_backtrace as _; use esp_backtrace as _;
use esp_hal::{ use esp_hal::{
analog::adc::{Adc, AdcConfig, Attenuation}, analog::adc::{Adc, AdcConfig, Attenuation},
clock::ClockControl,
delay::Delay, delay::Delay,
gpio::Io, gpio::Io,
peripherals::Peripherals,
prelude::*, prelude::*,
system::SystemControl,
}; };
use esp_println::println; use esp_println::println;
#[entry] #[entry]
fn main() -> ! { fn main() -> ! {
let peripherals = Peripherals::take(); let (peripherals, clocks) = esp_hal::init(esp_hal::Config::default());
let system = SystemControl::new(peripherals.SYSTEM);
let clocks = ClockControl::boot_defaults(system.clock_control).freeze();
let io = Io::new(peripherals.GPIO, peripherals.IO_MUX); let io = Io::new(peripherals.GPIO, peripherals.IO_MUX);
cfg_if::cfg_if! { cfg_if::cfg_if! {

View File

@ -13,23 +13,13 @@
#![no_main] #![no_main]
use esp_backtrace as _; use esp_backtrace as _;
use esp_hal::{ use esp_hal::{delay::Delay, gpio::Io, prelude::*, uart::Uart};
clock::ClockControl,
delay::Delay,
gpio::Io,
peripherals::Peripherals,
prelude::*,
system::SystemControl,
uart::Uart,
};
use esp_println::println; use esp_println::println;
use nb::block; use nb::block;
#[entry] #[entry]
fn main() -> ! { fn main() -> ! {
let peripherals = Peripherals::take(); let (peripherals, clocks) = esp_hal::init(esp_hal::Config::default());
let system = SystemControl::new(peripherals.SYSTEM);
let clocks = ClockControl::boot_defaults(system.clock_control).freeze();
let io = Io::new(peripherals.GPIO, peripherals.IO_MUX); let io = Io::new(peripherals.GPIO, peripherals.IO_MUX);

View File

@ -10,19 +10,14 @@
use esp_backtrace as _; use esp_backtrace as _;
use esp_hal::{ use esp_hal::{
clock::ClockControl,
delay::Delay, delay::Delay,
gpio::{Io, Level, Output}, gpio::{Io, Level, Output},
peripherals::Peripherals,
prelude::*, prelude::*,
system::SystemControl,
}; };
#[entry] #[entry]
fn main() -> ! { fn main() -> ! {
let peripherals = Peripherals::take(); let (peripherals, clocks) = esp_hal::init(esp_hal::Config::default());
let system = SystemControl::new(peripherals.SYSTEM);
let clocks = ClockControl::boot_defaults(system.clock_control).freeze();
// Set GPIO0 as an output, and set its state high initially. // Set GPIO0 as an output, and set its state high initially.
let io = Io::new(peripherals.GPIO, peripherals.IO_MUX); let io = Io::new(peripherals.GPIO, peripherals.IO_MUX);

View File

@ -13,19 +13,14 @@
use esp_backtrace as _; use esp_backtrace as _;
use esp_hal::{ use esp_hal::{
clock::ClockControl,
delay::Delay, delay::Delay,
gpio::{AnyInput, AnyOutput, Io, Level, Pull}, gpio::{AnyInput, AnyOutput, Io, Level, Pull},
peripherals::Peripherals,
prelude::*, prelude::*,
system::SystemControl,
}; };
#[entry] #[entry]
fn main() -> ! { fn main() -> ! {
let peripherals = Peripherals::take(); let (peripherals, clocks) = esp_hal::init(esp_hal::Config::default());
let system = SystemControl::new(peripherals.SYSTEM);
let clocks = ClockControl::boot_defaults(system.clock_control).freeze();
let io = Io::new(peripherals.GPIO, peripherals.IO_MUX); let io = Io::new(peripherals.GPIO, peripherals.IO_MUX);

View File

@ -19,21 +19,11 @@
#![no_main] #![no_main]
use esp_backtrace as _; use esp_backtrace as _;
use esp_hal::{ use esp_hal::{analog::dac::Dac, delay::Delay, gpio::Io, prelude::*};
analog::dac::Dac,
clock::ClockControl,
delay::Delay,
gpio::Io,
peripherals::Peripherals,
prelude::*,
system::SystemControl,
};
#[entry] #[entry]
fn main() -> ! { fn main() -> ! {
let peripherals = Peripherals::take(); let (peripherals, clocks) = esp_hal::init(esp_hal::Config::default());
let system = SystemControl::new(peripherals.SYSTEM);
let clocks = ClockControl::boot_defaults(system.clock_control).freeze();
let io = Io::new(peripherals.GPIO, peripherals.IO_MUX); let io = Io::new(peripherals.GPIO, peripherals.IO_MUX);

View File

@ -11,22 +11,14 @@ use core::cell::RefCell;
use critical_section::Mutex; use critical_section::Mutex;
use esp_backtrace as _; use esp_backtrace as _;
use esp_hal::{ use esp_hal::{assist_debug::DebugAssist, prelude::*};
assist_debug::DebugAssist,
clock::ClockControl,
peripherals::Peripherals,
prelude::*,
system::SystemControl,
};
use esp_println::println; use esp_println::println;
static DA: Mutex<RefCell<Option<DebugAssist>>> = Mutex::new(RefCell::new(None)); static DA: Mutex<RefCell<Option<DebugAssist>>> = Mutex::new(RefCell::new(None));
#[entry] #[entry]
fn main() -> ! { fn main() -> ! {
let peripherals = Peripherals::take(); let (peripherals, _clocks) = esp_hal::init(esp_hal::Config::default());
let system = SystemControl::new(peripherals.SYSTEM);
let _clocks = ClockControl::boot_defaults(system.clock_control).freeze();
let mut da = DebugAssist::new(peripherals.ASSIST_DEBUG); let mut da = DebugAssist::new(peripherals.ASSIST_DEBUG);
da.set_interrupt_handler(interrupt_handler); da.set_interrupt_handler(interrupt_handler);

View File

@ -9,13 +9,10 @@
use aligned::{Aligned, A64}; use aligned::{Aligned, A64};
use esp_backtrace as _; use esp_backtrace as _;
use esp_hal::{ use esp_hal::{
clock::ClockControl,
delay::Delay, delay::Delay,
dma::{Dma, DmaPriority, Mem2Mem}, dma::{Dma, DmaPriority, Mem2Mem},
dma_descriptors_chunk_size, dma_descriptors_chunk_size,
peripherals::Peripherals,
prelude::*, prelude::*,
system::SystemControl,
}; };
use log::{error, info}; use log::{error, info};
extern crate alloc; extern crate alloc;
@ -65,10 +62,9 @@ fn init_heap(psram: impl esp_hal::peripheral::Peripheral<P = esp_hal::peripheral
fn main() -> ! { fn main() -> ! {
esp_println::logger::init_logger(log::LevelFilter::Info); esp_println::logger::init_logger(log::LevelFilter::Info);
let peripherals = Peripherals::take(); let (peripherals, clocks) = esp_hal::init(esp_hal::Config::default());
init_heap(peripherals.PSRAM); init_heap(peripherals.PSRAM);
let system = SystemControl::new(peripherals.SYSTEM);
let clocks = ClockControl::boot_defaults(system.clock_control).freeze();
let delay = Delay::new(&clocks); let delay = Delay::new(&clocks);
let mut extram_buffer: &mut [u8] = dma_alloc_buffer!(DATA_SIZE, 64); let mut extram_buffer: &mut [u8] = dma_alloc_buffer!(DATA_SIZE, 64);

View File

@ -8,13 +8,10 @@
use esp_backtrace as _; use esp_backtrace as _;
use esp_hal::{ use esp_hal::{
clock::ClockControl,
delay::Delay, delay::Delay,
dma::{Dma, DmaPriority, Mem2Mem}, dma::{Dma, DmaPriority, Mem2Mem},
dma_buffers, dma_buffers,
peripherals::Peripherals,
prelude::*, prelude::*,
system::SystemControl,
}; };
use log::{error, info}; use log::{error, info};
@ -24,9 +21,8 @@ const DATA_SIZE: usize = 1024 * 10;
fn main() -> ! { fn main() -> ! {
esp_println::logger::init_logger(log::LevelFilter::Info); esp_println::logger::init_logger(log::LevelFilter::Info);
let peripherals = Peripherals::take(); let (peripherals, clocks) = esp_hal::init(esp_hal::Config::default());
let system = SystemControl::new(peripherals.SYSTEM);
let clocks = ClockControl::boot_defaults(system.clock_control).freeze();
let delay = Delay::new(&clocks); let delay = Delay::new(&clocks);
let (tx_buffer, tx_descriptors, mut rx_buffer, rx_descriptors) = dma_buffers!(DATA_SIZE); let (tx_buffer, tx_descriptors, mut rx_buffer, rx_descriptors) = dma_buffers!(DATA_SIZE);

View File

@ -12,12 +12,7 @@
use embassy_executor::Spawner; use embassy_executor::Spawner;
use embassy_time::{Duration, Timer}; use embassy_time::{Duration, Timer};
use esp_backtrace as _; use esp_backtrace as _;
use esp_hal::{ use esp_hal::timer::timg::TimerGroup;
clock::ClockControl,
peripherals::Peripherals,
system::SystemControl,
timer::timg::TimerGroup,
};
#[embassy_executor::task] #[embassy_executor::task]
async fn run() { async fn run() {
@ -30,11 +25,9 @@ async fn run() {
#[esp_hal_embassy::main] #[esp_hal_embassy::main]
async fn main(spawner: Spawner) { async fn main(spawner: Spawner) {
esp_println::logger::init_logger_from_env(); esp_println::logger::init_logger_from_env();
let (peripherals, clocks) = esp_hal::init(esp_hal::Config::default());
esp_println::println!("Init!"); esp_println::println!("Init!");
let peripherals = Peripherals::take();
let system = SystemControl::new(peripherals.SYSTEM);
let clocks = ClockControl::boot_defaults(system.clock_control).freeze();
let timg0 = TimerGroup::new(peripherals.TIMG0, &clocks); let timg0 = TimerGroup::new(peripherals.TIMG0, &clocks);
esp_hal_embassy::init(&clocks, timg0.timer0); esp_hal_embassy::init(&clocks, timg0.timer0);

View File

@ -19,22 +19,12 @@
use embassy_executor::Spawner; use embassy_executor::Spawner;
use embassy_time::{Duration, Timer}; use embassy_time::{Duration, Timer};
use esp_backtrace as _; use esp_backtrace as _;
use esp_hal::{ use esp_hal::{gpio::Io, i2c::I2C, prelude::*, timer::timg::TimerGroup};
clock::ClockControl,
gpio::Io,
i2c::I2C,
peripherals::Peripherals,
prelude::*,
system::SystemControl,
timer::timg::TimerGroup,
};
use lis3dh_async::{Lis3dh, Range, SlaveAddr}; use lis3dh_async::{Lis3dh, Range, SlaveAddr};
#[esp_hal_embassy::main] #[esp_hal_embassy::main]
async fn main(_spawner: Spawner) { async fn main(_spawner: Spawner) {
let peripherals = Peripherals::take(); let (peripherals, clocks) = esp_hal::init(esp_hal::Config::default());
let system = SystemControl::new(peripherals.SYSTEM);
let clocks = ClockControl::boot_defaults(system.clock_control).freeze();
let timg0 = TimerGroup::new(peripherals.TIMG0, &clocks); let timg0 = TimerGroup::new(peripherals.TIMG0, &clocks);
esp_hal_embassy::init(&clocks, timg0.timer0); esp_hal_embassy::init(&clocks, timg0.timer0);

View File

@ -20,21 +20,11 @@
use embassy_executor::Spawner; use embassy_executor::Spawner;
use embassy_time::{Duration, Timer}; use embassy_time::{Duration, Timer};
use esp_backtrace as _; use esp_backtrace as _;
use esp_hal::{ use esp_hal::{gpio::Io, i2c::I2C, prelude::*, timer::timg::TimerGroup};
clock::ClockControl,
gpio::Io,
i2c::I2C,
peripherals::Peripherals,
prelude::*,
system::SystemControl,
timer::timg::TimerGroup,
};
#[esp_hal_embassy::main] #[esp_hal_embassy::main]
async fn main(_spawner: Spawner) { async fn main(_spawner: Spawner) {
let peripherals = Peripherals::take(); let (peripherals, clocks) = esp_hal::init(esp_hal::Config::default());
let system = SystemControl::new(peripherals.SYSTEM);
let clocks = ClockControl::boot_defaults(system.clock_control).freeze();
let timg0 = TimerGroup::new(peripherals.TIMG0, &clocks); let timg0 = TimerGroup::new(peripherals.TIMG0, &clocks);
esp_hal_embassy::init(&clocks, timg0.timer0); esp_hal_embassy::init(&clocks, timg0.timer0);

View File

@ -20,14 +20,11 @@
use embassy_executor::Spawner; use embassy_executor::Spawner;
use esp_backtrace as _; use esp_backtrace as _;
use esp_hal::{ use esp_hal::{
clock::ClockControl,
dma::{Dma, DmaPriority}, dma::{Dma, DmaPriority},
dma_buffers, dma_buffers,
gpio::Io, gpio::Io,
i2s::{asynch::*, DataFormat, I2s, Standard}, i2s::{asynch::*, DataFormat, I2s, Standard},
peripherals::Peripherals,
prelude::*, prelude::*,
system::SystemControl,
timer::timg::TimerGroup, timer::timg::TimerGroup,
}; };
use esp_println::println; use esp_println::println;
@ -35,9 +32,7 @@ use esp_println::println;
#[esp_hal_embassy::main] #[esp_hal_embassy::main]
async fn main(_spawner: Spawner) { async fn main(_spawner: Spawner) {
println!("Init!"); println!("Init!");
let peripherals = Peripherals::take(); let (peripherals, clocks) = esp_hal::init(esp_hal::Config::default());
let system = SystemControl::new(peripherals.SYSTEM);
let clocks = ClockControl::boot_defaults(system.clock_control).freeze();
let timg0 = TimerGroup::new(peripherals.TIMG0, &clocks); let timg0 = TimerGroup::new(peripherals.TIMG0, &clocks);
esp_hal_embassy::init(&clocks, timg0.timer0); esp_hal_embassy::init(&clocks, timg0.timer0);

View File

@ -34,14 +34,11 @@
use embassy_executor::Spawner; use embassy_executor::Spawner;
use esp_backtrace as _; use esp_backtrace as _;
use esp_hal::{ use esp_hal::{
clock::ClockControl,
dma::{Dma, DmaPriority}, dma::{Dma, DmaPriority},
dma_buffers, dma_buffers,
gpio::Io, gpio::Io,
i2s::{asynch::*, DataFormat, I2s, Standard}, i2s::{asynch::*, DataFormat, I2s, Standard},
peripherals::Peripherals,
prelude::*, prelude::*,
system::SystemControl,
timer::timg::TimerGroup, timer::timg::TimerGroup,
}; };
use esp_println::println; use esp_println::println;
@ -57,9 +54,7 @@ const SINE: [i16; 64] = [
#[esp_hal_embassy::main] #[esp_hal_embassy::main]
async fn main(_spawner: Spawner) { async fn main(_spawner: Spawner) {
println!("Init!"); println!("Init!");
let peripherals = Peripherals::take(); let (peripherals, clocks) = esp_hal::init(esp_hal::Config::default());
let system = SystemControl::new(peripherals.SYSTEM);
let clocks = ClockControl::boot_defaults(system.clock_control).freeze();
let timg0 = TimerGroup::new(peripherals.TIMG0, &clocks); let timg0 = TimerGroup::new(peripherals.TIMG0, &clocks);
esp_hal_embassy::init(&clocks, timg0.timer0); esp_hal_embassy::init(&clocks, timg0.timer0);

View File

@ -19,12 +19,9 @@ use embassy_sync::{blocking_mutex::raw::CriticalSectionRawMutex, signal::Signal}
use embassy_time::{Duration, Ticker}; use embassy_time::{Duration, Ticker};
use esp_backtrace as _; use esp_backtrace as _;
use esp_hal::{ use esp_hal::{
clock::ClockControl,
cpu_control::{CpuControl, Stack}, cpu_control::{CpuControl, Stack},
get_core, get_core,
gpio::{AnyOutput, Io, Level}, gpio::{AnyOutput, Io, Level},
peripherals::Peripherals,
system::SystemControl,
timer::{timg::TimerGroup, ErasedTimer}, timer::{timg::TimerGroup, ErasedTimer},
}; };
use esp_hal_embassy::Executor; use esp_hal_embassy::Executor;
@ -54,9 +51,7 @@ async fn control_led(
#[esp_hal_embassy::main] #[esp_hal_embassy::main]
async fn main(_spawner: Spawner) { async fn main(_spawner: Spawner) {
let peripherals = Peripherals::take(); let (peripherals, clocks) = esp_hal::init(esp_hal::Config::default());
let system = SystemControl::new(peripherals.SYSTEM);
let clocks = ClockControl::boot_defaults(system.clock_control).freeze();
let io = Io::new(peripherals.GPIO, peripherals.IO_MUX); let io = Io::new(peripherals.GPIO, peripherals.IO_MUX);

View File

@ -18,14 +18,11 @@ use embassy_sync::{blocking_mutex::raw::CriticalSectionRawMutex, signal::Signal}
use embassy_time::{Duration, Ticker}; use embassy_time::{Duration, Ticker};
use esp_backtrace as _; use esp_backtrace as _;
use esp_hal::{ use esp_hal::{
clock::ClockControl,
cpu_control::{CpuControl, Stack}, cpu_control::{CpuControl, Stack},
get_core, get_core,
gpio::{AnyOutput, Io, Level}, gpio::{AnyOutput, Io, Level},
interrupt::Priority, interrupt::{software::SoftwareInterruptControl, Priority},
peripherals::Peripherals,
prelude::*, prelude::*,
system::SystemControl,
timer::{timg::TimerGroup, ErasedTimer}, timer::{timg::TimerGroup, ErasedTimer},
}; };
use esp_hal_embassy::InterruptExecutor; use esp_hal_embassy::InterruptExecutor;
@ -74,9 +71,9 @@ async fn enable_disable_led(control: &'static Signal<CriticalSectionRawMutex, bo
#[entry] #[entry]
fn main() -> ! { fn main() -> ! {
let peripherals = Peripherals::take(); let (peripherals, clocks) = esp_hal::init(esp_hal::Config::default());
let system = SystemControl::new(peripherals.SYSTEM);
let clocks = ClockControl::boot_defaults(system.clock_control).freeze(); let sw_ints = SoftwareInterruptControl::new(peripherals.SW_INTERRUPT);
let io = Io::new(peripherals.GPIO, peripherals.IO_MUX); let io = Io::new(peripherals.GPIO, peripherals.IO_MUX);
@ -93,8 +90,7 @@ fn main() -> ! {
let led = AnyOutput::new(io.pins.gpio0, Level::Low); let led = AnyOutput::new(io.pins.gpio0, Level::Low);
static EXECUTOR_CORE_1: StaticCell<InterruptExecutor<1>> = StaticCell::new(); static EXECUTOR_CORE_1: StaticCell<InterruptExecutor<1>> = StaticCell::new();
let executor_core1 = let executor_core1 = InterruptExecutor::new(sw_ints.software_interrupt1);
InterruptExecutor::new(system.software_interrupt_control.software_interrupt1);
let executor_core1 = EXECUTOR_CORE_1.init(executor_core1); let executor_core1 = EXECUTOR_CORE_1.init(executor_core1);
let _guard = cpu_control let _guard = cpu_control
@ -109,8 +105,7 @@ fn main() -> ! {
.unwrap(); .unwrap();
static EXECUTOR_CORE_0: StaticCell<InterruptExecutor<0>> = StaticCell::new(); static EXECUTOR_CORE_0: StaticCell<InterruptExecutor<0>> = StaticCell::new();
let executor_core0 = let executor_core0 = InterruptExecutor::new(sw_ints.software_interrupt0);
InterruptExecutor::new(system.software_interrupt_control.software_interrupt0);
let executor_core0 = EXECUTOR_CORE_0.init(executor_core0); let executor_core0 = EXECUTOR_CORE_0.init(executor_core0);
let spawner = executor_core0.start(Priority::Priority1); let spawner = executor_core0.start(Priority::Priority1);

View File

@ -24,10 +24,7 @@ use embassy_executor::Spawner;
use embassy_time::{Duration, Instant, Ticker, Timer}; use embassy_time::{Duration, Instant, Ticker, Timer};
use esp_backtrace as _; use esp_backtrace as _;
use esp_hal::{ use esp_hal::{
clock::ClockControl, interrupt::{software::SoftwareInterruptControl, Priority},
interrupt::Priority,
peripherals::Peripherals,
system::SystemControl,
timer::{timg::TimerGroup, ErasedTimer}, timer::{timg::TimerGroup, ErasedTimer},
}; };
use esp_hal_embassy::InterruptExecutor; use esp_hal_embassy::InterruptExecutor;
@ -73,9 +70,10 @@ async fn low_prio_async() {
async fn main(low_prio_spawner: Spawner) { async fn main(low_prio_spawner: Spawner) {
esp_println::logger::init_logger_from_env(); esp_println::logger::init_logger_from_env();
println!("Init!"); println!("Init!");
let peripherals = Peripherals::take();
let system = SystemControl::new(peripherals.SYSTEM); let (peripherals, clocks) = esp_hal::init(esp_hal::Config::default());
let clocks = ClockControl::boot_defaults(system.clock_control).freeze();
let sw_ints = SoftwareInterruptControl::new(peripherals.SW_INTERRUPT);
let timg0 = TimerGroup::new(peripherals.TIMG0, &clocks); let timg0 = TimerGroup::new(peripherals.TIMG0, &clocks);
let timer0: ErasedTimer = timg0.timer0.into(); let timer0: ErasedTimer = timg0.timer0.into();
@ -94,7 +92,7 @@ async fn main(low_prio_spawner: Spawner) {
esp_hal_embassy::init(&clocks, [timer0, timer1]); esp_hal_embassy::init(&clocks, [timer0, timer1]);
static EXECUTOR: StaticCell<InterruptExecutor<2>> = StaticCell::new(); static EXECUTOR: StaticCell<InterruptExecutor<2>> = StaticCell::new();
let executor = InterruptExecutor::new(system.software_interrupt_control.software_interrupt2); let executor = InterruptExecutor::new(sw_ints.software_interrupt2);
let executor = EXECUTOR.init(executor); let executor = EXECUTOR.init(executor);
let spawner = executor.start(Priority::Priority3); let spawner = executor.start(Priority::Priority3);

View File

@ -14,14 +14,11 @@ use embassy_executor::Spawner;
use embassy_time::{Duration, Timer}; use embassy_time::{Duration, Timer};
use esp_backtrace as _; use esp_backtrace as _;
use esp_hal::{ use esp_hal::{
clock::ClockControl,
dma::{Dma, DmaPriority}, dma::{Dma, DmaPriority},
dma_buffers, dma_buffers,
gpio::Io, gpio::Io,
parl_io::{no_clk_pin, BitPackOrder, ParlIoRxOnly, RxFourBits}, parl_io::{no_clk_pin, BitPackOrder, ParlIoRxOnly, RxFourBits},
peripherals::Peripherals,
prelude::*, prelude::*,
system::SystemControl,
timer::systimer::{SystemTimer, Target}, timer::systimer::{SystemTimer, Target},
}; };
use esp_println::println; use esp_println::println;
@ -29,9 +26,7 @@ use esp_println::println;
#[esp_hal_embassy::main] #[esp_hal_embassy::main]
async fn main(_spawner: Spawner) { async fn main(_spawner: Spawner) {
esp_println::println!("Init!"); esp_println::println!("Init!");
let peripherals = Peripherals::take(); let (peripherals, clocks) = esp_hal::init(esp_hal::Config::default());
let system = SystemControl::new(peripherals.SYSTEM);
let clocks = ClockControl::boot_defaults(system.clock_control).freeze();
let systimer = SystemTimer::new(peripherals.SYSTIMER).split::<Target>(); let systimer = SystemTimer::new(peripherals.SYSTIMER).split::<Target>();
esp_hal_embassy::init(&clocks, systimer.alarm0); esp_hal_embassy::init(&clocks, systimer.alarm0);

View File

@ -18,7 +18,6 @@ use embassy_executor::Spawner;
use embassy_time::{Duration, Timer}; use embassy_time::{Duration, Timer};
use esp_backtrace as _; use esp_backtrace as _;
use esp_hal::{ use esp_hal::{
clock::ClockControl,
dma::{Dma, DmaPriority}, dma::{Dma, DmaPriority},
dma_buffers, dma_buffers,
gpio::Io, gpio::Io,
@ -30,9 +29,7 @@ use esp_hal::{
TxFourBits, TxFourBits,
TxPinConfigWithValidPin, TxPinConfigWithValidPin,
}, },
peripherals::Peripherals,
prelude::*, prelude::*,
system::SystemControl,
timer::systimer::{SystemTimer, Target}, timer::systimer::{SystemTimer, Target},
}; };
use esp_println::println; use esp_println::println;
@ -40,9 +37,7 @@ use esp_println::println;
#[esp_hal_embassy::main] #[esp_hal_embassy::main]
async fn main(_spawner: Spawner) { async fn main(_spawner: Spawner) {
esp_println::println!("Init!"); esp_println::println!("Init!");
let peripherals = Peripherals::take(); let (peripherals, clocks) = esp_hal::init(esp_hal::Config::default());
let system = SystemControl::new(peripherals.SYSTEM);
let clocks = ClockControl::boot_defaults(system.clock_control).freeze();
let systimer = SystemTimer::new(peripherals.SYSTIMER).split::<Target>(); let systimer = SystemTimer::new(peripherals.SYSTIMER).split::<Target>();
esp_hal_embassy::init(&clocks, systimer.alarm0); esp_hal_embassy::init(&clocks, systimer.alarm0);

View File

@ -13,12 +13,9 @@ use embassy_executor::Spawner;
use embassy_time::{Duration, Timer}; use embassy_time::{Duration, Timer};
use esp_backtrace as _; use esp_backtrace as _;
use esp_hal::{ use esp_hal::{
clock::ClockControl,
gpio::{Gpio5, Io, Level, Output}, gpio::{Gpio5, Io, Level, Output},
peripherals::Peripherals,
prelude::*, prelude::*,
rmt::{asynch::RxChannelAsync, PulseCode, Rmt, RxChannelConfig, RxChannelCreatorAsync}, rmt::{asynch::RxChannelAsync, PulseCode, Rmt, RxChannelConfig, RxChannelCreatorAsync},
system::SystemControl,
timer::timg::TimerGroup, timer::timg::TimerGroup,
}; };
use esp_println::{print, println}; use esp_println::{print, println};
@ -42,9 +39,7 @@ async fn signal_task(mut pin: Output<'static, Gpio5>) {
#[esp_hal_embassy::main] #[esp_hal_embassy::main]
async fn main(spawner: Spawner) { async fn main(spawner: Spawner) {
println!("Init!"); println!("Init!");
let peripherals = Peripherals::take(); let (peripherals, clocks) = esp_hal::init(esp_hal::Config::default());
let system = SystemControl::new(peripherals.SYSTEM);
let clocks = ClockControl::boot_defaults(system.clock_control).freeze();
let timg0 = TimerGroup::new(peripherals.TIMG0, &clocks); let timg0 = TimerGroup::new(peripherals.TIMG0, &clocks);
esp_hal_embassy::init(&clocks, timg0.timer0); esp_hal_embassy::init(&clocks, timg0.timer0);

View File

@ -15,12 +15,9 @@ use embassy_executor::Spawner;
use embassy_time::{Duration, Timer}; use embassy_time::{Duration, Timer};
use esp_backtrace as _; use esp_backtrace as _;
use esp_hal::{ use esp_hal::{
clock::ClockControl,
gpio::Io, gpio::Io,
peripherals::Peripherals,
prelude::*, prelude::*,
rmt::{asynch::TxChannelAsync, PulseCode, Rmt, TxChannelConfig, TxChannelCreatorAsync}, rmt::{asynch::TxChannelAsync, PulseCode, Rmt, TxChannelConfig, TxChannelCreatorAsync},
system::SystemControl,
timer::timg::TimerGroup, timer::timg::TimerGroup,
}; };
use esp_println::println; use esp_println::println;
@ -28,9 +25,7 @@ use esp_println::println;
#[esp_hal_embassy::main] #[esp_hal_embassy::main]
async fn main(_spawner: Spawner) { async fn main(_spawner: Spawner) {
println!("Init!"); println!("Init!");
let peripherals = Peripherals::take(); let (peripherals, clocks) = esp_hal::init(esp_hal::Config::default());
let system = SystemControl::new(peripherals.SYSTEM);
let clocks = ClockControl::boot_defaults(system.clock_control).freeze();
let timg0 = TimerGroup::new(peripherals.TIMG0, &clocks); let timg0 = TimerGroup::new(peripherals.TIMG0, &clocks);
esp_hal_embassy::init(&clocks, timg0.timer0); esp_hal_embassy::init(&clocks, timg0.timer0);

View File

@ -1,7 +1,7 @@
//! embassy serial //! embassy serial
//! //!
//! This is an example of running the embassy executor and asynchronously //! This is an example of running the embassy executor and asynchronously
//! writing to and reading from uart //! writing to and reading from UART.
//% CHIPS: esp32 esp32c2 esp32c3 esp32c6 esp32h2 esp32s2 esp32s3 //% CHIPS: esp32 esp32c2 esp32c3 esp32c6 esp32h2 esp32s2 esp32s3
//% FEATURES: async embassy embassy-generic-timers //% FEATURES: async embassy embassy-generic-timers
@ -13,10 +13,8 @@ use embassy_executor::Spawner;
use embassy_sync::{blocking_mutex::raw::NoopRawMutex, signal::Signal}; use embassy_sync::{blocking_mutex::raw::NoopRawMutex, signal::Signal};
use esp_backtrace as _; use esp_backtrace as _;
use esp_hal::{ use esp_hal::{
clock::ClockControl,
gpio::Io, gpio::Io,
peripherals::{Peripherals, UART0}, peripherals::UART0,
system::SystemControl,
timer::timg::TimerGroup, timer::timg::TimerGroup,
uart::{ uart::{
config::{AtCmdConfig, Config}, config::{AtCmdConfig, Config},
@ -80,9 +78,7 @@ async fn reader(
#[esp_hal_embassy::main] #[esp_hal_embassy::main]
async fn main(spawner: Spawner) { async fn main(spawner: Spawner) {
esp_println::println!("Init!"); esp_println::println!("Init!");
let peripherals = Peripherals::take(); let (peripherals, clocks) = esp_hal::init(esp_hal::Config::default());
let system = SystemControl::new(peripherals.SYSTEM);
let clocks = ClockControl::boot_defaults(system.clock_control).freeze();
let timg0 = TimerGroup::new(peripherals.TIMG0, &clocks); let timg0 = TimerGroup::new(peripherals.TIMG0, &clocks);
esp_hal_embassy::init(&clocks, timg0.timer0); esp_hal_embassy::init(&clocks, timg0.timer0);

View File

@ -22,23 +22,18 @@ use embassy_executor::Spawner;
use embassy_time::{Duration, Timer}; use embassy_time::{Duration, Timer};
use esp_backtrace as _; use esp_backtrace as _;
use esp_hal::{ use esp_hal::{
clock::ClockControl,
dma::*, dma::*,
dma_buffers, dma_buffers,
gpio::Io, gpio::Io,
peripherals::Peripherals,
prelude::*, prelude::*,
spi::{master::Spi, SpiMode}, spi::{master::Spi, SpiMode},
system::SystemControl,
timer::timg::TimerGroup, timer::timg::TimerGroup,
}; };
#[esp_hal_embassy::main] #[esp_hal_embassy::main]
async fn main(_spawner: Spawner) { async fn main(_spawner: Spawner) {
esp_println::println!("Init!"); esp_println::println!("Init!");
let peripherals = Peripherals::take(); let (peripherals, clocks) = esp_hal::init(esp_hal::Config::default());
let system = SystemControl::new(peripherals.SYSTEM);
let clocks = ClockControl::boot_defaults(system.clock_control).freeze();
let timg0 = TimerGroup::new(peripherals.TIMG0, &clocks); let timg0 = TimerGroup::new(peripherals.TIMG0, &clocks);
esp_hal_embassy::init(&clocks, timg0.timer0); esp_hal_embassy::init(&clocks, timg0.timer0);

View File

@ -17,11 +17,8 @@ use embassy_futures::select::{select, Either};
use embassy_time::{Duration, Timer}; use embassy_time::{Duration, Timer};
use esp_backtrace as _; use esp_backtrace as _;
use esp_hal::{ use esp_hal::{
clock::ClockControl,
gpio::Io, gpio::Io,
peripherals::Peripherals,
rtc_cntl::Rtc, rtc_cntl::Rtc,
system::SystemControl,
timer::timg::TimerGroup, timer::timg::TimerGroup,
touch::{Touch, TouchConfig, TouchPad}, touch::{Touch, TouchConfig, TouchPad},
}; };
@ -30,10 +27,7 @@ use esp_println::println;
#[esp_hal_embassy::main] #[esp_hal_embassy::main]
async fn main(_spawner: Spawner) { async fn main(_spawner: Spawner) {
esp_println::logger::init_logger_from_env(); esp_println::logger::init_logger_from_env();
let (peripherals, clocks) = esp_hal::init(esp_hal::Config::default());
let peripherals = Peripherals::take();
let system = SystemControl::new(peripherals.SYSTEM);
let clocks = ClockControl::boot_defaults(system.clock_control).freeze();
let timg0 = TimerGroup::new(peripherals.TIMG0, &clocks); let timg0 = TimerGroup::new(peripherals.TIMG0, &clocks);
esp_hal_embassy::init(&clocks, timg0.timer0); esp_hal_embassy::init(&clocks, timg0.timer0);

View File

@ -25,11 +25,9 @@ use embassy_sync::{blocking_mutex::raw::NoopRawMutex, channel::Channel};
use embedded_can::{Frame, Id}; use embedded_can::{Frame, Id};
use esp_backtrace as _; use esp_backtrace as _;
use esp_hal::{ use esp_hal::{
clock::ClockControl,
gpio::Io, gpio::Io,
interrupt, interrupt,
peripherals::{self, Peripherals, TWAI0}, peripherals::{self, TWAI0},
system::SystemControl,
timer::timg::TimerGroup, timer::timg::TimerGroup,
twai::{self, EspTwaiFrame, TwaiMode, TwaiRx, TwaiTx}, twai::{self, EspTwaiFrame, TwaiMode, TwaiRx, TwaiTx},
}; };
@ -84,9 +82,7 @@ async fn transmitter(
#[esp_hal_embassy::main] #[esp_hal_embassy::main]
async fn main(spawner: Spawner) { async fn main(spawner: Spawner) {
let peripherals = Peripherals::take(); let (peripherals, clocks) = esp_hal::init(esp_hal::Config::default());
let system = SystemControl::new(peripherals.SYSTEM);
let clocks = ClockControl::boot_defaults(system.clock_control).freeze();
let timg0 = TimerGroup::new(peripherals.TIMG0, &clocks); let timg0 = TimerGroup::new(peripherals.TIMG0, &clocks);
esp_hal_embassy::init(&clocks, timg0.timer0); esp_hal_embassy::init(&clocks, timg0.timer0);

View File

@ -21,23 +21,18 @@ use embassy_usb::{
}; };
use esp_backtrace as _; use esp_backtrace as _;
use esp_hal::{ use esp_hal::{
clock::ClockControl,
gpio::Io, gpio::Io,
otg_fs::{ otg_fs::{
asynch::{Config, Driver}, asynch::{Config, Driver},
Usb, Usb,
}, },
peripherals::Peripherals,
system::SystemControl,
timer::timg::TimerGroup, timer::timg::TimerGroup,
}; };
#[esp_hal_embassy::main] #[esp_hal_embassy::main]
async fn main(_spawner: Spawner) -> () { async fn main(_spawner: Spawner) {
esp_println::println!("Init!"); esp_println::println!("Init!");
let peripherals = Peripherals::take(); let (peripherals, clocks) = esp_hal::init(esp_hal::Config::default());
let system = SystemControl::new(peripherals.SYSTEM);
let clocks = ClockControl::boot_defaults(system.clock_control).freeze();
let timg0 = TimerGroup::new(peripherals.TIMG0, &clocks); let timg0 = TimerGroup::new(peripherals.TIMG0, &clocks);
esp_hal_embassy::init(&clocks, timg0.timer0); esp_hal_embassy::init(&clocks, timg0.timer0);

View File

@ -12,9 +12,6 @@ use embassy_executor::Spawner;
use embassy_sync::{blocking_mutex::raw::NoopRawMutex, signal::Signal}; use embassy_sync::{blocking_mutex::raw::NoopRawMutex, signal::Signal};
use esp_backtrace as _; use esp_backtrace as _;
use esp_hal::{ use esp_hal::{
clock::ClockControl,
peripherals::Peripherals,
system::SystemControl,
timer::timg::TimerGroup, timer::timg::TimerGroup,
usb_serial_jtag::{UsbSerialJtag, UsbSerialJtagRx, UsbSerialJtagTx}, usb_serial_jtag::{UsbSerialJtag, UsbSerialJtagRx, UsbSerialJtagTx},
Async, Async,
@ -64,11 +61,9 @@ async fn reader(
} }
#[esp_hal_embassy::main] #[esp_hal_embassy::main]
async fn main(spawner: Spawner) -> () { async fn main(spawner: Spawner) {
esp_println::println!("Init!"); esp_println::println!("Init!");
let peripherals = Peripherals::take(); let (peripherals, clocks) = esp_hal::init(esp_hal::Config::default());
let system = SystemControl::new(peripherals.SYSTEM);
let clocks = ClockControl::boot_defaults(system.clock_control).freeze();
let timg0 = TimerGroup::new(peripherals.TIMG0, &clocks); let timg0 = TimerGroup::new(peripherals.TIMG0, &clocks);
esp_hal_embassy::init(&clocks, timg0.timer0); esp_hal_embassy::init(&clocks, timg0.timer0);

View File

@ -12,28 +12,27 @@ use embassy_executor::Spawner;
use embassy_time::{Duration, Timer}; use embassy_time::{Duration, Timer};
use esp_backtrace as _; use esp_backtrace as _;
use esp_hal::{ use esp_hal::{
clock::ClockControl,
gpio::{Input, Io, Pull}, gpio::{Input, Io, Pull},
peripherals::Peripherals,
system::SystemControl,
timer::timg::TimerGroup, timer::timg::TimerGroup,
}; };
#[esp_hal_embassy::main] #[esp_hal_embassy::main]
async fn main(_spawner: Spawner) { async fn main(_spawner: Spawner) {
esp_println::println!("Init!"); esp_println::println!("Init!");
let peripherals = Peripherals::take(); let (peripherals, clocks) = esp_hal::init(esp_hal::Config::default());
let system = SystemControl::new(peripherals.SYSTEM);
let clocks = ClockControl::boot_defaults(system.clock_control).freeze();
let timg0 = TimerGroup::new(peripherals.TIMG0, &clocks); let timg0 = TimerGroup::new(peripherals.TIMG0, &clocks);
esp_hal_embassy::init(&clocks, timg0.timer0); esp_hal_embassy::init(&clocks, timg0.timer0);
let io = Io::new(peripherals.GPIO, peripherals.IO_MUX); let io = Io::new(peripherals.GPIO, peripherals.IO_MUX);
#[cfg(any(feature = "esp32", feature = "esp32s2", feature = "esp32s3"))]
let mut input = Input::new(io.pins.gpio0, Pull::Down); cfg_if::cfg_if! {
#[cfg(not(any(feature = "esp32", feature = "esp32s2", feature = "esp32s3")))] if #[cfg(any(feature = "esp32", feature = "esp32s2", feature = "esp32s3"))] {
let mut input = Input::new(io.pins.gpio9, Pull::Down); let mut input = Input::new(io.pins.gpio0, Pull::Down);
} else {
let mut input = Input::new(io.pins.gpio9, Pull::Down);
}
}
loop { loop {
esp_println::println!("Waiting..."); esp_println::println!("Waiting...");

View File

@ -17,7 +17,6 @@ use esp_hal::{
Level, Level,
Pull, Pull,
}, },
peripherals::Peripherals,
prelude::*, prelude::*,
timer::systimer::{etm::SysTimerEtmEvent, Periodic, SystemTimer}, timer::systimer::{etm::SysTimerEtmEvent, Periodic, SystemTimer},
}; };
@ -25,7 +24,7 @@ use fugit::ExtU32;
#[entry] #[entry]
fn main() -> ! { fn main() -> ! {
let peripherals = Peripherals::take(); let (peripherals, _clocks) = esp_hal::init(esp_hal::Config::default());
let syst = SystemTimer::new(peripherals.SYSTIMER); let syst = SystemTimer::new(peripherals.SYSTIMER);
let syst_alarms = syst.split::<Periodic>(); let syst_alarms = syst.split::<Periodic>();

View File

@ -17,13 +17,12 @@ use esp_hal::{
Level, Level,
Pull, Pull,
}, },
peripherals::Peripherals,
prelude::*, prelude::*,
}; };
#[entry] #[entry]
fn main() -> ! { fn main() -> ! {
let peripherals = Peripherals::take(); let (peripherals, _clocks) = esp_hal::init(esp_hal::Config::default());
let io = Io::new(peripherals.GPIO, peripherals.IO_MUX); let io = Io::new(peripherals.GPIO, peripherals.IO_MUX);
let mut led = io.pins.gpio1; let mut led = io.pins.gpio1;

View File

@ -11,12 +11,10 @@ use core::cell::RefCell;
use critical_section::Mutex; use critical_section::Mutex;
use esp_backtrace as _; use esp_backtrace as _;
use esp_hal::{ use esp_hal::{
clock::ClockControl,
delay::Delay, delay::Delay,
etm::Etm, etm::Etm,
peripherals::{Peripherals, TIMG0}, peripherals::TIMG0,
prelude::*, prelude::*,
system::SystemControl,
timer::timg::{ timer::timg::{
etm::{TimerEtmEvents, TimerEtmTasks}, etm::{TimerEtmEvents, TimerEtmTasks},
Timer, Timer,
@ -30,9 +28,7 @@ static TIMER0: Mutex<RefCell<Option<Timer<Timer0<TIMG0>, esp_hal::Blocking>>>> =
#[entry] #[entry]
fn main() -> ! { fn main() -> ! {
let peripherals = Peripherals::take(); let (peripherals, clocks) = esp_hal::init(esp_hal::Config::default());
let system = SystemControl::new(peripherals.SYSTEM);
let clocks = ClockControl::boot_defaults(system.clock_control).freeze();
let timg0 = TimerGroup::new(peripherals.TIMG0, &clocks); let timg0 = TimerGroup::new(peripherals.TIMG0, &clocks);
let timer0 = timg0.timer0; let timer0 = timg0.timer0;

View File

@ -16,13 +16,10 @@ use core::cell::RefCell;
use critical_section::Mutex; use critical_section::Mutex;
use esp_backtrace as _; use esp_backtrace as _;
use esp_hal::{ use esp_hal::{
clock::ClockControl,
delay::Delay, delay::Delay,
gpio::{self, Event, Input, Io, Level, Output, Pull}, gpio::{self, Event, Input, Io, Level, Output, Pull},
macros::ram, macros::ram,
peripherals::Peripherals,
prelude::*, prelude::*,
system::SystemControl,
}; };
cfg_if::cfg_if! { cfg_if::cfg_if! {
@ -35,9 +32,7 @@ cfg_if::cfg_if! {
#[entry] #[entry]
fn main() -> ! { fn main() -> ! {
let peripherals = Peripherals::take(); let (peripherals, clocks) = esp_hal::init(esp_hal::Config::default());
let system = SystemControl::new(peripherals.SYSTEM);
let clocks = ClockControl::boot_defaults(system.clock_control).freeze();
// Set GPIO2 as an output, and set its state high initially. // Set GPIO2 as an output, and set its state high initially.
let mut io = Io::new(peripherals.GPIO, peripherals.IO_MUX); let mut io = Io::new(peripherals.GPIO, peripherals.IO_MUX);

View File

@ -25,15 +25,7 @@
#![no_main] #![no_main]
use esp_backtrace as _; use esp_backtrace as _;
use esp_hal::{ use esp_hal::{delay::Delay, gpio::Io, prelude::*, rmt::Rmt};
clock::ClockControl,
delay::Delay,
gpio::Io,
peripherals::Peripherals,
prelude::*,
rmt::Rmt,
system::SystemControl,
};
use esp_hal_smartled::{smartLedBuffer, SmartLedsAdapter}; use esp_hal_smartled::{smartLedBuffer, SmartLedsAdapter};
use smart_leds::{ use smart_leds::{
brightness, brightness,
@ -44,9 +36,7 @@ use smart_leds::{
#[entry] #[entry]
fn main() -> ! { fn main() -> ! {
let peripherals = Peripherals::take(); let (peripherals, clocks) = esp_hal::init(esp_hal::Config::default());
let system = SystemControl::new(peripherals.SYSTEM);
let clocks = ClockControl::boot_defaults(system.clock_control).freeze();
let io = Io::new(peripherals.GPIO, peripherals.IO_MUX); let io = Io::new(peripherals.GPIO, peripherals.IO_MUX);

View File

@ -15,21 +15,11 @@
use core::fmt::Write; use core::fmt::Write;
use esp_backtrace as _; use esp_backtrace as _;
use esp_hal::{ use esp_hal::{delay::Delay, gpio::Io, prelude::*, uart::Uart};
clock::ClockControl,
delay::Delay,
gpio::Io,
peripherals::Peripherals,
prelude::*,
system::SystemControl,
uart::Uart,
};
#[entry] #[entry]
fn main() -> ! { fn main() -> ! {
let peripherals = Peripherals::take(); let (peripherals, clocks) = esp_hal::init(esp_hal::Config::default());
let system = SystemControl::new(peripherals.SYSTEM);
let clocks = ClockControl::boot_defaults(system.clock_control).freeze();
let delay = Delay::new(&clocks); let delay = Delay::new(&clocks);

View File

@ -59,12 +59,9 @@
use esp_backtrace as _; use esp_backtrace as _;
use esp_hal::{ use esp_hal::{
clock::ClockControl,
hmac::{Hmac, HmacPurpose, KeyId}, hmac::{Hmac, HmacPurpose, KeyId},
peripherals::Peripherals,
prelude::*, prelude::*,
rng::Rng, rng::Rng,
system::SystemControl,
timer::systimer::SystemTimer, timer::systimer::SystemTimer,
}; };
use esp_println::println; use esp_println::println;
@ -76,9 +73,7 @@ type HmacSha256 = HmacSw<Sha256>;
#[entry] #[entry]
fn main() -> ! { fn main() -> ! {
let peripherals = Peripherals::take(); let (peripherals, _clocks) = esp_hal::init(esp_hal::Config::default());
let system = SystemControl::new(peripherals.SYSTEM);
let _clocks = ClockControl::boot_defaults(system.clock_control).freeze();
let mut rng = Rng::new(peripherals.RNG); let mut rng = Rng::new(peripherals.RNG);

View File

@ -12,21 +12,12 @@
#![no_main] #![no_main]
use esp_backtrace as _; use esp_backtrace as _;
use esp_hal::{ use esp_hal::{gpio::Io, i2c::I2C, prelude::*};
clock::ClockControl,
gpio::Io,
i2c::I2C,
peripherals::Peripherals,
prelude::*,
system::SystemControl,
};
use esp_println::println; use esp_println::println;
#[entry] #[entry]
fn main() -> ! { fn main() -> ! {
let peripherals = Peripherals::take(); let (peripherals, clocks) = esp_hal::init(esp_hal::Config::default());
let system = SystemControl::new(peripherals.SYSTEM);
let clocks = ClockControl::boot_defaults(system.clock_control).freeze();
let io = Io::new(peripherals.GPIO, peripherals.IO_MUX); let io = Io::new(peripherals.GPIO, peripherals.IO_MUX);

View File

@ -23,22 +23,12 @@ use embedded_graphics::{
text::{Alignment, Text}, text::{Alignment, Text},
}; };
use esp_backtrace as _; use esp_backtrace as _;
use esp_hal::{ use esp_hal::{delay::Delay, gpio::Io, i2c::I2C, prelude::*};
clock::ClockControl,
delay::Delay,
gpio::Io,
i2c::I2C,
peripherals::Peripherals,
prelude::*,
system::SystemControl,
};
use ssd1306::{prelude::*, I2CDisplayInterface, Ssd1306}; use ssd1306::{prelude::*, I2CDisplayInterface, Ssd1306};
#[entry] #[entry]
fn main() -> ! { fn main() -> ! {
let peripherals = Peripherals::take(); let (peripherals, clocks) = esp_hal::init(esp_hal::Config::default());
let system = SystemControl::new(peripherals.SYSTEM);
let clocks = ClockControl::boot_defaults(system.clock_control).freeze();
let delay = Delay::new(&clocks); let delay = Delay::new(&clocks);
let io = Io::new(peripherals.GPIO, peripherals.IO_MUX); let io = Io::new(peripherals.GPIO, peripherals.IO_MUX);

View File

@ -18,22 +18,17 @@
use esp_backtrace as _; use esp_backtrace as _;
use esp_hal::{ use esp_hal::{
clock::ClockControl,
dma::{Dma, DmaPriority}, dma::{Dma, DmaPriority},
dma_buffers, dma_buffers,
gpio::Io, gpio::Io,
i2s::{DataFormat, I2s, I2sReadDma, Standard}, i2s::{DataFormat, I2s, I2sReadDma, Standard},
peripherals::Peripherals,
prelude::*, prelude::*,
system::SystemControl,
}; };
use esp_println::println; use esp_println::println;
#[entry] #[entry]
fn main() -> ! { fn main() -> ! {
let peripherals = Peripherals::take(); let (peripherals, clocks) = esp_hal::init(esp_hal::Config::default());
let system = SystemControl::new(peripherals.SYSTEM);
let clocks = ClockControl::boot_defaults(system.clock_control).freeze();
let io = Io::new(peripherals.GPIO, peripherals.IO_MUX); let io = Io::new(peripherals.GPIO, peripherals.IO_MUX);

View File

@ -1,7 +1,7 @@
//! This shows how to transmit data continously via I2S. //! This shows how to transmit data continuously via I2S.
//! //!
//! Without an additional I2S sink device you can inspect the MCLK, BCLK, WS //! Without an additional I2S sink device you can inspect the MCLK, BCLK, WS
//! andDOUT with a logic analyzer. //! and DOUT with a logic analyzer.
//! //!
//! You can also connect e.g. a PCM510x to hear an annoying loud sine tone (full //! You can also connect e.g. a PCM510x to hear an annoying loud sine tone (full
//! scale), so turn down the volume before running this example. //! scale), so turn down the volume before running this example.
@ -32,14 +32,11 @@
use esp_backtrace as _; use esp_backtrace as _;
use esp_hal::{ use esp_hal::{
clock::ClockControl,
dma::{Dma, DmaPriority}, dma::{Dma, DmaPriority},
dma_buffers, dma_buffers,
gpio::Io, gpio::Io,
i2s::{DataFormat, I2s, I2sWriteDma, Standard}, i2s::{DataFormat, I2s, I2sWriteDma, Standard},
peripherals::Peripherals,
prelude::*, prelude::*,
system::SystemControl,
}; };
const SINE: [i16; 64] = [ const SINE: [i16; 64] = [
@ -52,9 +49,7 @@ const SINE: [i16; 64] = [
#[entry] #[entry]
fn main() -> ! { fn main() -> ! {
let peripherals = Peripherals::take(); let (peripherals, clocks) = esp_hal::init(esp_hal::Config::default());
let system = SystemControl::new(peripherals.SYSTEM);
let clocks = ClockControl::boot_defaults(system.clock_control).freeze();
let io = Io::new(peripherals.GPIO, peripherals.IO_MUX); let io = Io::new(peripherals.GPIO, peripherals.IO_MUX);

View File

@ -4,13 +4,13 @@
#![no_main] #![no_main]
use esp_backtrace as _; use esp_backtrace as _;
use esp_hal::{peripherals::Peripherals, prelude::*}; use esp_hal::prelude::*;
use esp_ieee802154::*; use esp_ieee802154::{Config, Ieee802154};
use esp_println::println; use esp_println::println;
#[entry] #[entry]
fn main() -> ! { fn main() -> ! {
let mut peripherals = Peripherals::take(); let (mut peripherals, _clocks) = esp_hal::init(esp_hal::Config::default());
let mut ieee802154 = Ieee802154::new(peripherals.IEEE802154, &mut peripherals.RADIO_CLK); let mut ieee802154 = Ieee802154::new(peripherals.IEEE802154, &mut peripherals.RADIO_CLK);
ieee802154.set_config(Config { ieee802154.set_config(Config {
@ -19,7 +19,7 @@ fn main() -> ! {
rx_when_idle: true, rx_when_idle: true,
auto_ack_rx: false, auto_ack_rx: false,
auto_ack_tx: false, auto_ack_tx: false,
..Config::default() ..Default::default()
}); });
println!("Start receiving:"); println!("Start receiving:");

View File

@ -4,13 +4,13 @@
#![no_main] #![no_main]
use esp_backtrace as _; use esp_backtrace as _;
use esp_hal::{peripherals::Peripherals, prelude::*}; use esp_hal::prelude::*;
use esp_ieee802154::*; use esp_ieee802154::{Config, Ieee802154};
use esp_println::println; use esp_println::println;
#[entry] #[entry]
fn main() -> ! { fn main() -> ! {
let mut peripherals = Peripherals::take(); let (mut peripherals, _clocks) = esp_hal::init(esp_hal::Config::default());
let mut ieee802154 = Ieee802154::new(peripherals.IEEE802154, &mut peripherals.RADIO_CLK); let mut ieee802154 = Ieee802154::new(peripherals.IEEE802154, &mut peripherals.RADIO_CLK);
ieee802154.set_config(Config { ieee802154.set_config(Config {
@ -21,7 +21,7 @@ fn main() -> ! {
auto_ack_tx: true, auto_ack_tx: true,
pan_id: Some(0x4242), pan_id: Some(0x4242),
short_addr: Some(0x2323), short_addr: Some(0x2323),
..Config::default() ..Default::default()
}); });
println!("Start receiving:"); println!("Start receiving:");

View File

@ -4,14 +4,8 @@
#![no_main] #![no_main]
use esp_backtrace as _; use esp_backtrace as _;
use esp_hal::{ use esp_hal::{delay::Delay, prelude::*};
clock::ClockControl, use esp_ieee802154::{Config, Frame, Ieee802154};
delay::Delay,
peripherals::Peripherals,
prelude::*,
system::SystemControl,
};
use esp_ieee802154::*;
use esp_println::println; use esp_println::println;
use ieee802154::mac::{ use ieee802154::mac::{
Address, Address,
@ -25,9 +19,7 @@ use ieee802154::mac::{
#[entry] #[entry]
fn main() -> ! { fn main() -> ! {
let mut peripherals = Peripherals::take(); let (mut peripherals, clocks) = esp_hal::init(esp_hal::Config::default());
let system = SystemControl::new(peripherals.SYSTEM);
let clocks = ClockControl::max(system.clock_control).freeze();
let delay = Delay::new(&clocks); let delay = Delay::new(&clocks);
@ -38,7 +30,7 @@ fn main() -> ! {
promiscuous: false, promiscuous: false,
pan_id: Some(0x4242), pan_id: Some(0x4242),
short_addr: Some(0x2323), short_addr: Some(0x2323),
..Config::default() ..Default::default()
}); });
let mut seq_number = 0u8; let mut seq_number = 0u8;

View File

@ -4,14 +4,8 @@
#![no_main] #![no_main]
use esp_backtrace as _; use esp_backtrace as _;
use esp_hal::{ use esp_hal::{delay::Delay, prelude::*};
clock::ClockControl, use esp_ieee802154::{Config, Frame, Ieee802154};
delay::Delay,
peripherals::Peripherals,
prelude::*,
system::SystemControl,
};
use esp_ieee802154::*;
use esp_println::println; use esp_println::println;
use ieee802154::mac::{ use ieee802154::mac::{
Address, Address,
@ -25,9 +19,7 @@ use ieee802154::mac::{
#[entry] #[entry]
fn main() -> ! { fn main() -> ! {
let mut peripherals = Peripherals::take(); let (mut peripherals, clocks) = esp_hal::init(esp_hal::Config::default());
let system = SystemControl::new(peripherals.SYSTEM);
let clocks = ClockControl::max(system.clock_control).freeze();
let delay = Delay::new(&clocks); let delay = Delay::new(&clocks);
@ -38,7 +30,7 @@ fn main() -> ! {
promiscuous: false, promiscuous: false,
pan_id: Some(0x4242), pan_id: Some(0x4242),
short_addr: Some(0x2222), short_addr: Some(0x2222),
..Config::default() ..Default::default()
}); });
let mut seq_number = 0u8; let mut seq_number = 0u8;

View File

@ -8,23 +8,13 @@
#![no_main] #![no_main]
use esp_backtrace as _; use esp_backtrace as _;
use esp_hal::{ use esp_hal::{gpio::Io, prelude::*, reset::software_reset, uart::Uart};
clock::ClockControl, use esp_ieee802154::{Config, Ieee802154};
gpio::Io,
peripherals::Peripherals,
prelude::*,
reset::software_reset,
system::SystemControl,
uart::Uart,
};
use esp_ieee802154::*;
use esp_println::println; use esp_println::println;
#[entry] #[entry]
fn main() -> ! { fn main() -> ! {
let mut peripherals = Peripherals::take(); let (mut peripherals, clocks) = esp_hal::init(esp_hal::Config::default());
let system = SystemControl::new(peripherals.SYSTEM);
let clocks = ClockControl::max(system.clock_control).freeze();
let io = Io::new(peripherals.GPIO, peripherals.IO_MUX); let io = Io::new(peripherals.GPIO, peripherals.IO_MUX);
@ -69,7 +59,7 @@ fn main() -> ! {
rx_when_idle: true, rx_when_idle: true,
auto_ack_rx: false, auto_ack_rx: false,
auto_ack_tx: false, auto_ack_tx: false,
..Config::default() ..Default::default()
}); });
ieee802154.start_receive(); ieee802154.start_receive();

View File

@ -25,7 +25,6 @@
use esp_backtrace as _; use esp_backtrace as _;
use esp_hal::{ use esp_hal::{
clock::ClockControl,
delay::Delay, delay::Delay,
dma::{Dma, DmaPriority}, dma::{Dma, DmaPriority},
dma_buffers, dma_buffers,
@ -36,18 +35,14 @@ use esp_hal::{
cam::{Camera, RxEightBits}, cam::{Camera, RxEightBits},
LcdCam, LcdCam,
}, },
peripherals::Peripherals,
prelude::*, prelude::*,
system::SystemControl,
Blocking, Blocking,
}; };
use esp_println::println; use esp_println::println;
#[entry] #[entry]
fn main() -> ! { fn main() -> ! {
let peripherals = Peripherals::take(); let (peripherals, clocks) = esp_hal::init(esp_hal::Config::default());
let system = SystemControl::new(peripherals.SYSTEM);
let clocks = ClockControl::boot_defaults(system.clock_control).freeze();
let io = Io::new(peripherals.GPIO, peripherals.IO_MUX); let io = Io::new(peripherals.GPIO, peripherals.IO_MUX);

View File

@ -23,7 +23,6 @@
use esp_backtrace as _; use esp_backtrace as _;
use esp_hal::{ use esp_hal::{
clock::ClockControl,
delay::Delay, delay::Delay,
dma::{Dma, DmaPriority}, dma::{Dma, DmaPriority},
dma_buffers, dma_buffers,
@ -32,17 +31,13 @@ use esp_hal::{
lcd::i8080::{Config, TxEightBits, I8080}, lcd::i8080::{Config, TxEightBits, I8080},
LcdCam, LcdCam,
}, },
peripherals::Peripherals,
prelude::*, prelude::*,
system::SystemControl,
}; };
use esp_println::println; use esp_println::println;
#[entry] #[entry]
fn main() -> ! { fn main() -> ! {
let peripherals = Peripherals::take(); let (peripherals, clocks) = esp_hal::init(esp_hal::Config::default());
let system = SystemControl::new(peripherals.SYSTEM);
let clocks = ClockControl::boot_defaults(system.clock_control).freeze();
let io = Io::new(peripherals.GPIO, peripherals.IO_MUX); let io = Io::new(peripherals.GPIO, peripherals.IO_MUX);

View File

@ -11,7 +11,6 @@
use esp_backtrace as _; use esp_backtrace as _;
use esp_hal::{ use esp_hal::{
clock::ClockControl,
gpio::Io, gpio::Io,
ledc::{ ledc::{
channel::{self, ChannelIFace}, channel::{self, ChannelIFace},
@ -20,16 +19,12 @@ use esp_hal::{
Ledc, Ledc,
LowSpeed, LowSpeed,
}, },
peripherals::Peripherals,
prelude::*, prelude::*,
system::SystemControl,
}; };
#[entry] #[entry]
fn main() -> ! { fn main() -> ! {
let peripherals = Peripherals::take(); let (peripherals, clocks) = esp_hal::init(esp_hal::Config::default());
let system = SystemControl::new(peripherals.SYSTEM);
let clocks = ClockControl::boot_defaults(system.clock_control).freeze();
let io = Io::new(peripherals.GPIO, peripherals.IO_MUX); let io = Io::new(peripherals.GPIO, peripherals.IO_MUX);
let led = io.pins.gpio0; let led = io.pins.gpio0;

View File

@ -17,14 +17,13 @@ use esp_backtrace as _;
use esp_hal::{ use esp_hal::{
gpio::{lp_io::LowPowerOutput, Io}, gpio::{lp_io::LowPowerOutput, Io},
lp_core::{LpCore, LpCoreWakeupSource}, lp_core::{LpCore, LpCoreWakeupSource},
peripherals::Peripherals,
prelude::*, prelude::*,
}; };
use esp_println::{print, println}; use esp_println::{print, println};
#[entry] #[entry]
fn main() -> ! { fn main() -> ! {
let peripherals = Peripherals::take(); let (peripherals, _clocks) = esp_hal::init(esp_hal::Config::default());
// configure GPIO 1 as LP output pin // configure GPIO 1 as LP output pin
let io = Io::new(peripherals.GPIO, peripherals.IO_MUX); let io = Io::new(peripherals.GPIO, peripherals.IO_MUX);

View File

@ -19,14 +19,13 @@ use esp_hal::{
gpio::{lp_io::LowPowerOutputOpenDrain, Io}, gpio::{lp_io::LowPowerOutputOpenDrain, Io},
i2c::lp_i2c::LpI2c, i2c::lp_i2c::LpI2c,
lp_core::{LpCore, LpCoreWakeupSource}, lp_core::{LpCore, LpCoreWakeupSource},
peripherals::Peripherals,
prelude::*, prelude::*,
}; };
use esp_println::println; use esp_println::println;
#[entry] #[entry]
fn main() -> ! { fn main() -> ! {
let peripherals = Peripherals::take(); let (peripherals, _clocks) = esp_hal::init(esp_hal::Config::default());
let io = Io::new(peripherals.GPIO, peripherals.IO_MUX); let io = Io::new(peripherals.GPIO, peripherals.IO_MUX);

View File

@ -16,24 +16,19 @@
use esp_backtrace as _; use esp_backtrace as _;
use esp_hal::{ use esp_hal::{
clock::ClockControl,
gpio::{ gpio::{
lp_io::{LowPowerInput, LowPowerOutput}, lp_io::{LowPowerInput, LowPowerOutput},
Io, Io,
}, },
lp_core::{LpCore, LpCoreWakeupSource}, lp_core::{LpCore, LpCoreWakeupSource},
peripherals::Peripherals,
prelude::*, prelude::*,
system::SystemControl,
uart::{config::Config, lp_uart::LpUart, Uart}, uart::{config::Config, lp_uart::LpUart, Uart},
}; };
use esp_println::println; use esp_println::println;
#[entry] #[entry]
fn main() -> ! { fn main() -> ! {
let peripherals = Peripherals::take(); let (peripherals, clocks) = esp_hal::init(esp_hal::Config::default());
let system = SystemControl::new(peripherals.SYSTEM);
let clocks = ClockControl::boot_defaults(system.clock_control).freeze();
let io = Io::new(peripherals.GPIO, peripherals.IO_MUX); let io = Io::new(peripherals.GPIO, peripherals.IO_MUX);

View File

@ -11,19 +11,14 @@
use esp_backtrace as _; use esp_backtrace as _;
use esp_hal::{ use esp_hal::{
clock::ClockControl,
gpio::Io, gpio::Io,
mcpwm::{operator::PwmPinConfig, timer::PwmWorkingMode, McPwm, PeripheralClockConfig}, mcpwm::{operator::PwmPinConfig, timer::PwmWorkingMode, McPwm, PeripheralClockConfig},
peripherals::Peripherals,
prelude::*, prelude::*,
system::SystemControl,
}; };
#[entry] #[entry]
fn main() -> ! { fn main() -> ! {
let peripherals = Peripherals::take(); let (peripherals, clocks) = esp_hal::init(esp_hal::Config::default());
let system = SystemControl::new(peripherals.SYSTEM);
let clocks = ClockControl::boot_defaults(system.clock_control).freeze();
let io = Io::new(peripherals.GPIO, peripherals.IO_MUX); let io = Io::new(peripherals.GPIO, peripherals.IO_MUX);
let pin = io.pins.gpio0; let pin = io.pins.gpio0;

View File

@ -13,12 +13,9 @@ use core::{cell::RefCell, ptr::addr_of_mut};
use critical_section::Mutex; use critical_section::Mutex;
use esp_backtrace as _; use esp_backtrace as _;
use esp_hal::{ use esp_hal::{
clock::ClockControl,
cpu_control::{CpuControl, Stack}, cpu_control::{CpuControl, Stack},
delay::Delay, delay::Delay,
peripherals::Peripherals,
prelude::*, prelude::*,
system::SystemControl,
}; };
use esp_println::println; use esp_println::println;
@ -26,9 +23,7 @@ static mut APP_CORE_STACK: Stack<8192> = Stack::new();
#[entry] #[entry]
fn main() -> ! { fn main() -> ! {
let peripherals = Peripherals::take(); let (peripherals, clocks) = esp_hal::init(esp_hal::Config::default());
let system = SystemControl::new(peripherals.SYSTEM);
let clocks = ClockControl::boot_defaults(system.clock_control).freeze();
let delay = Delay::new(&clocks); let delay = Delay::new(&clocks);

View File

@ -11,23 +11,18 @@
use esp_backtrace as _; use esp_backtrace as _;
use esp_hal::{ use esp_hal::{
clock::ClockControl,
delay::Delay, delay::Delay,
dma::{Dma, DmaPriority}, dma::{Dma, DmaPriority},
dma_buffers, dma_buffers,
gpio::Io, gpio::Io,
parl_io::{no_clk_pin, BitPackOrder, ParlIoRxOnly, RxFourBits}, parl_io::{no_clk_pin, BitPackOrder, ParlIoRxOnly, RxFourBits},
peripherals::Peripherals,
prelude::*, prelude::*,
system::SystemControl,
}; };
use esp_println::println; use esp_println::println;
#[entry] #[entry]
fn main() -> ! { fn main() -> ! {
let peripherals = Peripherals::take(); let (peripherals, clocks) = esp_hal::init(esp_hal::Config::default());
let system = SystemControl::new(peripherals.SYSTEM);
let clocks = ClockControl::boot_defaults(system.clock_control).freeze();
let io = Io::new(peripherals.GPIO, peripherals.IO_MUX); let io = Io::new(peripherals.GPIO, peripherals.IO_MUX);

View File

@ -15,7 +15,6 @@
use esp_backtrace as _; use esp_backtrace as _;
use esp_hal::{ use esp_hal::{
clock::ClockControl,
delay::Delay, delay::Delay,
dma::{Dma, DmaPriority}, dma::{Dma, DmaPriority},
dma_buffers, dma_buffers,
@ -28,17 +27,13 @@ use esp_hal::{
TxFourBits, TxFourBits,
TxPinConfigWithValidPin, TxPinConfigWithValidPin,
}, },
peripherals::Peripherals,
prelude::*, prelude::*,
system::SystemControl,
}; };
use esp_println::println; use esp_println::println;
#[entry] #[entry]
fn main() -> ! { fn main() -> ! {
let peripherals = Peripherals::take(); let (peripherals, clocks) = esp_hal::init(esp_hal::Config::default());
let system = SystemControl::new(peripherals.SYSTEM);
let clocks = ClockControl::boot_defaults(system.clock_control).freeze();
let io = Io::new(peripherals.GPIO, peripherals.IO_MUX); let io = Io::new(peripherals.GPIO, peripherals.IO_MUX);

View File

@ -1,6 +1,6 @@
//! PCNT Encoder Demo //! PCNT Encoder Demo
//! //!
//! This example decodes a quadrature encoder //! This example decodes a quadrature encoder.
//! //!
//! Since the PCNT units reset to zero when they reach their limits //! Since the PCNT units reset to zero when they reach their limits
//! we enable an interrupt on the upper and lower limits and //! we enable an interrupt on the upper and lower limits and
@ -27,7 +27,6 @@ use esp_hal::{
unit, unit,
Pcnt, Pcnt,
}, },
peripherals::Peripherals,
prelude::*, prelude::*,
}; };
use esp_println::println; use esp_println::println;
@ -38,7 +37,7 @@ static VALUE: AtomicI32 = AtomicI32::new(0);
#[entry] #[entry]
fn main() -> ! { fn main() -> ! {
let peripherals = Peripherals::take(); let (peripherals, _clocks) = esp_hal::init(esp_hal::Config::default());
let io = Io::new(peripherals.GPIO, peripherals.IO_MUX); let io = Io::new(peripherals.GPIO, peripherals.IO_MUX);

Some files were not shown because too many files have changed in this diff Show More