From ea4d250eb48a07e223107ea759923b47bc3ebcc4 Mon Sep 17 00:00:00 2001
From: grammers <samkar-4@student.ltu.se>
Date: Wed, 14 Feb 2018 20:07:52 +0000
Subject: [PATCH] bare5: task 2

---
 examples/.bare5.rs.swp | Bin 20480 -> 24576 bytes
 examples/bare5.rs      |  46 +++++++++++++++++++++++++++++++----------
 2 files changed, 35 insertions(+), 11 deletions(-)

diff --git a/examples/.bare5.rs.swp b/examples/.bare5.rs.swp
index 5f9c56a8961c6eeb8293d8357fd0d60aae8d53b0..3a33262254f9e0e8a262228114e94f049cdb9e18 100644
GIT binary patch
delta 1582
zcmZozz}RqrQ7p+I%+puFLeGGKfq_AQfgy8ROO&kFMzJ^i>?{oR3=9lRlMMyLCo2dD
zFq(o`nyes&5Vc@dDVStnV1&}lP&#sRpg=$WBn1{;F$M+(H;}Xd1B2^iK?UP_U48}z
zS$+lvCVmD6Mt%l{w|oo?xA_<tmhv$$B=RvZ$nr5T+~j3oxXjDIu!Wa_VKXlS!z5k?
zhCE&dh74W?hIC#A22WlF27O)z27X=!21Z^6hBrJ643Bsi7?$xcFwEg$V3^Irz|hFU
zz!1&Dz~IZnz+l0{z@W#&!0?KjA)Vm?Hv_{hZU%;%+zbq-xEUDMax*Z@<Yr)K;bvg?
z#l^r-z{SAujFW*OhLeHe5(fi=2L}VgK6VBM6LtoMRcs6l3TzAv(^wf8cvu-2nphYZ
zelRmI<S{caJYiyBh+<-3xWEYV@?<MTna!SxFL)WXChO~8t>4Maz+edqKLG}YNN6y9
z;b&mD%g?}Yh@XLB4L<`zBR>O!4>WjW_!$`f@-Z-M<zrwd;bUNM<zrxQ;bUOn<YQns
z&db1XjF*973NHi0WL^e_4qgU^0$v6N6<!7g7G4I1cRUOXZ+RFPuJJH1bn-ATc<?aP
zGbr*fFmUrQFtG42F#P9cVED_;!0?Bgf#C)>1H)-<28PMp3=F;83=G}e3=BEk3=Hwy
z3=BHl3=C@A3=AsV3=B`X7#I$5F);LSF)*ZaF)(;@F)(;?F)(OxF)#>mF);k*WMH_@
z$-r=vlY!whCj-MtP6mb(oD2;6I2jlcIO`c0<T)7_j&U$B<Z&=Cm~t>M7;!K#{9$Kc
z_{q+|Fo~Ukp`V?BA(owiA&Q-W!IGVU!Hk`O!GN8C;UpUa!!b4nhFNS34Aa>d7*g37
z7?Ri+7#!Ic7#!Fb7(THwFdSuNVA#vbz);D`z)-=;z!1jDz+lY^4RKItZ{}cG$~^g?
znaJj^W>Z<}i&9HUi}DnTtQiy(6clQ~B#2d{V5^`}q+nyCV5q5}tzeL32vL!iU!;(!
zkeR1osHaz+S(2ep4c3yATB49!TB1;7rBG^Yq+qLHV9k)0r;wXi91l{Z0V2RsnhLsh
zASKldV7uxS%8N2fQsYaFjWiNdQi^mG$`W%*Q#B!$f!PYS3c1C}3N;EE5U!1lLVj9W
zacT)v5!mYDWU%Q9whH+<DGF)|iW(?ZYl1w2p({TpB^0KuC^az!?g~wa<MR<BU}ZW`
zi=iC2pLD=p2fGd|r8)Vfwe05k)?CbnxkzTD78hGtxd(XqJH|UX2D|Dg7#ip(80jb&
zBpDb&{i3fwd8M5_lfM4s7j|iI&ESv$>ke{u2I~dINQJS1rjCJ*p$?K}KYJq<eSL+5
z$&L1QAXE0+i<*F9Q(qqxN<qoV3bqPC&d$}fU=L=d<fLk7DpWHhrZ6xpWME*J2rZvX
zCkr~P4s&5<U@%~2V9;k~V7Sc0z_6Ezfnhll1H()v28LuN1_pU128P>=3=Gp5Av%qi
z7#NtD7#O}YGB7M-WMJ@TWMHslWMD97WMD93WMD95WMEKaoGjv4zxkRj2P1E8eu@Gp
z&Qptv6{;t%cIuMQ*DozjRVXgWH8x5!F{rSz(z0gI(r2ihJkL{hbE@-fo-mM075Eq!
zYWN_9uK*}XGcYjx<7Z%a!_UBQgP(z60zU&o7e50-2R{QtJ3j+M1hg>u$;ZI3fRBM;
v3LgW*Bt8a)iF^zU6ToI|P83k!W77wN$;yt3oQUWMbqogu<Qm8SObQGDoi{r8

delta 1068
zcmZoTz}T>WQ7p+I%+puFLeGGKfq_AQf#H68OVlCHjbd;3`I#B&85kItKoSfL3@(!e
z1>_m+CL0Qfb23B4JU15#^z%<#pfE{+g;$n=fx(jzVv5UTK?UP_1%3twR(=Ks7JdeX
z4}1&^_xKnXR`4+}r0_8?DDW{b+~H+lxW>!Cu$`BIVH+<4!&F`dhC*HjhHPF2hAdtN
z1|MDq1|wbu1|ePs1{PihhW9)S3{QC&7*_HyFwEy+V3^0lz|g|Oz!1m7z!1R0z+lb8
zz+lM3!0?uvf#ESXLpsA<ZU%-s+zbq7xfvKXa5FH>;bvfH=VoB|%f-M@%*DX)l9PcU
zo|A#$DhC6DHwOd5L3RcPb9M%XwQLLw%4`e_Gg%oJ_*oekT3Hwvels&L6f!d~JZEBH
zh-G46xXcLgt_S19iSm;z6?r!YE8gavY^Z;^ehVuD!xuJ4NO(en>Iy#t!)|^ChNb)r
z47L0W3|{;U44(W93|jmQ3{UtN7?$!eFf8F?V94ZSU{L2{U{K>@VEDqz!0?%uf#C%&
z1H%Pg28I@128I+~1_nP~1_obV1_m=;28NeB3=AuH7#JFP7#Om77#LD`80s0~c^DXC
zc^DXCco-Ngco-P8c^DWzb3+2=H8%sp8EyuK{oD);J=_coZQKkDE!+$Y&D;zOmD~&r
z(%cLTx40M>8o3x4G`ScUK5#NHyyawI*v`qou!WO>!IzVP!HbiDL4uQkL6nn$;R^=?
z!$%GVhSwYn3@scC42>KS3=E+h3=BaW3=9e!3=Fay3=DtR85n+p0+yYDp@E%&p@N-(
z!GxWG!I+(aL6Dt+;Tszy#9py6Fl=LEVDN@wPc{aIU^WJZ05IOn$g+losg_}~rK!41
zEizzGP^blAh!{wL&SVQyO)n6i0Yo4$LK#Ag5Q{-UVY9yJ0+z`WtwlH6TXQi_uClYA
zyxT5qa*(|dqr&74d%K{V)DnfF<mC9|{DMjaTLrbE<Ya4xv^<5(l$=zJqU2;N1-0DL
z5``dVXB~y~g3SCxsDOKbr@y17LN!BT3IhW_0|SFHG!NNL7Iau0Vam+FV8YD6aD$0~
z;Sdu8!x|<AhSf|A3^SP+7+RSa7;Kps7|fX%7)+TM7)+QL7+9GY7=AJ`Fsxu?U<hPn
zV6bLnV6bFlV6b3hU@&Kdn6AXgz%W_Jv3~NCILXQX<Ni-x=F}xzTAZp-T#{>SlxAX3
UVP&Od%}_geo~P{QROi_|0K(zg-2eap

diff --git a/examples/bare5.rs b/examples/bare5.rs
index eaf19e2..8123f65 100644
--- a/examples/bare5.rs
+++ b/examples/bare5.rs
@@ -9,6 +9,7 @@ extern crate cortex_m;
 extern crate cortex_m_rt;
 
 // C like API...
+/*
 mod stm32f40x {
     use core::{cell, ptr};
 
@@ -107,12 +108,19 @@ mod stm32f40x {
         }
     }
 }
-use stm32f40x::*;
+*/
+//use stm32f40x::*;
 
 // see the Reference Manual RM0368 (www.st.com/resource/en/reference_manual/dm00096844.pdf)
 // rcc,     chapter 6
 // gpio,    chapter 8
-
+mod address {
+        pub const PERIPH_BASE: u32      = 0x40000000;
+        pub const AHB1PERIPH_BASE: u32  = PERIPH_BASE + 0x00020000;
+        pub const RCC_BASE: u32         = AHB1PERIPH_BASE + 0x3800;
+        pub const GPIOA_BASE: u32       = AHB1PERIPH_BASE + 0x0000;
+    }
+ 
 fn wait(i: u32) {
     for _ in 0..i {
         cortex_m::asm::nop(); // no operation (cannot be optimized out)
@@ -121,22 +129,25 @@ fn wait(i: u32) {
 
 // system startup, can be hidden from the user
 fn main() {
-    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);
+    //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();
 }
 
 
 // user application
-fn idle(rcc: &mut RCC, gpioa: &mut GPIOA) {
-    let rcc_copy = &rcc;
+fn idle() {
+    //let Rcc = RCC{};
+    //let rcc_copy = &rcc;
     // power on GPIOA
-    let r = rcc.AHB1ENR.read(); // read
-    rcc.AHB1ENR.write(r | 1 << (0)); // set enable
+   // `let r = rcc.AHB1ENR.read(); // read
+    //rcc.AHB1ENR.write(r | 1 << (0)); // set enable
+    mod_u32((address::RCC_BASE + 0x30),0,1,1);
 
     // 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
+    //let r = gpioa.MODER.read() & !(0b11 << (5 * 2)); // read and mask
+    //gpioa.MODER.write(r | 0b01 << (5 * 2)); // set output mode
+    mod_u32(address::GPIOA_BASE, 10, 2, 0b01);
 
     // and alter the data output through the BSRR register
     // this is more efficient as the read register is not needed.
@@ -168,6 +179,19 @@ fn read_u32(addr: u32) -> u32{
         core::ptr::read_volatile(addr as *const _)
     }
 }
+fn mod_u32(addr: u32, offset: u32, with: u32, mut value: u32){
+    let old: u32 = read_u32(addr);
+    let msc: u32 = old & !(mas_with(with) << offset);
+    value = msc | (value << offset);
+    write_u32(addr, value);
+}
+fn mas_with(with: u32) -> u32{
+    let mut r: u32 = 0;
+    for i in 1..with {
+        r = (r << 1) + 0b1;
+    }
+    return r;
+}
 
 //ike API
 // In C the .h files are used for defining interfaces, like function signatures (prototypes),
-- 
GitLab