1
1
#![ no_std]
2
2
#![ no_main]
3
3
4
- use cortex_m_rt :: entry ;
4
+ mod utils ;
5
5
6
6
use crate :: hal:: {
7
7
adc:: {
@@ -16,10 +16,11 @@ use crate::hal::{
16
16
} ;
17
17
use stm32g4xx_hal as hal;
18
18
19
- use log:: info;
19
+ use stm32g4xx_hal:: adc:: config;
20
+ use stm32g4xx_hal:: signature:: { VrefCal , VDDA_CALIB } ;
20
21
21
- # [ macro_use ]
22
- mod utils;
22
+ use cortex_m_rt :: entry ;
23
+ use utils:: logger :: info ;
23
24
24
25
#[ entry]
25
26
fn main ( ) -> ! {
@@ -51,13 +52,15 @@ fn main() -> ! {
51
52
. claim ( ClockSource :: SystemClock , & rcc, & mut delay, true ) ;
52
53
53
54
adc. enable_temperature ( & dp. ADC12_COMMON ) ;
55
+ adc. enable_vref ( & dp. ADC12_COMMON ) ;
54
56
adc. set_continuous ( Continuous :: Continuous ) ;
55
57
adc. reset_sequence ( ) ;
56
58
adc. configure_channel ( & pa0, Sequence :: One , SampleTime :: Cycles_640_5 ) ;
57
59
adc. configure_channel ( & Temperature , Sequence :: Two , SampleTime :: Cycles_640_5 ) ;
60
+ adc. configure_channel ( & Vref , Sequence :: Three , SampleTime :: Cycles_640_5 ) ;
58
61
59
62
info ! ( "Setup DMA" ) ;
60
- let first_buffer = cortex_m:: singleton!( : [ u16 ; 10 ] = [ 0 ; 10 ] ) . unwrap ( ) ;
63
+ let first_buffer = cortex_m:: singleton!( : [ u16 ; 15 ] = [ 0 ; 15 ] ) . unwrap ( ) ;
61
64
let mut transfer = streams. 0 . into_circ_peripheral_to_memory_transfer (
62
65
adc. enable_dma ( AdcDma :: Continuous ) ,
63
66
& mut first_buffer[ ..] ,
@@ -67,7 +70,7 @@ fn main() -> ! {
67
70
transfer. start ( |adc| adc. start_conversion ( ) ) ;
68
71
69
72
loop {
70
- let mut b = [ 0_u16 ; 4 ] ;
73
+ let mut b = [ 0_u16 ; 6 ] ;
71
74
let r = transfer. read_exact ( & mut b) ;
72
75
assert ! (
73
76
!transfer. get_overrun_flag( ) ,
@@ -77,9 +80,18 @@ fn main() -> ! {
77
80
info ! ( "read: {}" , r) ;
78
81
assert ! ( r == b. len( ) ) ;
79
82
80
- let millivolts = Vref :: sample_to_millivolts ( ( b[ 0 ] + b[ 2 ] ) / 2 ) ;
81
- info ! ( "pa3: {}mV" , millivolts) ;
82
- let temp = Temperature :: temperature_to_degrees_centigrade ( ( b[ 1 ] + b[ 3 ] ) / 2 ) ;
83
- info ! ( "temp: {}℃C" , temp) ; // Note: Temperature seems quite low...
83
+ let vdda = VDDA_CALIB * VrefCal :: get ( ) . read ( ) as u32 / ( ( b[ 2 ] + b[ 5 ] ) / 2 ) as u32 ;
84
+
85
+ info ! ( "vdda: {}mV" , vdda) ;
86
+
87
+ let millivolts =
88
+ Vref :: sample_to_millivolts_ext ( ( b[ 0 ] + b[ 3 ] ) / 2 , vdda, config:: Resolution :: Twelve ) ;
89
+ info ! ( "pa0: {}mV" , millivolts) ;
90
+ let vref =
91
+ Vref :: sample_to_millivolts_ext ( ( b[ 2 ] + b[ 5 ] ) / 2 , vdda, config:: Resolution :: Twelve ) ;
92
+ info ! ( "vref: {}mV" , vref) ;
93
+ let raw_temp = ( ( ( b[ 1 ] + b[ 4 ] ) / 2 ) as f32 * ( vdda as f32 / 3000.0 ) ) as u16 ;
94
+ let temp = Temperature :: temperature_to_degrees_centigrade ( raw_temp) ;
95
+ info ! ( "temp: {}°C" , temp) ;
84
96
}
85
97
}
0 commit comments