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]