22#![ no_main]
33
44use core:: cell:: RefCell ;
5-
65use cortex_m:: interrupt:: { self , Mutex } ;
7- use PY32f030xx_pac :: { adc, ADC } ;
8-
9- use defmt:: info;
106use hal:: adc:: { AdcChannel , AnyAdc , ChannelConfig , Config , SampleCycles , TrigleSignal } ;
117use heapless:: spsc:: Queue ;
128
@@ -20,6 +16,10 @@ use {defmt_rtt as _, panic_probe as _};
2016static ADC_INSTANCE : Mutex < RefCell < Option < AnyAdc < hal:: mcu:: peripherals:: ADC , Blocking > > > > =
2117 Mutex :: new ( RefCell :: new ( None ) ) ;
2218
19+ type AdcQueue = Queue < u16 , 128 > ;
20+
21+ static ADC_QUEUE : Mutex < RefCell < AdcQueue > > = Mutex :: new ( RefCell :: new ( AdcQueue :: new ( ) ) ) ;
22+
2323#[ cortex_m_rt:: entry]
2424fn main ( ) -> ! {
2525 let p = hal:: init ( Default :: default ( ) ) ;
@@ -41,26 +41,25 @@ fn main() -> ! {
4141 let _ = interrupt:: free ( |cs| {
4242 adc. event_config ( Event :: EOC , true ) ;
4343 ADC_INSTANCE . borrow ( cs) . replace ( Some ( adc) ) ;
44-
4544 let mut adc_bind = ADC_INSTANCE . borrow ( cs) . borrow_mut ( ) ;
4645 let adc = adc_bind. as_mut ( ) . unwrap ( ) ;
47- let _ = adc. id ( ) . bind ( & || {
48- interrupt:: free ( |cs| {
49- let mut adc_bind = ADC_INSTANCE . borrow ( cs) . borrow_mut ( ) ;
50- let adc = adc_bind. as_mut ( ) . unwrap ( ) ;
51- let _ = adc. read_once ( ) ;
52- } )
46+ let _ = adc. id ( ) . bind ( & |cs| {
47+ let mut adc = ADC_INSTANCE . borrow ( cs) . borrow_mut ( ) ;
48+ let mut queue = ADC_QUEUE . borrow ( cs) . borrow_mut ( ) ;
49+ let _ = queue. enqueue ( adc. as_mut ( ) . unwrap ( ) . read_once ( ) ) ;
5350 } ) ;
54- adc. id ( ) . enable ( ) ;
51+ adc. id ( ) . enable_irq ( ) ;
5552 adc. start ( ) ;
5653 } ) ;
5754
58- // 使用闭包的方式在中断中调用闭包处理函数
59- // 兼顾友好型 api
60- static mut ADC_QUEUE : Queue < u16 , 128 > = Queue :: new ( ) ;
6155 loop {
6256 cortex_m:: asm:: wfi ( ) ;
6357
64- defmt:: info!( "adc value: {}" , unsafe { ADC_QUEUE . dequeue( ) . unwrap( ) } ) ;
58+ interrupt:: free ( |cs| {
59+ let mut queue = ADC_QUEUE . borrow ( cs) . borrow_mut ( ) ;
60+ while let Some ( v) = queue. dequeue ( ) {
61+ defmt:: info!( "adc value: {}" , v) ;
62+ }
63+ } )
6564 }
6665}
0 commit comments