55#![ allow( unused_mut) ]
66
77use core:: { mem:: MaybeUninit , panic:: PanicInfo } ;
8- use stm32f1_hal:: gpio:: ExtiPin ;
9- use stm32f1_hal:: { self as hal, Steal } ;
108use stm32f1_hal:: {
11- Heap , Mcu ,
9+ self as hal , Heap , Mcu , Steal ,
1210 afio:: { NONE_PIN , RemapDefault } ,
1311 cortex_m:: asm,
1412 cortex_m_rt:: entry,
13+ dma:: { DmaBindRx , DmaBindTx , DmaEvent , DmaPriority } ,
1514 embedded_hal:: { self , pwm:: SetDutyCycle } ,
1615 embedded_io,
17- gpio:: { Edge , PinState } ,
16+ gpio:: { Edge , ExtiPin , PinState } ,
1817 nvic_scb:: PriorityGrouping ,
1918 pac:: { self , Interrupt } ,
2019 prelude:: * ,
2120 rcc,
2221 timer:: * ,
23- uart:: { self , UartPeriph } ,
22+ uart:: { self , UartPeriphExt } ,
2423} ;
2524
2625mod led_task;
@@ -49,9 +48,6 @@ fn main() -> ! {
4948 let mut rcc = dp. RCC . constrain ( ) . freeze ( cfg, & mut flash. acr ) ;
5049 assert_eq ! ( rcc. clocks. sysclk( ) , sysclk) ;
5150
52- let mut gpioa = dp. GPIOA . split ( & mut rcc) ;
53- let mut gpiob = dp. GPIOB . split ( & mut rcc) ;
54-
5551 let afio = dp. AFIO . constrain ( & mut rcc) ;
5652 let mut mcu = Mcu {
5753 scb,
@@ -62,10 +58,16 @@ fn main() -> ! {
6258 } ;
6359
6460 // Keep them in one place for easier management
65- mcu. nvic . enable ( pac :: interrupt :: USART1 , false ) ; // Optional
61+ mcu. nvic . enable ( Interrupt :: USART1 , false ) ; // Optional
6662 mcu. nvic . set_priority ( Interrupt :: USART1 , 2 ) ;
67- mcu. nvic . enable ( pac :: interrupt :: EXTI1 , false ) ;
63+ mcu. nvic . enable ( Interrupt :: EXTI1 , false ) ;
6864 mcu. nvic . set_priority ( Interrupt :: EXTI1 , 1 ) ;
65+ mcu. nvic . enable ( Interrupt :: DMA1_CHANNEL4 , false ) ;
66+ mcu. nvic . set_priority ( Interrupt :: DMA1_CHANNEL4 , 2 ) ;
67+
68+ let mut gpioa = dp. GPIOA . split ( & mut mcu. rcc ) ;
69+ let mut gpiob = dp. GPIOB . split ( & mut mcu. rcc ) ;
70+ let mut dma1 = dp. DMA1 . split ( & mut mcu. rcc ) ;
6971
7072 // UART -------------------------------------
7173
@@ -85,17 +87,18 @@ fn main() -> ! {
8587 } ;
8688
8789 // let mut uart_task = uart_poll_init(uart_tx, uart_rx);
88- let mut uart_task = uart_interrupt_init (
90+ // let mut uart_task = uart_interrupt_init(uart_tx, uart_rx, &all_it::USART1_CB, &mut mcu);
91+ dma1. 4 . set_priority ( DmaPriority :: Medium ) ;
92+ dma1. 5 . set_priority ( DmaPriority :: Medium ) ;
93+ let mut uart_task = uart_dma_init (
8994 uart_tx,
95+ dma1. 4 ,
96+ & all_it:: DMA1_CHANNEL4_CB ,
9097 uart_rx,
98+ dma1. 5 ,
9199 & mut mcu,
92- pac:: interrupt:: USART1 ,
93- & all_it:: USART1_CB ,
94100 ) ;
95101
96- let dma1 = dp. DMA1 . split ( & mut mcu. rcc ) ;
97- let dma_rx = dma1. 5 ;
98-
99102 // LED --------------------------------------
100103
101104 let mut led = gpiob
@@ -149,21 +152,20 @@ fn panic(_info: &PanicInfo) -> ! {
149152 loop { }
150153}
151154
152- fn uart_poll_init < U : UartPeriph > (
155+ fn uart_poll_init < U : UartPeriphExt > (
153156 tx : uart:: Tx < U > ,
154157 rx : uart:: Rx < U > ,
155158) -> UartPollTask < impl embedded_io:: Write , impl embedded_io:: Read > {
156159 let ( uart_tx, uart_rx) = ( tx. into_poll ( 0 , 10_000 ) , rx. into_poll ( 0 , 1_000 ) ) ;
157160 UartPollTask :: new ( 32 , uart_tx, uart_rx)
158161}
159162
160- fn uart_interrupt_init < U : UartPeriph + ' static > (
163+ fn uart_interrupt_init < U : UartPeriphExt + ' static > (
161164 tx : uart:: Tx < U > ,
162165 rx : uart:: Rx < U > ,
163- mcu : & mut Mcu ,
164- it_line : pac:: interrupt ,
165166 interrupt_callback : & hal:: interrupt:: Callback ,
166- ) -> UartPollTask < impl embedded_io:: Write + use < U > , impl embedded_io:: Read + use < U > > {
167+ mcu : & mut Mcu ,
168+ ) -> UartPollTask < impl embedded_io:: Write + ' static , impl embedded_io:: Read + ' static > {
167169 let ( tx, mut tx_it) = tx. into_interrupt ( 64 , 0 , 10_000 ) ;
168170 let ( rx, mut rx_it) = rx. into_interrupt ( 64 , 0 ) ;
169171 interrupt_callback. set ( mcu, move || {
@@ -173,7 +175,28 @@ fn uart_interrupt_init<U: UartPeriph + 'static>(
173175 UartPollTask :: new ( 32 , tx, rx)
174176}
175177
178+ fn uart_dma_init < ' r , U : UartPeriphExt + ' static > (
179+ tx : uart:: Tx < U > ,
180+ mut dma_tx : impl DmaBindTx < U > + ' static ,
181+ interrupt_callback : & hal:: interrupt:: Callback ,
182+ rx : uart:: Rx < U > ,
183+ dma_rx : impl DmaBindRx < U > + ' r ,
184+ mcu : & mut Mcu ,
185+ ) -> UartPollTask < impl embedded_io:: Write + ' static , impl embedded_io:: Read + ' r > {
186+ let uart_rx = rx. into_dma_circle ( dma_rx, 64 ) ;
187+ dma_tx. set_interrupt ( DmaEvent :: TransferComplete , true ) ;
188+ let ( uart_tx, mut tx_it) = tx. into_dma_ringbuf ( dma_tx, 32 ) ;
189+ interrupt_callback. set ( mcu, move || {
190+ tx_it. interrupt_reload ( ) ;
191+ } ) ;
192+ UartPollTask :: new ( 32 , uart_tx, uart_rx)
193+ }
194+
176195mod all_it {
177196 use super :: hal:: { interrupt_handler, pac:: interrupt} ;
178- interrupt_handler ! ( ( USART1 , USART1_CB ) , ( EXTI1 , EXTI1_CB ) , ) ;
197+ interrupt_handler ! (
198+ ( USART1 , USART1_CB ) ,
199+ ( EXTI1 , EXTI1_CB ) ,
200+ ( DMA1_CHANNEL4 , DMA1_CHANNEL4_CB ) ,
201+ ) ;
179202}
0 commit comments