@@ -129,6 +129,7 @@ impl ADC {
129129 ahb : & mut AHB2 ,
130130 ccipr : & mut CCIPR ,
131131 delay : & mut impl DelayUs < u32 > ,
132+ external_trigger : config:: ExternalTriggerConfig ,
132133 ) -> Self {
133134 // Enable peripheral
134135 ADC1 :: enable ( ahb) ;
@@ -183,6 +184,8 @@ impl ADC {
183184
184185 s. calibrate ( & mut vref) ;
185186
187+ s. set_external_trigger ( external_trigger) ;
188+
186189 s. common . ccr . modify ( |_, w| w. vrefen ( ) . clear_bit ( ) ) ;
187190 s
188191 }
@@ -389,6 +392,13 @@ impl ADC {
389392 self . adc . cr . modify ( |_, w| w. adstart ( ) . set_bit ( ) ) ;
390393 }
391394
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+
392402 pub fn is_converting ( & self ) -> bool {
393403 self . adc . cr . read ( ) . adstart ( ) . bit_is_set ( )
394404 }
@@ -426,13 +436,31 @@ impl ADC {
426436 }
427437 }
428438
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+
429447 pub fn is_enabled ( & self ) -> bool {
430448 self . adc . cr . read ( ) . aden ( ) . bit_is_set ( )
431449 }
432450
433451 pub fn disable ( & mut self ) {
434452 self . adc . cr . modify ( |_, w| w. addis ( ) . set_bit ( ) ) ;
435453 }
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+ }
436464}
437465
438466impl < C > OneShot < ADC , u16 , C > for ADC
@@ -491,9 +519,17 @@ where
491519 buffer : BUFFER ,
492520 dma_mode : DmaMode ,
493521 transfer_complete_interrupt : bool ,
522+ continuous_conversion : bool ,
494523 ) -> Self {
495524 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+ )
497533 }
498534
499535 /// Initiate a new DMA transfer from an ADC.
@@ -508,6 +544,7 @@ where
508544 buffer : BUFFER ,
509545 dma_mode : DmaMode ,
510546 transfer_complete_interrupt : bool ,
547+ continuous_conversion : bool ,
511548 ) -> Self {
512549 assert ! ( dma_mode != DmaMode :: Disabled ) ;
513550
@@ -555,7 +592,11 @@ where
555592 atomic:: compiler_fence ( Ordering :: Release ) ;
556593
557594 channel. start ( ) ;
558- adc. start_conversion ( ) ;
595+ if continuous_conversion == false {
596+ adc. start_conversion ( ) ;
597+ } else {
598+ adc. start_cont_conversion ( ) ;
599+ }
559600
560601 Transfer :: w (
561602 buffer,
@@ -643,6 +684,87 @@ pub trait Channel: EmbeddedHalChannel<ADC, ID = u8> {
643684 fn set_sample_time ( & mut self , adc : & ADC1 , sample_time : SampleTime ) ;
644685}
645686
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+
646768macro_rules! adc_pins {
647769 (
648770 $(
0 commit comments