Skip to content
Snippets Groups Projects
Commit 6a7af9d8 authored by Hammarkvast's avatar Hammarkvast
Browse files

bare5_

parent aae803ad
No related branches found
No related tags found
No related merge requests found
......@@ -57,12 +57,20 @@ mod stm32f40x {
// width (field width)
// value (new value that the field should take)
//
// impl VolatileCell<u32> {
// #[inline(always)]
// pub fn modify(&self, offset: u8, width: u8, value: u32) {
// // your code here
// }
// }
impl VolatileCell<u32> {
#[inline(always)]
pub fn modify(&self, offset: u8, width: u8, value: u32) {
// your code here
let mask:u32 = (1<<width)-1 ;
let mut valueOfMask: u32 = 0;
if (width > 0 ){
valueOfMask = mask & value;
}
let reader = self.read() & !(mask << offset);
self.write(reader | (value & valueOfMask) << offset);
}
}
#[repr(C)]
#[allow(non_snake_case)]
......@@ -141,27 +149,27 @@ fn wait(i: u32) {
}
// simple test of Your `modify`
//fn test() {
// let t:VolatileCell<u32> = unsafe { core::mem::uninitialized() };
// t.write(0);
// assert!(t.read() == 0);
// t.modify(3, 3, 0b10101);
fn test() {
let t:VolatileCell<u32> = unsafe { core::mem::uninitialized() };
t.write(0);
assert!(t.read() == 0);
t.modify(3, 3, 0b10101);
// //
// // 10101
// // ..0111000
// // ---------
// // 000101000
// assert!(t.read() == 0b101 << 3);
// t.modify(4, 3, 0b10001);
assert!(t.read() == 0b101 << 3);
t.modify(4, 3, 0b10001);
// // 000101000
// // 111
// // 001
// // 000011000
// assert!(t.read() == 0b011 << 3);
assert!(t.read() == 0b011 << 3);
// if << is used, your code will panic in dev (debug), but not in release mode
// t.modify(32, 3, 1);
//}
t.modify(32, 3, 1);
}
// system startup, can be hidden from the user
#[entry]
......@@ -191,7 +199,7 @@ fn idle(rcc: &mut RCC, gpioa: &mut GPIOA) {
//gpioa.BSRRH.write(1 << 5); // set bit, output hight (turn on led)
// alternatively to set the bit high we can
// read the value, or with PA5 (bit 5) and write back
gpioa.ODR.write(gpioa.ODR.read() | (1 << 5));
gpioa.ODR.modify(5, 1, 1);
wait(10_000);
......@@ -199,7 +207,7 @@ fn idle(rcc: &mut RCC, gpioa: &mut GPIOA) {
//gpioa.BSRRL.write(1 << 5); // clear bit, output low (turn off led)
// alternatively to clear the bit we can
// read the value, mask out PA5 (bit 5) and write back
gpioa.ODR.write(gpioa.ODR.read() & !(1 << 5));
gpioa.ODR.modify(5, 1, 0);
wait(10_000);
}
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment