23
23
#include "PeripheralPins.h"
24
24
#include "nu_modutil.h"
25
25
26
- struct nu_adc_var {
27
- uint32_t en_msk ;
28
- };
29
-
30
- static struct nu_adc_var adc0_var = {
31
- .en_msk = 0
32
- };
33
- static struct nu_adc_var adc1_var = {
34
- .en_msk = 0
35
- };
36
- static struct nu_adc_var adc2_var = {
37
- .en_msk = 0
38
- };
39
- static struct nu_adc_var adc3_var = {
40
- .en_msk = 0
41
- };
42
- static struct nu_adc_var adc4_var = {
43
- .en_msk = 0
44
- };
45
- static struct nu_adc_var adc5_var = {
46
- .en_msk = 0
47
- };
48
- static struct nu_adc_var adc6_var = {
49
- .en_msk = 0
50
- };
51
- static struct nu_adc_var adc7_var = {
52
- .en_msk = 0
53
- };
54
- static struct nu_adc_var adc8_var = {
55
- .en_msk = 0
56
- };
57
- static struct nu_adc_var adc9_var = {
58
- .en_msk = 0
59
- };
60
- static struct nu_adc_var adc10_var = {
61
- .en_msk = 0
62
- };
63
- static struct nu_adc_var adc11_var = {
64
- .en_msk = 0
65
- };
26
+ static uint32_t adc_modinit_mask = 0 ;
66
27
67
28
static const struct nu_modinit_s adc_modinit_tab [] = {
68
- {ADC_0_0 , ADC_MODULE , CLK_CLKSEL1_ADCSEL_HIRC , CLK_CLKDIV0_ADC (1 ), ADC_RST , ADC_IRQn , & adc0_var },
69
- {ADC_0_1 , ADC_MODULE , CLK_CLKSEL1_ADCSEL_HIRC , CLK_CLKDIV0_ADC (1 ), ADC_RST , ADC_IRQn , & adc1_var },
70
- {ADC_0_2 , ADC_MODULE , CLK_CLKSEL1_ADCSEL_HIRC , CLK_CLKDIV0_ADC (1 ), ADC_RST , ADC_IRQn , & adc2_var },
71
- {ADC_0_3 , ADC_MODULE , CLK_CLKSEL1_ADCSEL_HIRC , CLK_CLKDIV0_ADC (1 ), ADC_RST , ADC_IRQn , & adc3_var },
72
- {ADC_0_4 , ADC_MODULE , CLK_CLKSEL1_ADCSEL_HIRC , CLK_CLKDIV0_ADC (1 ), ADC_RST , ADC_IRQn , & adc4_var },
73
- {ADC_0_5 , ADC_MODULE , CLK_CLKSEL1_ADCSEL_HIRC , CLK_CLKDIV0_ADC (1 ), ADC_RST , ADC_IRQn , & adc5_var },
74
- {ADC_0_6 , ADC_MODULE , CLK_CLKSEL1_ADCSEL_HIRC , CLK_CLKDIV0_ADC (1 ), ADC_RST , ADC_IRQn , & adc6_var },
75
- {ADC_0_7 , ADC_MODULE , CLK_CLKSEL1_ADCSEL_HIRC , CLK_CLKDIV0_ADC (1 ), ADC_RST , ADC_IRQn , & adc7_var },
76
- {ADC_0_8 , ADC_MODULE , CLK_CLKSEL1_ADCSEL_HIRC , CLK_CLKDIV0_ADC (1 ), ADC_RST , ADC_IRQn , & adc8_var },
77
- {ADC_0_9 , ADC_MODULE , CLK_CLKSEL1_ADCSEL_HIRC , CLK_CLKDIV0_ADC (1 ), ADC_RST , ADC_IRQn , & adc9_var },
78
- {ADC_0_10 , ADC_MODULE , CLK_CLKSEL1_ADCSEL_HIRC , CLK_CLKDIV0_ADC (1 ), ADC_RST , ADC_IRQn , & adc10_var },
79
- {ADC_0_11 , ADC_MODULE , CLK_CLKSEL1_ADCSEL_HIRC , CLK_CLKDIV0_ADC (1 ), ADC_RST , ADC_IRQn , & adc11_var }
29
+ {ADC_0_0 , EADC_MODULE , CLK_CLKSEL1_ADCSEL_PLL , CLK_CLKDIV0_ADC (5 ), ADC_RST , EADC0_IRQn , NULL },
30
+ {ADC_0_1 , EADC_MODULE , CLK_CLKSEL1_ADCSEL_PLL , CLK_CLKDIV0_ADC (5 ), ADC_RST , EADC0_IRQn , NULL },
31
+ {ADC_0_2 , EADC_MODULE , CLK_CLKSEL1_ADCSEL_PLL , CLK_CLKDIV0_ADC (5 ), ADC_RST , EADC0_IRQn , NULL },
32
+ {ADC_0_3 , EADC_MODULE , CLK_CLKSEL1_ADCSEL_PLL , CLK_CLKDIV0_ADC (5 ), ADC_RST , EADC0_IRQn , NULL },
33
+ {ADC_0_4 , EADC_MODULE , CLK_CLKSEL1_ADCSEL_PLL , CLK_CLKDIV0_ADC (5 ), ADC_RST , EADC0_IRQn , NULL },
34
+ {ADC_0_5 , EADC_MODULE , CLK_CLKSEL1_ADCSEL_PLL , CLK_CLKDIV0_ADC (5 ), ADC_RST , EADC0_IRQn , NULL },
35
+ {ADC_0_6 , EADC_MODULE , CLK_CLKSEL1_ADCSEL_PLL , CLK_CLKDIV0_ADC (5 ), ADC_RST , EADC0_IRQn , NULL },
36
+ {ADC_0_7 , EADC_MODULE , CLK_CLKSEL1_ADCSEL_PLL , CLK_CLKDIV0_ADC (5 ), ADC_RST , EADC0_IRQn , NULL },
37
+
38
+ {ADC_1_0 , EADC_MODULE , CLK_CLKSEL1_ADCSEL_PLL , CLK_CLKDIV0_ADC (5 ), ADC_RST , EADC0_IRQn , NULL },
39
+ {ADC_1_1 , EADC_MODULE , CLK_CLKSEL1_ADCSEL_PLL , CLK_CLKDIV0_ADC (5 ), ADC_RST , EADC0_IRQn , NULL },
40
+ {ADC_1_2 , EADC_MODULE , CLK_CLKSEL1_ADCSEL_PLL , CLK_CLKDIV0_ADC (5 ), ADC_RST , EADC0_IRQn , NULL },
41
+ {ADC_1_3 , EADC_MODULE , CLK_CLKSEL1_ADCSEL_PLL , CLK_CLKDIV0_ADC (5 ), ADC_RST , EADC0_IRQn , NULL },
42
+ {ADC_1_4 , EADC_MODULE , CLK_CLKSEL1_ADCSEL_PLL , CLK_CLKDIV0_ADC (5 ), ADC_RST , EADC0_IRQn , NULL },
43
+ {ADC_1_5 , EADC_MODULE , CLK_CLKSEL1_ADCSEL_PLL , CLK_CLKDIV0_ADC (5 ), ADC_RST , EADC0_IRQn , NULL },
44
+ {ADC_1_6 , EADC_MODULE , CLK_CLKSEL1_ADCSEL_PLL , CLK_CLKDIV0_ADC (5 ), ADC_RST , EADC0_IRQn , NULL },
45
+ {ADC_1_7 , EADC_MODULE , CLK_CLKSEL1_ADCSEL_PLL , CLK_CLKDIV0_ADC (5 ), ADC_RST , EADC0_IRQn , NULL }
80
46
};
81
47
82
48
void analogin_init (analogin_t * obj , PinName pin )
@@ -88,8 +54,10 @@ void analogin_init(analogin_t *obj, PinName pin)
88
54
MBED_ASSERT (modinit != NULL );
89
55
MBED_ASSERT (modinit -> modname == obj -> adc );
90
56
57
+ EADC_T * eadc_base = (EADC_T * ) NU_MODBASE (obj -> adc );
58
+
91
59
// NOTE: All channels (identified by ADCName) share a ADC module. This reset will also affect other channels of the same ADC module.
92
- if (! (( struct nu_adc_var * ) modinit -> var ) -> en_msk ) {
60
+ if (! adc_modinit_mask ) {
93
61
// Reset this module if no channel enabled
94
62
SYS_ResetModule (modinit -> rsetidx );
95
63
@@ -98,33 +66,29 @@ void analogin_init(analogin_t *obj, PinName pin)
98
66
// Enable clock of paired channels
99
67
CLK_EnableModuleClock (modinit -> clkidx );
100
68
101
- // Power on ADC
102
- ADC_POWER_ON ( ADC );
69
+ // Make EADC_module ready to convert
70
+ EADC_Open ( eadc_base , 0 );
103
71
}
104
72
105
- ADC_T * adc_base = (ADC_T * ) NU_MODBASE (obj -> adc );
106
73
uint32_t chn = NU_MODSUBINDEX (obj -> adc );
107
74
108
75
// Wire pinout
109
76
pinmap_pinout (pin , PinMap_ADC );
110
77
111
- // Enable channel 0
112
- ADC_Open (adc_base ,
113
- ADC_INPUT_MODE_SINGLE_END ,
114
- ADC_OPERATION_MODE_SINGLE ,
115
- 1 << chn ); // ADC_CH_0_MASK~ADC_CH_11_MASK
78
+ // Configure the sample module Nmod for analog input channel Nch and software trigger source
79
+ EADC_ConfigSampleModule (eadc_base , chn , EADC_SOFTWARE_TRIGGER , chn % 8 );
116
80
117
- (( struct nu_adc_var * ) modinit -> var ) -> en_msk |= 1 << chn ;
81
+ adc_modinit_mask |= 1 << chn ;
118
82
}
119
83
120
84
uint16_t analogin_read_u16 (analogin_t * obj )
121
85
{
122
- ADC_T * adc_base = (ADC_T * ) NU_MODBASE (obj -> adc );
86
+ EADC_T * eadc_base = (EADC_T * ) NU_MODBASE (obj -> adc );
123
87
uint32_t chn = NU_MODSUBINDEX (obj -> adc );
124
88
125
- ADC_START_CONV ( adc_base );
126
- while (adc_base -> CTL & ADC_CTL_SWTRG_Msk );
127
- uint16_t conv_res_12 = ADC_GET_CONVERSION_DATA ( adc_base , chn );
89
+ EADC_START_CONV ( eadc_base , 1 << chn );
90
+ while (EADC_GET_DATA_VALID_FLAG ( eadc_base , 1 << chn ) != ( 1 << chn ) );
91
+ uint16_t conv_res_12 = EADC_GET_CONV_DATA ( eadc_base , chn );
128
92
// Just 12 bits are effective. Convert to 16 bits.
129
93
// conv_res_12: 0000 b11b10b9b8 b7b6b5b4 b3b2b1b0
130
94
// conv_res_16: b11b10b9b8 b7b6b5b4 b3b2b1b0 b11b10b9b8
0 commit comments