Skip to content

Commit 199989e

Browse files
committed
adc refactoring
1 parent 82bc718 commit 199989e

File tree

2 files changed

+53
-49
lines changed

2 files changed

+53
-49
lines changed

examples/adc_ext_trig_double_dma_serial.rs

Lines changed: 19 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ extern crate panic_halt;
1515
extern crate stm32g0;
1616
extern crate stm32g0xx_hal as hal;
1717

18+
use hal::analog::adc;
1819
use hal::prelude::*;
1920
use hal::serial::*;
2021
use hal::stm32;
@@ -62,24 +63,22 @@ unsafe fn DMA_CHANNEL1() {
6263
// Address is in byte, value in 2Bytes, this is why second dma buffer ist added with BUFFER_SIZE
6364
// and not BUFFER_SIZE/2
6465

65-
unsafe {
66-
let dma = &(*stm32g0::stm32g031::DMA::ptr());
67-
let htif1 = dma.isr.read().htif1().bit();
68-
let tcif1 = dma.isr.read().tcif1().bit();
69-
// set the global clear bit of DMA channel1
70-
dma.ifcr.write(|w| w.cgif1().set_bit());
71-
72-
dma_ch.ch2.disable();
73-
dma_ch.ch2.set_transfer_length(BUFFER_SIZE as u16);
74-
if htif1 == true {
75-
dma_ch.ch2.set_memory_address(tx_dma_buf_first_addr, true);
76-
dma_ch.ch2.enable();
77-
// hprintln!("DMA_CHANNEL1 half transfer compleated {:?} {:?}", htif1, tx_dma_buf_first_addr).unwrap();
78-
} else if tcif1 == true {
79-
dma_ch.ch2.set_memory_address(tx_dma_buf_second_addr, true);
80-
dma_ch.ch2.enable();
81-
// hprintln!("DMA_CHANNEL1 transfer compleated {:?} {:?}", tcif1, tx_dma_buf_second_addr).unwrap();
82-
}
66+
let dma = &(*stm32g0::stm32g031::DMA::ptr());
67+
let htif1 = dma.isr.read().htif1().bit();
68+
let tcif1 = dma.isr.read().tcif1().bit();
69+
// set the global clear bit of DMA channel1
70+
dma.ifcr.write(|w| w.cgif1().set_bit());
71+
72+
dma_ch.ch2.disable();
73+
dma_ch.ch2.set_transfer_length(BUFFER_SIZE as u16);
74+
if htif1 == true {
75+
dma_ch.ch2.set_memory_address(tx_dma_buf_first_addr, true);
76+
dma_ch.ch2.enable();
77+
// hprintln!("DMA_CHANNEL1 half transfer compleated {:?} {:?}", htif1, tx_dma_buf_first_addr).unwrap();
78+
} else if tcif1 == true {
79+
dma_ch.ch2.set_memory_address(tx_dma_buf_second_addr, true);
80+
dma_ch.ch2.enable();
81+
// hprintln!("DMA_CHANNEL1 transfer compleated {:?} {:?}", tcif1, tx_dma_buf_second_addr).unwrap();
8382
}
8483
}
8584

@@ -167,9 +166,9 @@ fn main() -> ! {
167166
let u = u_raw.saturating_sub(32) as f32 / 4_096_f32 * 3.3;
168167
hprintln!("u: {:.4} V ", u).unwrap();
169168

170-
adc.set_oversamling_ratio(3);
169+
adc.set_oversamling_ratio(adc::OversamplingRatio::X_16);
171170
adc.set_oversamling_shift(4);
172-
adc.oversamling_enable();
171+
adc.oversamling_enable(true);
173172
adc.prepare_injected(&mut pa3, InjTrigSource::TRG_2);
174173
adc.start_injected();
175174

src/analog/adc.rs

Lines changed: 34 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,19 @@ pub enum SampleTime {
4646
T_160 = 0b111,
4747
}
4848

49+
// ADC Oversampling ratio
50+
#[derive(Copy, Clone, PartialEq)]
51+
pub enum OversamplingRatio {
52+
X_2 = 0b000,
53+
X_4 = 0b001,
54+
X_8 = 0b010,
55+
X_16 = 0b011,
56+
X_32 = 0b100,
57+
X_64 = 0b101,
58+
X_128 = 0b110,
59+
X_256 = 0b111,
60+
}
61+
4962
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
5063
pub enum ClockSource {
5164
Pclk(PclkDiv),
@@ -111,6 +124,7 @@ impl Adc {
111124
}
112125
}
113126

127+
/// Sets ADC source
114128
pub fn set_clock_source(&mut self, clock_source: ClockSource) {
115129
match clock_source {
116130
ClockSource::Pclk(div) => self
@@ -176,22 +190,6 @@ impl Adc {
176190
self.precision = precision;
177191
}
178192

179-
fn power_up(&mut self) {
180-
self.rb.isr.modify(|_, w| w.adrdy().set_bit());
181-
self.rb.cr.modify(|_, w| w.aden().set_bit());
182-
while self.rb.isr.read().adrdy().bit_is_clear() {}
183-
}
184-
185-
fn power_down(&mut self) {
186-
self.rb.cr.modify(|_, w| w.addis().set_bit());
187-
self.rb.isr.modify(|_, w| w.adrdy().set_bit());
188-
while self.rb.cr.read().aden().bit_is_set() {}
189-
}
190-
191-
pub fn release(self) -> ADC {
192-
self.rb
193-
}
194-
195193
/// The nuber of bits, the oversampling result is shifted in bits at the end of oversampling
196194
pub fn set_oversamling_shift(&mut self, nrbits: u8) {
197195
self.rb
@@ -200,23 +198,14 @@ impl Adc {
200198
}
201199

202200
/// Oversampling of adc according to datasheet of stm32g0, when oversampling is enabled
203-
/// 000: 2x
204-
/// 001: 4x
205-
/// 010: 8x
206-
/// 011: 16x
207-
/// 100: 32x
208-
/// 101: 64x
209-
/// 110: 128x
210-
/// 111: 256x
211-
212-
pub fn set_oversamling_ratio(&mut self, multyply: u8) {
201+
pub fn set_oversamling_ratio(&mut self, ratio: OversamplingRatio) {
213202
self.rb
214203
.cfgr2
215-
.modify(|_, w| unsafe { w.ovsr().bits(multyply) });
204+
.modify(|_, w| unsafe { w.ovsr().bits(ratio as u8) });
216205
}
217206

218-
pub fn oversamling_enable(&mut self) {
219-
self.rb.cfgr2.modify(|_, w| w.ovse().set_bit());
207+
pub fn oversamling_enable(&mut self, enable: bool) {
208+
self.rb.cfgr2.modify(|_, w| w.ovse().bit(enable));
220209
}
221210

222211
pub fn start_injected(&mut self) {
@@ -233,6 +222,22 @@ impl Adc {
233222
// maybe self.rb.cr.adstp().set_bit() must be performed before interrupt is disabled + wait abortion
234223
self.rb.ier.modify(|_, w| w.eocie().clear_bit()); // end of sequence interupt disable
235224
}
225+
226+
pub fn release(self) -> ADC {
227+
self.rb
228+
}
229+
230+
fn power_up(&mut self) {
231+
self.rb.isr.modify(|_, w| w.adrdy().set_bit());
232+
self.rb.cr.modify(|_, w| w.aden().set_bit());
233+
while self.rb.isr.read().adrdy().bit_is_clear() {}
234+
}
235+
236+
fn power_down(&mut self) {
237+
self.rb.cr.modify(|_, w| w.addis().set_bit());
238+
self.rb.isr.modify(|_, w| w.adrdy().set_bit());
239+
while self.rb.cr.read().aden().bit_is_set() {}
240+
}
236241
}
237242

238243
pub trait AdcExt {

0 commit comments

Comments
 (0)