Crate avr_device
source ·Expand description
This crate contains register definitions for atmega2560, atmega328p, atmega32u4, atmega4809, attiny85, and a few things which apply to AVR microcontrollers generally.
Warning: The doc-build here on docs.rs is only for a subset of supported chips. Please build documentation locally if your MCU’s registers are not documented here.
Which chips the crate is built for depends on the feature flag used.
The following chips are available (using feature flags of the same name):
at90usb1286
,
atmega1280
,
atmega1284p
,
atmega128a
,
atmega128rfa1
,
atmega16
,
atmega164pa
,
atmega168
,
atmega2560
,
atmega8
,
atmega8u2
,
atmega324pa
atmega328p
,
atmega328pb
,
atmega32a
atmega32u4
,
atmega4808
,
atmega4809
,
atmega48p
,
atmega64
,
atmega644
,
attiny13a
,
attiny167
,
attiny1614
,
attiny202
,
attiny2313
,
attiny2313a
,
attiny26
,
attiny402
,
attiny404
,
attiny44a
,
attiny816
,
attiny828
,
attiny84
,
attiny841
,
attiny84a
,
attiny85
,
attiny861
,
attiny88
,
avr64du32
,
avr64du28
,
§How to use this crate?
In most cases you probably don’t want to use this crate directly.
This is a low level peripheral access crate (PAC).
There are more high level crates, like avr-hal
, that implement a more convenient
and higher level API built ontop of avr-device
.
However, sometimes it’s required to operate on bare device register level.
That’s what this crate is for.
§Main program entry point
#[avr_device::entry] // requires avr_device's rt feature.
fn main() -> ! {
loop {
// Your code here.
}
}
§Get access to the device peripherals
// To get access to the Peripherals struct, use this *once*:
let dp = avr_device::atmega328p::Peripherals::take().unwrap();
§Example: Digital I/O port access
// Configure bit 5 of port B as output:
dp.PORTB.ddrb.write(|w| w.pb5().set_bit());
// Clear bit 5 of port B:
dp.PORTB.portb.write(|w| w.pb5().clear_bit());
// Set bit 5 of port B:
dp.PORTB.portb.write(|w| w.pb5().set_bit());
// Configure bit 6 of port B as input with pullup:
dp.PORTB.ddrb.write(|w| w.pb6().clear_bit());
dp.PORTB.portb.write(|w| w.pb6().set_bit());
// Read bit 6 of pin B:
let _mybit = dp.PORTB.pinb.read().pb6().bit_is_set();
// Read bit 6 and write to bit 5 of port B:
dp.PORTB.portb.modify(|r, w| w.pb6().bit(r.pb5().bit_is_set()))
§Example: Other peripheral register access
Other peripheral register accesses are similar to I/O port access.
Please read the documentation of the struct R
and struct W
for the register of interest.
e.g. crate::atmega328p::spi::spcr::W
// Set SPE in SPCR (Enable SPI):
dp.SPI.spcr.write(|w| w.spe().set_bit());
§Crate feature flags
- Device selection: To enable your device, select the crate feature that matches your device. For a full list of supported devices, see the list at the beginning of this documentation.
- To enable the crate’s runtime environment, use the
rt
feature. - To enable
ufmt
formatting (e.g.uDebug
), use theufmt
feature.
Modules§
- Assembly instructions
- ATmega32U4 Peripheral access API for ATMEGA32U4 microcontrollers (generated using svd2rust v0.28.0 ( ))
- ATmega328P Peripheral access API for ATMEGA328P microcontrollers (generated using svd2rust v0.28.0 ( ))
- ATmega2560 Peripheral access API for ATMEGA2560 microcontrollers (generated using svd2rust v0.28.0 ( ))
- ATmega4809 Peripheral access API for ATMEGA4809 microcontrollers (generated using svd2rust v0.28.0 ( ))
- ATtiny85 Peripheral access API for ATTINY85 microcontrollers (generated using svd2rust v0.28.0 ( ))
- Common register and bit access and modify traits
- Chip-Generic Interrupt Utilities
Attribute Macros§
- Attribute to declare the entry point of the program
- Attribute to declare an interrupt service routine