Merge pull request #3911 from 0e4ef622/nrf5340-lfclk
nrf5340: configure LFCLK
This commit is contained in:
commit
6b04942ab7
@ -57,6 +57,9 @@ nfc-pins-as-gpio = []
|
|||||||
## * nRF52820, nRF52833, nRF52840: P0_18
|
## * nRF52820, nRF52833, nRF52840: P0_18
|
||||||
reset-pin-as-gpio = []
|
reset-pin-as-gpio = []
|
||||||
|
|
||||||
|
## Allow using the LFXO pins as regular GPIO pins (P0_00/P0_01 on nRF53)
|
||||||
|
lfxo-pins-as-gpio = []
|
||||||
|
|
||||||
## Implements the MultiwriteNorFlash trait for QSPI. Should only be enabled if your external
|
## Implements the MultiwriteNorFlash trait for QSPI. Should only be enabled if your external
|
||||||
## flash supports the semantics described [here](https://docs.rs/embedded-storage/0.3.1/embedded_storage/nor_flash/trait.MultiwriteNorFlash.html)
|
## flash supports the semantics described [here](https://docs.rs/embedded-storage/0.3.1/embedded_storage/nor_flash/trait.MultiwriteNorFlash.html)
|
||||||
qspi-multiwrite-flash = []
|
qspi-multiwrite-flash = []
|
||||||
|
|||||||
@ -262,7 +262,9 @@ embassy_hal_internal::peripherals! {
|
|||||||
PPI_GROUP5,
|
PPI_GROUP5,
|
||||||
|
|
||||||
// GPIO port 0
|
// GPIO port 0
|
||||||
|
#[cfg(feature = "lfxo-pins-as-gpio")]
|
||||||
P0_00,
|
P0_00,
|
||||||
|
#[cfg(feature = "lfxo-pins-as-gpio")]
|
||||||
P0_01,
|
P0_01,
|
||||||
#[cfg(feature = "nfc-pins-as-gpio")]
|
#[cfg(feature = "nfc-pins-as-gpio")]
|
||||||
P0_02,
|
P0_02,
|
||||||
@ -368,7 +370,9 @@ impl_pdm!(PDM0, PDM0, PDM0);
|
|||||||
impl_qdec!(QDEC0, QDEC0, QDEC0);
|
impl_qdec!(QDEC0, QDEC0, QDEC0);
|
||||||
impl_qdec!(QDEC1, QDEC1, QDEC1);
|
impl_qdec!(QDEC1, QDEC1, QDEC1);
|
||||||
|
|
||||||
|
#[cfg(feature = "lfxo-pins-as-gpio")]
|
||||||
impl_pin!(P0_00, 0, 0);
|
impl_pin!(P0_00, 0, 0);
|
||||||
|
#[cfg(feature = "lfxo-pins-as-gpio")]
|
||||||
impl_pin!(P0_01, 0, 1);
|
impl_pin!(P0_01, 0, 1);
|
||||||
#[cfg(feature = "nfc-pins-as-gpio")]
|
#[cfg(feature = "nfc-pins-as-gpio")]
|
||||||
impl_pin!(P0_02, 0, 2);
|
impl_pin!(P0_02, 0, 2);
|
||||||
|
|||||||
@ -65,6 +65,9 @@ compile_error!("feature `reset-pin-as-gpio` is only valid for nRF52 series chips
|
|||||||
#[cfg(all(feature = "nfc-pins-as-gpio", not(any(feature = "_nrf52", feature = "_nrf5340-app"))))]
|
#[cfg(all(feature = "nfc-pins-as-gpio", not(any(feature = "_nrf52", feature = "_nrf5340-app"))))]
|
||||||
compile_error!("feature `nfc-pins-as-gpio` is only valid for nRF52, or nRF53's application core.");
|
compile_error!("feature `nfc-pins-as-gpio` is only valid for nRF52, or nRF53's application core.");
|
||||||
|
|
||||||
|
#[cfg(all(feature = "lfxo-pins-as-gpio", not(feature = "_nrf5340")))]
|
||||||
|
compile_error!("feature `lfxo-pins-as-gpio` is only valid for nRF53 series chips.");
|
||||||
|
|
||||||
// This mod MUST go first, so that the others see its macros.
|
// This mod MUST go first, so that the others see its macros.
|
||||||
pub(crate) mod fmt;
|
pub(crate) mod fmt;
|
||||||
pub(crate) mod util;
|
pub(crate) mod util;
|
||||||
@ -282,15 +285,16 @@ pub mod config {
|
|||||||
/// Internal RC oscillator
|
/// Internal RC oscillator
|
||||||
InternalRC,
|
InternalRC,
|
||||||
/// Synthesized from the high frequency clock source.
|
/// Synthesized from the high frequency clock source.
|
||||||
#[cfg(not(any(feature = "_nrf5340", feature = "_nrf91")))]
|
#[cfg(not(feature = "_nrf91"))]
|
||||||
Synthesized,
|
Synthesized,
|
||||||
/// External source from xtal.
|
/// External source from xtal.
|
||||||
|
#[cfg(not(feature = "lfxo-pins-as-gpio"))]
|
||||||
ExternalXtal,
|
ExternalXtal,
|
||||||
/// External source from xtal with low swing applied.
|
/// External source from xtal with low swing applied.
|
||||||
#[cfg(not(any(feature = "_nrf5340", feature = "_nrf91", feature = "_nrf54l")))]
|
#[cfg(not(any(feature = "lfxo-pins-as-gpio", feature = "_nrf91", feature = "_nrf54l")))]
|
||||||
ExternalLowSwing,
|
ExternalLowSwing,
|
||||||
/// External source from xtal with full swing applied.
|
/// External source from xtal with full swing applied.
|
||||||
#[cfg(not(any(feature = "_nrf5340", feature = "_nrf91", feature = "_nrf54l")))]
|
#[cfg(not(any(feature = "lfxo-pins-as-gpio", feature = "_nrf91", feature = "_nrf54l")))]
|
||||||
ExternalFullSwing,
|
ExternalFullSwing,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -706,6 +710,19 @@ pub fn init(config: config::Config) -> Peripherals {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Workaround for anomaly 140
|
||||||
|
#[cfg(feature = "nrf5340-app-s")]
|
||||||
|
if unsafe { (0x50032420 as *mut u32).read_volatile() } & 0x80000000 != 0 {
|
||||||
|
r.events_lfclkstarted().write_value(0);
|
||||||
|
r.lfclksrc()
|
||||||
|
.write(|w| w.set_src(nrf_pac::clock::vals::Lfclksrc::LFSYNT));
|
||||||
|
r.tasks_lfclkstart().write_value(1);
|
||||||
|
while r.events_lfclkstarted().read() == 0 {}
|
||||||
|
r.events_lfclkstarted().write_value(0);
|
||||||
|
r.tasks_lfclkstop().write_value(1);
|
||||||
|
r.lfclksrc().write(|w| w.set_src(nrf_pac::clock::vals::Lfclksrc::LFRC));
|
||||||
|
}
|
||||||
|
|
||||||
// Configure LFCLK.
|
// Configure LFCLK.
|
||||||
#[cfg(not(any(feature = "_nrf51", feature = "_nrf5340", feature = "_nrf91", feature = "_nrf54l")))]
|
#[cfg(not(any(feature = "_nrf51", feature = "_nrf5340", feature = "_nrf91", feature = "_nrf54l")))]
|
||||||
match config.lfclk_source {
|
match config.lfclk_source {
|
||||||
@ -723,6 +740,36 @@ pub fn init(config: config::Config) -> Peripherals {
|
|||||||
w.set_bypass(true);
|
w.set_bypass(true);
|
||||||
}),
|
}),
|
||||||
}
|
}
|
||||||
|
#[cfg(feature = "_nrf5340")]
|
||||||
|
{
|
||||||
|
#[allow(unused_mut)]
|
||||||
|
let mut lfxo = false;
|
||||||
|
match config.lfclk_source {
|
||||||
|
config::LfclkSource::InternalRC => r.lfclksrc().write(|w| w.set_src(pac::clock::vals::Lfclksrc::LFRC)),
|
||||||
|
config::LfclkSource::Synthesized => r.lfclksrc().write(|w| w.set_src(pac::clock::vals::Lfclksrc::LFSYNT)),
|
||||||
|
#[cfg(not(feature = "lfxo-pins-as-gpio"))]
|
||||||
|
config::LfclkSource::ExternalXtal => lfxo = true,
|
||||||
|
#[cfg(not(feature = "lfxo-pins-as-gpio"))]
|
||||||
|
config::LfclkSource::ExternalLowSwing => lfxo = true,
|
||||||
|
#[cfg(not(feature = "lfxo-pins-as-gpio"))]
|
||||||
|
config::LfclkSource::ExternalFullSwing => {
|
||||||
|
#[cfg(all(feature = "_nrf5340-app"))]
|
||||||
|
pac::OSCILLATORS.xosc32ki().bypass().write(|w| w.set_bypass(true));
|
||||||
|
lfxo = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if lfxo {
|
||||||
|
if cfg!(feature = "_s") {
|
||||||
|
// MCUSEL is only accessible from secure code.
|
||||||
|
let p0 = pac::P0;
|
||||||
|
p0.pin_cnf(0)
|
||||||
|
.write(|w| w.set_mcusel(pac::gpio::vals::Mcusel::PERIPHERAL));
|
||||||
|
p0.pin_cnf(1)
|
||||||
|
.write(|w| w.set_mcusel(pac::gpio::vals::Mcusel::PERIPHERAL));
|
||||||
|
}
|
||||||
|
r.lfclksrc().write(|w| w.set_src(pac::clock::vals::Lfclksrc::LFXO));
|
||||||
|
}
|
||||||
|
}
|
||||||
#[cfg(feature = "_nrf91")]
|
#[cfg(feature = "_nrf91")]
|
||||||
match config.lfclk_source {
|
match config.lfclk_source {
|
||||||
config::LfclkSource::InternalRC => r.lfclksrc().write(|w| w.set_src(pac::clock::vals::Lfclksrc::LFRC)),
|
config::LfclkSource::InternalRC => r.lfclksrc().write(|w| w.set_src(pac::clock::vals::Lfclksrc::LFRC)),
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user