diff --git a/examples/bare5.rs b/examples/bare5.rs index 1e253e25b1ee80b513033cde583b98e178186078..f3e63082833b990f4779a864fb5a4bb4646ea904 100644 --- a/examples/bare5.rs +++ b/examples/bare5.rs @@ -119,35 +119,47 @@ fn wait(i: u32) { } } +// system startup, can be hidden from the user fn main() { - // power on GPIOA, RM0368 6.3.11 - let rcc = RCC::get(); // get the reference to RCC in memory - unsafe { - let r = (*rcc).AHB1ENR.read(); // read - (*rcc).AHB1ENR.write(r | 1 << (0)); // set enable - } + let rcc = unsafe { &mut *RCC::get() }; // get the reference to RCC in memory + let gpioa = unsafe { &mut *GPIOA::get() }; // get the reference to GPIOA in memory + idle(rcc, gpioa); +} - // configure PA5 as output, RM0368 8.4.1 - let gpioa = GPIOA::get(); // get the reference to GPIOA in memory - unsafe { - let r = (*gpioa).MODER.read() & !(0b11 << (5 * 2)); // read and mask - (*gpioa).MODER.write(r | 0b01 << (5 * 2)); // set output mode +// user application +fn idle(rcc: &mut RCC, gpioa: &mut GPIOA) { + // power on GPIOA + let r = (*rcc).AHB1ENR.read(); // read + (*rcc).AHB1ENR.write(r | 1 << (0)); // set enable - // and alter the data output through the BSRR register - // this is more efficient as the read register is not needed. + // configure PA5 as output + let r = (*gpioa).MODER.read() & !(0b11 << (5 * 2)); // read and mask + (*gpioa).MODER.write(r | 0b01 << (5 * 2)); // set output mode - loop { - // set PA5 high, RM0368 8.4.7 - (*gpioa).BSRRH.write(1 << 5); // set bit, output hight (turn on led) - wait(10_000); + // and alter the data output through the BSRR register + // this is more efficient as the read register is not needed. - // set PA5 low, RM0368 8.4.7 - (*gpioa).BSRRL.write(1 << 5); // clear bit, output low (turn off led) - wait(10_000); - } + loop { + // set PA5 high + (*gpioa).BSRRH.write(1 << 5); // set bit, output hight (turn on led) + wait(10_000); + + // set PA5 low + (*gpioa).BSRRL.write(1 << 5); // clear bit, output low (turn off led) + wait(10_000); } } +// 1. C like API +// In C the .h files are used for defining interfaces, like function signatures (prototypes), +// structs and macros (but usually not the functions themselves) +// here is a peripheral abstraction quite similar to what you would find in the .h files +// provided by ST (and other companies). Actually, the file presesnted here is mostly a +// cut/paste/replace of the stm32f40x.h, just Rustified. +// +// Here all peripheral access is unsafe, (as we are dereferencing raw pointers). In the code +// we have fairly large unsafe blocks. Your task here is to + // As we are not using interrupts, we just register a dummy catch all handler #[link_section = ".vector_table.interrupts"] #[used]