90 lines
2.5 KiB
Rust
90 lines
2.5 KiB
Rust
//! This is the **H**ardware **A**bstraction **L**ayer (HAL) for the VA416xx MCU family.
|
|
//!
|
|
//! It is an additional hardware abstraction on top of the [peripheral access API](https://egit.irs.uni-stuttgart.de/rust/va416xx-rs/src/branch/main/va416xx).
|
|
|
|
//! It is the result of reading the datasheet for the device and encoding a type-safe layer over the
|
|
//! raw PAC. This crate also implements traits specified by the
|
|
//! [embedded-hal](https://github.com/rust-embedded/embedded-hal) project, making it compatible with
|
|
//! various drivers in the embedded rust ecosystem.
|
|
|
|
//! You have to enable one of the following device features to use this crate depending on
|
|
//! which chip you are using:
|
|
|
|
//! - `va41630`
|
|
//! - `va41629`
|
|
//! - `va41628`
|
|
//! - `va41620`
|
|
//!
|
|
//! When using this HAL and writing applications for the VA416xx family in general, it is strongly
|
|
//! recommended that you set up the clock properly, because the default internal HBO clock
|
|
//! is not very accurate. You can use the [crate::clock] module for this. If you are working
|
|
//! with interrupts, it is strongly recommended to set up the IRQ router with the
|
|
//! [crate::irq_router] module at the very least because that peripheral has confusing and/or
|
|
//! faulty register reset values which might lead to weird bugs and glitches.
|
|
#![no_std]
|
|
#![cfg_attr(docsrs, feature(doc_auto_cfg))]
|
|
#[cfg(test)]
|
|
extern crate std;
|
|
|
|
#[cfg(not(feature = "device-selected"))]
|
|
compile_error!(
|
|
"This crate requires one of the following device features enabled:
|
|
va41630
|
|
va41629
|
|
va41628
|
|
"
|
|
);
|
|
|
|
pub use va416xx as device;
|
|
pub use va416xx as pac;
|
|
|
|
pub mod prelude;
|
|
|
|
pub mod clock;
|
|
pub mod dma;
|
|
pub mod edac;
|
|
pub mod gpio;
|
|
pub mod i2c;
|
|
pub mod irq_router;
|
|
pub mod pwm;
|
|
pub mod spi;
|
|
pub mod time;
|
|
pub mod timer;
|
|
pub mod typelevel;
|
|
pub mod uart;
|
|
pub mod wdt;
|
|
|
|
#[cfg(feature = "va41630")]
|
|
pub mod nvm;
|
|
|
|
#[cfg(not(feature = "va41628"))]
|
|
pub mod adc;
|
|
#[cfg(not(feature = "va41628"))]
|
|
pub mod dac;
|
|
|
|
#[derive(Debug, Eq, Copy, Clone, PartialEq)]
|
|
pub enum FunSel {
|
|
Sel0 = 0b00,
|
|
Sel1 = 0b01,
|
|
Sel2 = 0b10,
|
|
Sel3 = 0b11,
|
|
}
|
|
|
|
/// Enable a specific interrupt using the NVIC peripheral.
|
|
///
|
|
/// # Safety
|
|
///
|
|
/// This function is `unsafe` because it can break mask-based critical sections.
|
|
#[inline]
|
|
pub unsafe fn enable_interrupt(irq: pac::Interrupt) {
|
|
unsafe {
|
|
cortex_m::peripheral::NVIC::unmask(irq);
|
|
}
|
|
}
|
|
|
|
/// Disable a specific interrupt using the NVIC peripheral.
|
|
#[inline]
|
|
pub fn disable_interrupt(irq: pac::Interrupt) {
|
|
cortex_m::peripheral::NVIC::mask(irq);
|
|
}
|