44use defmt:: * ;
55use embassy_executor:: Spawner ;
66use embassy_stm32:: sdmmc:: Sdmmc ;
7- use embassy_stm32:: sdmmc:: sd:: { CmdBlock , DataBlock , StorageDevice } ;
7+ use embassy_stm32:: sdmmc:: sd:: { Card , CmdBlock , DataBlock , StorageDevice } ;
88use embassy_stm32:: time:: { Hertz , mhz} ;
99use embassy_stm32:: { Config , bind_interrupts, dma, peripherals, sdmmc} ;
10+ use embassy_sync:: blocking_mutex:: raw:: NoopRawMutex ;
11+ use embassy_sync:: channel:: Channel ;
12+ use embassy_time:: { Duration , Timer } ;
1013use { defmt_rtt as _, panic_probe as _} ;
1114
1215/// This is a safeguard to not overwrite any data on the SD card.
@@ -18,6 +21,42 @@ bind_interrupts!(struct Irqs {
1821 DMA2_STREAM3 => dma:: InterruptHandler <peripherals:: DMA2_CH3 >;
1922} ) ;
2023
24+ pub enum StorageRequest {
25+ WriteRequest ( u32 , & ' static DataBlock ) ,
26+ ReadRequest ,
27+ }
28+
29+ pub async fn run_storage < ' a > ( mut sdmmc : Sdmmc < ' a > , channel : & ' static Channel < NoopRawMutex , StorageRequest , 3 > ) {
30+ loop {
31+ let storage = loop {
32+ if let Ok ( storage) = StorageDevice :: new_sd_card ( & mut sdmmc, & mut CmdBlock :: new ( ) , mhz ( 24 ) ) . await {
33+ break storage;
34+ }
35+
36+ // Wait 1/2 second to avoid saturating the core
37+ Timer :: after ( Duration :: from_millis ( 500 ) ) . await ;
38+ } ;
39+
40+ let _ = run_storage_inner ( storage, channel) . await ;
41+ }
42+ }
43+
44+ pub async fn run_storage_inner < ' a , ' b > (
45+ mut storage : StorageDevice < ' a , ' b , Card > ,
46+ channel : & ' static Channel < NoopRawMutex , StorageRequest , 3 > ,
47+ ) -> Result < ( ) , ( ) > {
48+ // Or, instead of receiving from a channel, you can read/write files here
49+
50+ loop {
51+ match channel. receive ( ) . await {
52+ StorageRequest :: WriteRequest ( block_idx, buffer) => {
53+ storage. write_block ( block_idx, buffer) . await . map_err ( |_| ( ) ) ?;
54+ }
55+ StorageRequest :: ReadRequest => { }
56+ }
57+ }
58+ }
59+
2160#[ embassy_executor:: main]
2261async fn main ( _spawner : Spawner ) {
2362 let mut config = Config :: default ( ) ;
@@ -58,9 +97,11 @@ async fn main(_spawner: Spawner) {
5897
5998 let mut cmd_block = CmdBlock :: new ( ) ;
6099
61- let mut storage = StorageDevice :: new_sd_card ( & mut sdmmc, & mut cmd_block, mhz ( 24 ) )
62- . await
63- . unwrap ( ) ;
100+ let mut storage = loop {
101+ if let Ok ( storage) = StorageDevice :: new_sd_card ( & mut sdmmc, & mut cmd_block, mhz ( 24 ) ) . await {
102+ break storage;
103+ }
104+ } ;
64105
65106 let card = storage. card ( ) ;
66107
0 commit comments