Skip to content
Snippets Groups Projects
Commit 65f29a01 authored by Per's avatar Per
Browse files

swd disable

parent 9474be3d
Branches master
No related tags found
No related merge requests found
...@@ -22,11 +22,7 @@ use cortex_m::peripheral::Peripherals; ...@@ -22,11 +22,7 @@ use cortex_m::peripheral::Peripherals;
// debugging is possible even if sleeping // debugging is possible even if sleeping
fn dbg_enable() { fn dbg_enable() {
let dbg = unsafe { &*stm32f103xx::DBG::ptr() }; let dbg = unsafe { &*stm32f103xx::DBG::ptr() };
let afio = unsafe { &*stm32f103xx::AFIO::ptr() };
// #[allow(non_snake_case)]
// let GPIOA = unsafe { &*stm32f40x::GPIOA::ptr() };
// #[allow(non_snake_case)]
// let GPIOB = unsafe { &*stm32f40x::GPIOB::ptr() };
dbg.cr.modify(|_, w| { dbg.cr.modify(|_, w| {
w.dbg_sleep() w.dbg_sleep()
.set_bit() .set_bit()
...@@ -37,41 +33,19 @@ fn dbg_enable() { ...@@ -37,41 +33,19 @@ fn dbg_enable() {
.trace_ioen() .trace_ioen()
.set_bit() .set_bit()
}); });
// 31.4.2, table 220
// afio.mapr.modify(|_, w| unsafe { w.swj_cfg().bits(0b000) }); // all debugging
// GPIOA.moder.reset();
// GPIOA.pupdr.reset();
// GPIOB.moder.reset();
// GPIOB.pupdr.reset();
} }
// set the MCU in true sleepdeep mode on WFI/WFE fn gpio_low_power() {
// debugging is disabled (until re-enabled)
fn dbg_disable() {
#[allow(non_snake_case)]
let DBG = unsafe { &*stm32f103xx::DBG::ptr() };
let afio = unsafe { &*stm32f103xx::AFIO::ptr() };
#[allow(non_snake_case)] #[allow(non_snake_case)]
let GPIOA = unsafe { &*stm32f103xx::GPIOA::ptr() }; let GPIOA = unsafe { &*stm32f103xx::GPIOA::ptr() };
#[allow(non_snake_case)] #[allow(non_snake_case)]
let GPIOB = unsafe { &*stm32f103xx::GPIOB::ptr() }; let GPIOB = unsafe { &*stm32f103xx::GPIOB::ptr() };
#[allow(non_snake_case)] #[allow(non_snake_case)]
let GPIOC = unsafe { &*stm32f103xx::GPIOC::ptr() }; let GPIOC = unsafe { &*stm32f103xx::GPIOC::ptr() };
// set all gpio to analog input #[allow(non_snake_case)]
let _a_crl_ = GPIOA.crl.read().bits(); let GPIOD = unsafe { &*stm32f103xx::GPIOD::ptr() };
let _a_crh_ = GPIOA.crh.read().bits();
// let _b_moder_ = GPIOB.crl.read().bits();
// let _a_pupdr_ = GPIOA.pupdr.read().bits();
// let _b_pupdr_ = GPIOB.pupdr.read().bits();
// 0.142 mA without manipulating GPIO/GPIOB
let v = GPIOA.crl.read().bits();
// GPIOA.crl.write(|w| unsafe { w.bits(0x0) }); // PA l, analog // set all gpio to analog input, besides PA1 (used for wakeup)
// GPIOA.crl.modify(|_, w| w.cnf1().bits(0b10)); // PA1 input pull up/down
// set PA0, PA2-7, to analog mode // set PA0, PA2-7, to analog mode
GPIOA.crl.modify(|_, w| { GPIOA.crl.modify(|_, w| {
...@@ -111,6 +85,7 @@ fn dbg_disable() { ...@@ -111,6 +85,7 @@ fn dbg_disable() {
.bits(0b00) .bits(0b00)
}); });
// set PB0-7 to analog mode
GPIOB.crl.modify(|_, w| { GPIOB.crl.modify(|_, w| {
w.cnf0() w.cnf0()
.bits(0b00) .bits(0b00)
...@@ -130,7 +105,7 @@ fn dbg_disable() { ...@@ -130,7 +105,7 @@ fn dbg_disable() {
.bits(0b00) .bits(0b00)
}); });
// set PA8-15, to analog mode // set PB8-15, to analog mode
GPIOB.crh.modify(|_, w| { GPIOB.crh.modify(|_, w| {
w.cnf8() w.cnf8()
.bits(0b00) .bits(0b00)
...@@ -150,6 +125,7 @@ fn dbg_disable() { ...@@ -150,6 +125,7 @@ fn dbg_disable() {
.bits(0b00) .bits(0b00)
}); });
// set PC0-7 to analog mode
GPIOC.crl.modify(|_, w| { GPIOC.crl.modify(|_, w| {
w.cnf0() w.cnf0()
.bits(0b00) .bits(0b00)
...@@ -169,7 +145,7 @@ fn dbg_disable() { ...@@ -169,7 +145,7 @@ fn dbg_disable() {
.bits(0b00) .bits(0b00)
}); });
// set PA8-15, to analog mode // set PC8-15, to analog mode
GPIOC.crh.modify(|_, w| { GPIOC.crh.modify(|_, w| {
w.cnf8() w.cnf8()
.bits(0b00) .bits(0b00)
...@@ -189,19 +165,45 @@ fn dbg_disable() { ...@@ -189,19 +165,45 @@ fn dbg_disable() {
.bits(0b00) .bits(0b00)
}); });
let vl = GPIOA.crl.read().bits(); // set PD0-7 to analog mode
let vh = GPIOA.crh.read().bits(); GPIOD.crl.modify(|_, w| {
// GPIOA.crh.write(|w| unsafe { w.bits(0x0) }); // PA h, analog w.cnf0()
// GPIOA.moder.modify(|_, w| w.moder1().input_mode()); // PA1, input_mode .bits(0b00)
// GPIOB.pupdr.write(|w| unsafe { w.bits(0) }); // PA, floating .cnf1()
// GPIOA.pupdr.modify(|_, w| w.pupdr1().pull_up()); // PA1, pull up .bits(0b00)
.cnf2()
let _a_crl = GPIOA.crl.read().bits(); .bits(0b00)
let _a_crh = GPIOA.crh.read().bits(); .cnf3()
.bits(0b00)
asm::nop(); .cnf4()
.bits(0b00)
.cnf5()
.bits(0b00)
.cnf6()
.bits(0b00)
.cnf7()
.bits(0b00)
});
// let swj = afio.mapr.read().bits(); // set PD8-15, to analog mode
GPIOD.crh.modify(|_, w| {
w.cnf8()
.bits(0b00)
.cnf9()
.bits(0b00)
.cnf10()
.bits(0b00)
.cnf11()
.bits(0b00)
.cnf12()
.bits(0b00)
.cnf13()
.bits(0b00)
.cnf14()
.bits(0b00)
.cnf15()
.bits(0b00)
});
// DBG.cr.modify(|_, w| { // DBG.cr.modify(|_, w| {
// w.dbg_sleep() // w.dbg_sleep()
...@@ -213,12 +215,24 @@ fn dbg_disable() { ...@@ -213,12 +215,24 @@ fn dbg_disable() {
// .trace_ioen() // .trace_ioen()
// .clear_bit() // .clear_bit()
// }); // });
}
// treat SWD pins PA 13, 14, 15 as general purose IO
fn swd_disable() {
#[allow(non_snake_case)]
let AFIO = unsafe { &*stm32f103xx::AFIO::ptr() };
// 31.4.2, table 220 // 31.4.2, table 220
// afio.mapr.modify(|_, w| unsafe { w.swj_cfg().bits(0b100) }); // no debugging AFIO.mapr.modify(|_, w| unsafe { w.swj_cfg().bits(0b100) }); // no debugging
}
// GPIOB.moder.write(|w| unsafe { w.bits(0xFFFF_FFFF) }); // PB, analog // treat SWD pins PA13, 14 15, as SWD
// GPIOB.pupdr.write(|w| unsafe { w.bits(0) }); // PB, floating fn swd_enable() {
#[allow(non_snake_case)]
let AFIO = unsafe { &*stm32f103xx::AFIO::ptr() };
// 31.4.2, table 220
AFIO.mapr.modify(|_, w| unsafe { w.swj_cfg().bits(0b000) }); // all debugging
} }
// the program entry point is ... // the program entry point is ...
...@@ -245,14 +259,14 @@ interrupt!(EXTI1, exti1); ...@@ -245,14 +259,14 @@ interrupt!(EXTI1, exti1);
// the exti1 interrupt implementation // the exti1 interrupt implementation
fn exti1() { fn exti1() {
// dbg_enable(); swd_enable();
led(10); led(10);
asm::bkpt(); asm::bkpt();
// led(10); swd_disable();
// clear pending state // clear pending state
let exti = unsafe { &*stm32f103xx::EXTI::ptr() }; let exti = unsafe { &*stm32f103xx::EXTI::ptr() };
exti.pr.write(|w| w.pr1().set_bit()); exti.pr.write(|w| w.pr1().set_bit());
// dbg_disable();
} }
fn led(i: u8) { fn led(i: u8) {
...@@ -295,8 +309,8 @@ fn main() -> ! { ...@@ -295,8 +309,8 @@ fn main() -> ! {
r.AFIO.exticr1.modify(|_, w| unsafe { w.exti1().bits(0) }); r.AFIO.exticr1.modify(|_, w| unsafe { w.exti1().bits(0) });
// input by default // input by default
// r.GPIOA.crl.modify(|_, w| w.cnf1().bits(0b10)); // PA1 input pull up/down r.GPIOA.crl.modify(|_, w| w.cnf1().bits(0b10)); // PA1 input pull up/down
// r.GPIOA.odr.modify(|_, w| w.odr1().set_bit()); // PA1 input pull up r.GPIOA.odr.modify(|_, w| w.odr1().set_bit()); // PA1 input pull up
r.EXTI.ftsr.modify(|_, w| w.tr1().set_bit()); // EXTI1 trigger on falling, enable tr1 r.EXTI.ftsr.modify(|_, w| w.tr1().set_bit()); // EXTI1 trigger on falling, enable tr1
r.EXTI.imr.modify(|_, w| w.mr1().set_bit()); // EXTI1 interrupt mask register, enable mr1 r.EXTI.imr.modify(|_, w| w.mr1().set_bit()); // EXTI1 interrupt mask register, enable mr1
...@@ -305,7 +319,7 @@ fn main() -> ! { ...@@ -305,7 +319,7 @@ fn main() -> ! {
// test raising a software interrupt // test raising a software interrupt
// r.EXTI.swier.write(|w| w.swier1().set_bit()); // trigger sw interrupt // r.EXTI.swier.write(|w| w.swier1().set_bit()); // trigger sw interrupt
let pr = r.EXTI.pr.read().bits(); let _pr = r.EXTI.pr.read().bits();
// r.EXTI.pr.write(|w| unsafe { w.bits(0xFFFF_FFFF) }); // clear all pending interrups/events, a bit ugly // r.EXTI.pr.write(|w| unsafe { w.bits(0xFFFF_FFFF) }); // clear all pending interrups/events, a bit ugly
...@@ -322,14 +336,14 @@ fn main() -> ! { ...@@ -322,14 +336,14 @@ fn main() -> ! {
// regulator in run mode (on) // regulator in run mode (on)
// r.PWR.cr.modify(|_, w| w.pdds().clear_bit()); // r.PWR.cr.modify(|_, w| w.pdds().clear_bit());
let pwr = r.PWR.cr.read().bits(); let _pwr = r.PWR.cr.read().bits();
asm::nop(); asm::nop();
dbg_disable(); gpio_low_power();
r.EXTI.pr.write(|w| w.pr1().set_bit()); r.EXTI.pr.write(|w| w.pr1().set_bit());
swd_disable();
loop { loop {
asm::wfi(); asm::wfi();
//led(10);
} }
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment