Skip to content

Commit 7c62437

Browse files
committed
Add button to demo
1 parent 904343d commit 7c62437

File tree

1 file changed

+33
-7
lines changed

1 file changed

+33
-7
lines changed

examples/twis-dma-demo/src/main.rs

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,22 @@ use {
99
panic::PanicInfo,
1010
sync::atomic::{compiler_fence, Ordering},
1111
},
12-
hal::{gpio::p0::Parts, pac::TWIS0, twis::*},
12+
hal::{gpio::p0::Parts, gpiote::Gpiote, pac::TWIS0, twis::*},
1313
nrf52840_hal as hal,
1414
rtt_target::{rprintln, rtt_init_print},
1515
};
1616

17+
type DmaBuffer = &'static mut [u8; 8];
18+
1719
pub enum TwisTransfer {
18-
Running(Transfer<TWIS0, &'static mut [u8; 8]>),
19-
Idle((&'static mut [u8; 8], Twis<TWIS0>)),
20+
Running(Transfer<TWIS0, DmaBuffer>),
21+
Idle((DmaBuffer, Twis<TWIS0>)),
2022
}
2123

2224
#[rtic::app(device = crate::hal::pac, peripherals = true)]
2325
const APP: () = {
2426
struct Resources {
27+
gpiote: Gpiote,
2528
transfer: Option<TwisTransfer>,
2629
}
2730

@@ -42,29 +45,52 @@ const APP: () = {
4245
.enable_interrupt(TwiEvent::Stopped)
4346
.enable();
4447

48+
let btn = p0.p0_29.into_pullup_input().degrade();
49+
let gpiote = Gpiote::new(ctx.device.GPIOTE);
50+
gpiote.port().input_pin(&btn).low();
51+
gpiote.port().enable_interrupt();
52+
4553
init::LateResources {
54+
gpiote,
4655
transfer: Some(TwisTransfer::Idle((BUF, twis))),
4756
}
4857
}
4958

59+
#[task(binds = GPIOTE, resources = [gpiote, transfer])]
60+
fn on_gpiote(ctx: on_gpiote::Context) {
61+
ctx.resources.gpiote.reset_events();
62+
rprintln!("Reset buffer");
63+
let transfer = ctx.resources.transfer;
64+
let (buf, twis) = match transfer.take().unwrap() {
65+
TwisTransfer::Running(t) => t.wait(),
66+
TwisTransfer::Idle(t) => t,
67+
};
68+
buf.copy_from_slice(&[0; 8][..]);
69+
rprintln!("{:?}", buf);
70+
transfer.replace(TwisTransfer::Idle((buf, twis)));
71+
}
72+
5073
#[task(binds = SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0, resources = [transfer])]
5174
fn on_twis(ctx: on_twis::Context) {
52-
let (buf, twis) = match ctx.resources.transfer.take().unwrap() {
75+
let transfer = ctx.resources.transfer;
76+
let (buf, twis) = match transfer.take().unwrap() {
5377
TwisTransfer::Running(t) => t.wait(),
5478
TwisTransfer::Idle(t) => t,
5579
};
5680
if twis.is_event_triggered(TwiEvent::Read) {
5781
twis.reset_event(TwiEvent::Read);
5882
rprintln!("READ command received");
59-
*ctx.resources.transfer = Some(TwisTransfer::Running(twis.tx(buf).unwrap()));
83+
let tx = twis.tx(buf).unwrap();
84+
transfer.replace(TwisTransfer::Running(tx));
6085
} else if twis.is_event_triggered(TwiEvent::Write) {
6186
twis.reset_event(TwiEvent::Write);
6287
rprintln!("WRITE command received");
63-
*ctx.resources.transfer = Some(TwisTransfer::Running(twis.rx(buf).unwrap()));
88+
let rx = twis.rx(buf).unwrap();
89+
transfer.replace(TwisTransfer::Running(rx));
6490
} else {
6591
twis.reset_event(TwiEvent::Stopped);
6692
rprintln!("{:?}", buf);
67-
*ctx.resources.transfer = Some(TwisTransfer::Idle((buf, twis)));
93+
transfer.replace(TwisTransfer::Idle((buf, twis)));
6894
}
6995
}
7096
};

0 commit comments

Comments
 (0)