Skip to content
Snippets Groups Projects
Commit 090c36bc authored by Per Lindgren's avatar Per Lindgren
Browse files

tmp

parent 33bbe8dc
No related branches found
No related tags found
No related merge requests found
...@@ -119,35 +119,47 @@ fn wait(i: u32) { ...@@ -119,35 +119,47 @@ fn wait(i: u32) {
} }
} }
// system startup, can be hidden from the user
fn main() { fn main() {
// power on GPIOA, RM0368 6.3.11 let rcc = unsafe { &mut *RCC::get() }; // get the reference to RCC in memory
let rcc = RCC::get(); // get the reference to RCC in memory let gpioa = unsafe { &mut *GPIOA::get() }; // get the reference to GPIOA in memory
unsafe { idle(rcc, gpioa);
let r = (*rcc).AHB1ENR.read(); // read }
(*rcc).AHB1ENR.write(r | 1 << (0)); // set enable
}
// configure PA5 as output, RM0368 8.4.1 // user application
let gpioa = GPIOA::get(); // get the reference to GPIOA in memory fn idle(rcc: &mut RCC, gpioa: &mut GPIOA) {
unsafe { // power on GPIOA
let r = (*gpioa).MODER.read() & !(0b11 << (5 * 2)); // read and mask let r = (*rcc).AHB1ENR.read(); // read
(*gpioa).MODER.write(r | 0b01 << (5 * 2)); // set output mode (*rcc).AHB1ENR.write(r | 1 << (0)); // set enable
// and alter the data output through the BSRR register // configure PA5 as output
// this is more efficient as the read register is not needed. let r = (*gpioa).MODER.read() & !(0b11 << (5 * 2)); // read and mask
(*gpioa).MODER.write(r | 0b01 << (5 * 2)); // set output mode
loop { // and alter the data output through the BSRR register
// set PA5 high, RM0368 8.4.7 // this is more efficient as the read register is not needed.
(*gpioa).BSRRH.write(1 << 5); // set bit, output hight (turn on led)
wait(10_000);
// set PA5 low, RM0368 8.4.7 loop {
(*gpioa).BSRRL.write(1 << 5); // clear bit, output low (turn off led) // set PA5 high
wait(10_000); (*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 // As we are not using interrupts, we just register a dummy catch all handler
#[link_section = ".vector_table.interrupts"] #[link_section = ".vector_table.interrupts"]
#[used] #[used]
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment