3 unstable releases
0.1.1 | Sep 7, 2023 |
---|---|
0.1.0 | Aug 27, 2021 |
0.0.1 | Aug 12, 2021 |
#1929 in Embedded development
245KB
4K
SLoC
nRF-HAL
This library provides high-level access to nRF-52 and nRF-53 peripherals. Uses a similar API to STM32-HAL; designed to be interchangeable when able.
Legacy features are unsupported
This library does not support the TWI, SPI, and UART peripherals; it only supports their newer counterparts: TWIM[S], SPIM[S], and UARTE.
Many features are missing
This is currently intended to use the specific features required by AnyLeaf projects that use nRF-52. It may be expanded to be more general at some point in the future, but that's not on the near-term road map. Please use the nrf-rs libraries instead.
Currently based on nrf-rs, with much code taken directly from it.
Uses the ESB library for Nordic ShockBurst wireless communications.
(Currently unimplemented, but compatible if set up in user code.)
Getting started
The IR temperature transmitter example is a complete example of simple production firmware. It uses the TWIM, Timer, RTC, and Radio peripherals, using the ESB protocol to periodically transmit temperature. It's suitable for long-running, battery-powered use.
When specifying this crate as a dependency in Cargo.toml
, you need to specify a feature
representing your MCU. If this is for code that runs on an MCU directly (ie not a library), also
include a run-time feature, following the template 52840-rt
. For example:
cortex-m = "0.7.3"
cortex-m-rt = "0.6.13"
nrf-hal = { version = "^0.1.0", features = ["52840", "52840-rt"]}
If you need embedded-hal
traits, include the embedded-hal
feature.
The IR temperature transmitter example is a complete example of simple production firmware. It uses the TWIM, Timer, RTC, and Radio peripherals, using the ESB protocol to periodically transmit temperature. It's suitable for long-running, battery-powered use.
Example highlights:
use cortex_m::{self, asm};
use cortex_m_rt::entry;
use nrf_hal::{
clocks::Clocks,
gpio::{Pin, Port, Dir, Drive},
twim::{Twim, TwimFreq},
pac,
timer::{Timer, TimerMode},
};
#[entry]
fn main() -> ! {
let mut dp = pac::Peripherals::take().unwrap();
let _clocks = Clocks::new(dp.CLOCK);
let mut p15 = Pin::new(Port::P0, 15, Dir::Output);
p15.set_high();
let mut timer = Timer::new(dp.TIMER1, TimerMode::Timer, 1., 0);
timer.enable_interrupt(0);
let mut scl = Pin::new(Port::P0, 0, Dir::Input);
scl.drive(Drive::S0D1);
let mut sda = Pin::new(Port::P0, 1, Dir::Input);
sda.drive(Drive::S0D1);
let twim = Twim::new(dp.TWIM0, &scl, &sda, TwimFreq::K100);
loop {
asm::wfi();
}
}
Dependencies
~4–14MB
~358K SLoC