@@ -15,12 +15,13 @@ use stm32f1_hal::{
1515 embedded_io,
1616 gpio:: { Edge , ExtiPin , PinState } ,
1717 nvic_scb:: PriorityGrouping ,
18- os:: { RetryTimes , Timeout } ,
1918 pac:: { self , Interrupt } ,
2019 prelude:: * ,
2120 rcc,
22- timer:: { syst:: SysTickTimeout , * } ,
21+ time:: MonoTimer ,
22+ timer:: * ,
2323 uart:: { self , UartPeriphExt } ,
24+ waiter_trait:: { self , Counter , NonInterval , Waiter } ,
2425} ;
2526
2627mod led_task;
@@ -58,6 +59,10 @@ fn main() -> ! {
5859 exti : dp. EXTI ,
5960 } ;
6061
62+ let mut sys_timer = cp. SYST . counter_hz ( & mcu) ;
63+ sys_timer. start ( 20 . Hz ( ) ) . unwrap ( ) ;
64+ let mono_timer = MonoTimer :: new ( cp. DWT , cp. DCB , & mcu. rcc . clocks ) ;
65+
6166 // Keep them in one place for easier management
6267 mcu. nvic . enable ( Interrupt :: USART1 , false ) ; // Optional
6368 mcu. nvic . set_priority ( Interrupt :: USART1 , 2 ) ;
@@ -88,7 +93,8 @@ fn main() -> ! {
8893 } ;
8994
9095 // let mut uart_task = uart_poll_init(uart_tx, uart_rx);
91- // let mut uart_task = uart_interrupt_init(uart_tx, uart_rx, &all_it::USART1_CB, &mut mcu);
96+ // let mut uart_task =
97+ // uart_interrupt_init(uart_tx, uart_rx, &all_it::USART1_CB, &mut mcu, &sys_timer);
9298 dma1. 4 . set_priority ( DmaPriority :: Medium ) ;
9399 dma1. 5 . set_priority ( DmaPriority :: Medium ) ;
94100 let mut uart_task = uart_dma_init (
@@ -98,16 +104,17 @@ fn main() -> ! {
98104 uart_rx,
99105 dma1. 5 ,
100106 & mut mcu,
107+ & sys_timer,
101108 ) ;
102109
103110 // LED --------------------------------------
104111
105112 let mut led = gpiob
106113 . pb0
107114 . into_open_drain_output_with_state ( & mut gpiob. crl , PinState :: High ) ;
108- cp . SYST . counter_hz ( & mcu ) . start ( 1000 . Hz ( ) ) . unwrap ( ) ;
109- let mut timeout = SysTickTimeout :: new ( 1000_000 ) ;
110- let mut led_task = LedTask :: new ( led, timeout . start ( ) ) ;
115+ let mut water = sys_timer . waiter_us ( 1 . secs ( ) , NonInterval :: default ( ) ) ;
116+ // let water = mono_timer.waiter(1.secs() );
117+ let mut led_task = LedTask :: new ( led, water . start ( ) ) ;
111118
112119 // PWM --------------------------------------
113120
@@ -154,8 +161,8 @@ fn uart_poll_init<U: UartPeriphExt>(
154161 tx : uart:: Tx < U > ,
155162 rx : uart:: Rx < U > ,
156163) -> UartPollTask < impl embedded_io:: Write , impl embedded_io:: Read > {
157- let uart_rx = rx. into_poll ( RetryTimes :: new ( 0 ) , RetryTimes :: new ( 1_000 ) ) ;
158- let uart_tx = tx. into_poll ( RetryTimes :: new ( 0 ) , RetryTimes :: new ( 10_000 ) ) ;
164+ let uart_rx = rx. into_poll ( Counter :: new ( 0 ) , Counter :: new ( 1_000 ) ) ;
165+ let uart_tx = tx. into_poll ( Counter :: new ( 0 ) , Counter :: new ( 10_000 ) ) ;
159166 UartPollTask :: new ( 32 , uart_tx, uart_rx)
160167}
161168
@@ -164,10 +171,15 @@ fn uart_interrupt_init<U: UartPeriphExt + 'static>(
164171 rx : uart:: Rx < U > ,
165172 interrupt_callback : & hal:: interrupt:: Callback ,
166173 mcu : & mut Mcu ,
174+ timer : & SystemTimer ,
167175) -> UartPollTask < impl embedded_io:: Write + ' static , impl embedded_io:: Read + ' static > {
168- let ( rx, mut rx_it) = rx. into_interrupt ( 64 , SysTickTimeout :: new ( 100 ) ) ;
169- let ( tx, mut tx_it) =
170- tx. into_interrupt ( 32 , SysTickTimeout :: new ( 0 ) , SysTickTimeout :: new ( 32 * 200 ) ) ;
176+ let ( rx, mut rx_it) =
177+ rx. into_interrupt ( 64 , timer. waiter_us ( 100 . micros ( ) , NonInterval :: default ( ) ) ) ;
178+ let ( tx, mut tx_it) = tx. into_interrupt (
179+ 32 ,
180+ timer. waiter_us ( 0 . micros ( ) , NonInterval :: default ( ) ) ,
181+ timer. waiter_us ( 32 * 200 . micros ( ) , NonInterval :: default ( ) ) ,
182+ ) ;
171183 interrupt_callback. set ( mcu, move || {
172184 rx_it. handler ( ) ;
173185 tx_it. handler ( ) ;
@@ -182,14 +194,19 @@ fn uart_dma_init<'r, U: UartPeriphExt + 'static>(
182194 rx : uart:: Rx < U > ,
183195 dma_rx : impl DmaBindRx < U > + ' r ,
184196 mcu : & mut Mcu ,
197+ timer : & SystemTimer ,
185198) -> UartPollTask < impl embedded_io:: Write + ' static , impl embedded_io:: Read + ' r > {
186- let uart_rx = rx. into_dma_circle ( dma_rx, 64 , SysTickTimeout :: new ( 100 ) ) ;
199+ let uart_rx = rx. into_dma_circle (
200+ dma_rx,
201+ 64 ,
202+ timer. waiter_us ( 100 . micros ( ) , NonInterval :: default ( ) ) ,
203+ ) ;
187204 dma_tx. set_interrupt ( DmaEvent :: TransferComplete , true ) ;
188205 let ( uart_tx, mut tx_it) = tx. into_dma_ringbuf (
189206 dma_tx,
190207 32 ,
191- SysTickTimeout :: new ( 0 ) ,
192- SysTickTimeout :: new ( 32 * 200 ) ,
208+ timer . waiter_us ( 0 . micros ( ) , NonInterval :: default ( ) ) ,
209+ timer . waiter_us ( 32 * 200 . micros ( ) , NonInterval :: default ( ) ) ,
193210 ) ;
194211 interrupt_callback. set ( mcu, move || {
195212 tx_it. interrupt_reload ( ) ;
0 commit comments