macro_rules! reset_reg {
( $periph:path, $instance:expr, $instancemod:path, $reg:ident $([$offset:expr])*, $( $field:ident ),+ $(,)? ) => { ... };
( $periph:path, $instance:expr, $instancemod:path, $reg:ident $([$offset:expr])*) => { ... };
}
Expand description
Reset a RWRegister, UnsafeRWRegister, WORegister, or UnsafeWORegister to its reset value.
§Examples
// Safely acquire the peripheral instance (will panic if already acquired)
let gpioa = stm32ral::gpio::GPIOA::take().unwrap();
// Reset PA14 and PA15 to their reset state
reset_reg!(stm32ral::gpio, gpioa, GPIOA, MODER, MODER14, MODER15);
// Reset the entire GPIOA.MODER to its reset state
reset_reg!(stm32ral::gpio, gpioa, GPIOA, MODER);
To support register arrays, each macro form also supports one or more array indices after
the register. For example, reset_reg!(stm32ral::gpio, gpioa, GPIOA, ODR[2]);
resets the
third register in an ODR
register array.
§Usage
Like write_reg!
, this macro can be used in two ways, either resetting the entire register
or just resetting specific fields within in. The register or fields are written with their
reset values.
In both cases, the first arguments are:
- the path to the peripheral module:
stm32ral::gpio
, - a reference to the instance of that peripheral: ‘gpioa’ (anything which dereferences to
RegisterBlock
, such asInstance
,&Instance
,&RegisterBlock
, or*const RegisterBlock
), - the module for the instance of that peripheral:
GPIOA
, - the register (and offset, for arrays) you wish to access:
MODER
(a field on theRegisterBlock
).
In the whole-register usage, that’s it:
// Reset the entire GPIOA.MODER
reset_reg!(stm32ral::gpio, gpioa, GPIOA, MODER);
Otherwise, the remaining arguments are each field names:
// Reset the JTAG pins
reset_reg!(stm32ral::gpio, gpioa, GPIOA, MODER, MODER13, MODER14, MODER15);
reset_reg!(stm32ral::gpio, gpioa, GPIOB, MODER, MODER3, MODER4);
The second form is only available to RWRegister and UnsafeRWRegister, since .read()
is
not available for WORegister and UnsafeWORegister.
This macro expands to calling (*$instance).$register.write(value)
, where
value
is either the register’s reset value, or the current read value of the register
masked appropriately and combined with the reset value for each field.
§Safety
This macro will require an unsafe function or block when used with an UnsafeRWRegister or UnsafeRORegister, but not if used with RWRegister or RORegister.
When run in an unsafe context, peripheral instances are directly accessible without requiring
having called take()
beforehand:
unsafe { reset_reg!(stm32ral::gpio, GPIOA, GPIOA, MODER) };
This works because GPIOA
is a *const RegisterBlock
in the stm32ral::gpio
module;
and the macro brings such constants into scope and then dereferences the provided reference.
Note that the second argument is a *const
and the third is a path; despite both being written
GPIOA
they are not the same thing.