@@ -129,6 +129,7 @@ impl ADC {
129
129
ahb : & mut AHB2 ,
130
130
ccipr : & mut CCIPR ,
131
131
delay : & mut impl DelayUs < u32 > ,
132
+ external_trigger : config:: ExternalTriggerConfig ,
132
133
) -> Self {
133
134
// Enable peripheral
134
135
ADC1 :: enable ( ahb) ;
@@ -183,6 +184,8 @@ impl ADC {
183
184
184
185
s. calibrate ( & mut vref) ;
185
186
187
+ s. set_external_trigger ( external_trigger) ;
188
+
186
189
s. common . ccr . modify ( |_, w| w. vrefen ( ) . clear_bit ( ) ) ;
187
190
s
188
191
}
@@ -389,6 +392,13 @@ impl ADC {
389
392
self . adc . cr . modify ( |_, w| w. adstart ( ) . set_bit ( ) ) ;
390
393
}
391
394
395
+ pub fn start_cont_conversion ( & mut self ) {
396
+ self . enable ( ) ;
397
+ self . enable_continous ( ) ;
398
+ self . clear_end_flags ( ) ;
399
+ self . adc . cr . modify ( |_, w| w. adstart ( ) . set_bit ( ) ) ;
400
+ }
401
+
392
402
pub fn is_converting ( & self ) -> bool {
393
403
self . adc . cr . read ( ) . adstart ( ) . bit_is_set ( )
394
404
}
@@ -426,13 +436,31 @@ impl ADC {
426
436
}
427
437
}
428
438
439
+ pub fn enable_continous ( & mut self ) {
440
+ self . adc . cfgr . modify ( |_, w| w. cont ( ) . set_bit ( ) ) ;
441
+ }
442
+
443
+ pub fn disable_continous ( & mut self ) {
444
+ self . adc . cfgr . modify ( |_, w| w. cont ( ) . clear_bit ( ) ) ;
445
+ }
446
+
429
447
pub fn is_enabled ( & self ) -> bool {
430
448
self . adc . cr . read ( ) . aden ( ) . bit_is_set ( )
431
449
}
432
450
433
451
pub fn disable ( & mut self ) {
434
452
self . adc . cr . modify ( |_, w| w. addis ( ) . set_bit ( ) ) ;
435
453
}
454
+
455
+ /// Sets which external trigger to use and if it is disabled, rising, falling or both
456
+ pub fn set_external_trigger ( & mut self , ext_trg_conf : config:: ExternalTriggerConfig ) {
457
+ self . adc . cfgr . modify ( |_, w| unsafe {
458
+ w. exten ( )
459
+ . bits ( ext_trg_conf. 0 . into ( ) )
460
+ . extsel ( )
461
+ . bits ( ext_trg_conf. 1 . into ( ) )
462
+ } ) ;
463
+ }
436
464
}
437
465
438
466
impl < C > OneShot < ADC , u16 , C > for ADC
@@ -491,9 +519,17 @@ where
491
519
buffer : BUFFER ,
492
520
dma_mode : DmaMode ,
493
521
transfer_complete_interrupt : bool ,
522
+ continuous_conversion : bool ,
494
523
) -> Self {
495
524
let ( adc, channel) = dma. split ( ) ;
496
- Transfer :: from_adc ( adc, channel, buffer, dma_mode, transfer_complete_interrupt)
525
+ Transfer :: from_adc (
526
+ adc,
527
+ channel,
528
+ buffer,
529
+ dma_mode,
530
+ transfer_complete_interrupt,
531
+ continuous_conversion,
532
+ )
497
533
}
498
534
499
535
/// Initiate a new DMA transfer from an ADC.
@@ -508,6 +544,7 @@ where
508
544
buffer : BUFFER ,
509
545
dma_mode : DmaMode ,
510
546
transfer_complete_interrupt : bool ,
547
+ continuous_conversion : bool ,
511
548
) -> Self {
512
549
assert ! ( dma_mode != DmaMode :: Disabled ) ;
513
550
@@ -555,7 +592,11 @@ where
555
592
atomic:: compiler_fence ( Ordering :: Release ) ;
556
593
557
594
channel. start ( ) ;
558
- adc. start_conversion ( ) ;
595
+ if continuous_conversion == false {
596
+ adc. start_conversion ( ) ;
597
+ } else {
598
+ adc. start_cont_conversion ( ) ;
599
+ }
559
600
560
601
Transfer :: w (
561
602
buffer,
@@ -643,6 +684,87 @@ pub trait Channel: EmbeddedHalChannel<ADC, ID = u8> {
643
684
fn set_sample_time ( & mut self , adc : & ADC1 , sample_time : SampleTime ) ;
644
685
}
645
686
687
+ /// Contains types related to ADC configuration
688
+ pub mod config {
689
+ /// Possible external triggers the ADC can listen to
690
+ #[ derive( Debug , Clone , Copy ) ]
691
+ pub enum ExternalTrigger {
692
+ /// TIM1 compare channel 1
693
+ Tim_1_cc_1 ,
694
+ /// TIM1 compare channel 2
695
+ Tim_1_cc_2 ,
696
+ /// TIM1 compare channel 3
697
+ Tim_1_cc_3 ,
698
+ /// TIM2 compare channel 2
699
+ Tim_2_cc_2 ,
700
+ /// TIM3 trigger out
701
+ Tim_3_trgo ,
702
+ /// External interupt line 11
703
+ Exti_11 ,
704
+ /// TIM1 trigger out
705
+ Tim_1_trgo ,
706
+ /// TIM1 trigger out 2
707
+ Tim_1_trgo2 ,
708
+ /// TIM2 trigger out
709
+ Tim_2_trgo ,
710
+ /// TIM6 trigger out
711
+ Tim_6_trgo ,
712
+ /// TIM15 trigger out
713
+ Tim_15_trgo ,
714
+ }
715
+
716
+ impl From < ExternalTrigger > for u8 {
717
+ fn from ( et : ExternalTrigger ) -> u8 {
718
+ match et {
719
+ ExternalTrigger :: Tim_1_cc_1 => 0b0000 , // EXT0
720
+ ExternalTrigger :: Tim_1_cc_2 => 0b0001 , // EXT1
721
+ ExternalTrigger :: Tim_1_cc_3 => 0b0010 , // EXT2
722
+ ExternalTrigger :: Tim_2_cc_2 => 0b0011 , // EXT3
723
+ ExternalTrigger :: Tim_3_trgo => 0b0100 , // EXT4
724
+ ExternalTrigger :: Exti_11 => 0b0110 , // EXT6
725
+ ExternalTrigger :: Tim_1_trgo => 0b1001 , // EXT9
726
+ ExternalTrigger :: Tim_1_trgo2 => 0b1010 , // EXT10
727
+ ExternalTrigger :: Tim_2_trgo => 0b1011 , // EXT11
728
+ ExternalTrigger :: Tim_6_trgo => 0b1101 , // EXT13
729
+ ExternalTrigger :: Tim_15_trgo => 0b1110 , // EXT14
730
+ }
731
+ }
732
+ }
733
+
734
+ /// Possible trigger modes
735
+ #[ derive( Debug , Clone , Copy ) ]
736
+ pub enum TriggerMode {
737
+ /// Don't listen to external trigger
738
+ Disabled ,
739
+ /// Listen for rising edges of external trigger
740
+ RisingEdge ,
741
+ /// Listen for falling edges of external trigger
742
+ FallingEdge ,
743
+ /// Listen for both rising and falling edges of external trigger
744
+ BothEdges ,
745
+ }
746
+
747
+ impl From < TriggerMode > for u8 {
748
+ fn from ( tm : TriggerMode ) -> u8 {
749
+ match tm {
750
+ TriggerMode :: Disabled => 0b00 ,
751
+ TriggerMode :: RisingEdge => 0b01 ,
752
+ TriggerMode :: FallingEdge => 0b10 ,
753
+ TriggerMode :: BothEdges => 0b11 ,
754
+ }
755
+ }
756
+ }
757
+
758
+ #[ derive( Debug ) ]
759
+ pub struct ExternalTriggerConfig ( pub TriggerMode , pub ExternalTrigger ) ;
760
+
761
+ impl Default for ExternalTriggerConfig {
762
+ fn default ( ) -> Self {
763
+ Self ( TriggerMode :: Disabled , ExternalTrigger :: Tim_1_cc_1 )
764
+ }
765
+ }
766
+ }
767
+
646
768
macro_rules! adc_pins {
647
769
(
648
770
$(
0 commit comments