Skip to content

Commit 91a1b59

Browse files
committed
Nuvoton: Enable extending sampling time for ADC/EADC
For all Nuvoton targets, enable extending sampling time in ADC/EADC clocks on per-pin basis.
1 parent cc39261 commit 91a1b59

File tree

9 files changed

+225
-1
lines changed

9 files changed

+225
-1
lines changed

targets/TARGET_NUVOTON/TARGET_M2354/analogin_api.c

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#include "PeripheralPins.h"
2626
#include "gpio_api.h"
2727
#include "nu_modutil.h"
28+
#include "hal/PinNameAliases.h"
2829

2930
static uint32_t eadc_modinit_mask = 0;
3031

@@ -47,6 +48,18 @@ static const struct nu_modinit_s adc_modinit_tab[] = {
4748
{ADC_0_15, EADC_MODULE, 0, CLK_CLKDIV0_EADC(8), EADC_RST, EADC0_IRQn, NULL},
4849
};
4950

51+
#if defined(MBED_CONF_TARGET_EADC_EXTSMPT_LIST)
52+
/* Structure for extending sampling time on per-pin basis */
53+
struct nu_eadc_extsmpt {
54+
PinName pin;
55+
uint32_t value;
56+
};
57+
58+
static struct nu_eadc_extsmpt eadc_extsmpt_arr[] = {
59+
MBED_CONF_TARGET_EADC_EXTSMPT_LIST
60+
};
61+
#endif
62+
5063
void analogin_init(analogin_t *obj, PinName pin)
5164
{
5265
obj->adc = (ADCName) pinmap_peripheral(pin, PinMap_ADC);
@@ -92,6 +105,18 @@ void analogin_init(analogin_t *obj, PinName pin)
92105
// Configure the sample module Nmod for analog input channel Nch and software trigger source
93106
EADC_ConfigSampleModule(eadc_base, chn, EADC_SOFTWARE_TRIGGER, chn);
94107

108+
#if defined(MBED_CONF_TARGET_EADC_EXTSMPT_LIST)
109+
// Extend sampling time in EADC clocks on per-pin basis
110+
struct nu_eadc_extsmpt *eadc_extsmpt_pos = eadc_extsmpt_arr;
111+
struct nu_eadc_extsmpt *eadc_extsmpt_end = eadc_extsmpt_arr + sizeof (eadc_extsmpt_arr) / sizeof (eadc_extsmpt_arr[0]);
112+
for (; eadc_extsmpt_pos != eadc_extsmpt_end; eadc_extsmpt_pos ++) {
113+
if (eadc_extsmpt_pos->pin == pin) {
114+
EADC_SetExtendSampleTime(eadc_base, chn, eadc_extsmpt_pos->value);
115+
break;
116+
}
117+
}
118+
#endif
119+
95120
eadc_modinit_mask |= 1 << chn;
96121
}
97122

targets/TARGET_NUVOTON/TARGET_M251/analogin_api.c

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include "pinmap.h"
2525
#include "PeripheralPins.h"
2626
#include "nu_modutil.h"
27+
#include "hal/PinNameAliases.h"
2728

2829
static uint32_t eadc_modinit_mask = 0;
2930

@@ -46,6 +47,18 @@ static const struct nu_modinit_s adc_modinit_tab[] = {
4647
{ADC_0_15, EADC_MODULE, 0, CLK_CLKDIV0_EADC(8), EADC_RST, EADC_INT0_IRQn, NULL},
4748
};
4849

50+
#if defined(MBED_CONF_TARGET_EADC_EXTSMPT_LIST)
51+
/* Structure for extending sampling time on per-pin basis */
52+
struct nu_eadc_extsmpt {
53+
PinName pin;
54+
uint32_t value;
55+
};
56+
57+
static struct nu_eadc_extsmpt eadc_extsmpt_arr[] = {
58+
MBED_CONF_TARGET_EADC_EXTSMPT_LIST
59+
};
60+
#endif
61+
4962
void analogin_init(analogin_t *obj, PinName pin)
5063
{
5164
obj->adc = (ADCName) pinmap_peripheral(pin, PinMap_ADC);
@@ -90,6 +103,18 @@ void analogin_init(analogin_t *obj, PinName pin)
90103
*/
91104
EADC_SetExtendSampleTime(eadc_base, chn, 10);
92105

106+
#if defined(MBED_CONF_TARGET_EADC_EXTSMPT_LIST)
107+
// Extend sampling time in EADC clocks on per-pin basis
108+
struct nu_eadc_extsmpt *eadc_extsmpt_pos = eadc_extsmpt_arr;
109+
struct nu_eadc_extsmpt *eadc_extsmpt_end = eadc_extsmpt_arr + sizeof (eadc_extsmpt_arr) / sizeof (eadc_extsmpt_arr[0]);
110+
for (; eadc_extsmpt_pos != eadc_extsmpt_end; eadc_extsmpt_pos ++) {
111+
if (eadc_extsmpt_pos->pin == pin) {
112+
EADC_SetExtendSampleTime(eadc_base, chn, eadc_extsmpt_pos->value);
113+
break;
114+
}
115+
}
116+
#endif
117+
93118
eadc_modinit_mask |= 1 << chn;
94119
}
95120

targets/TARGET_NUVOTON/TARGET_M261/analogin_api.c

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include "pinmap.h"
2424
#include "PeripheralPins.h"
2525
#include "nu_modutil.h"
26+
#include "hal/PinNameAliases.h"
2627

2728
static uint32_t eadc_modinit_mask = 0;
2829

@@ -45,6 +46,18 @@ static const struct nu_modinit_s adc_modinit_tab[] = {
4546
{ADC_0_15, EADC_MODULE, 0, CLK_CLKDIV0_EADC(8), EADC_RST, EADC0_IRQn, NULL},
4647
};
4748

49+
#if defined(MBED_CONF_TARGET_EADC_EXTSMPT_LIST)
50+
/* Structure for extending sampling time on per-pin basis */
51+
struct nu_eadc_extsmpt {
52+
PinName pin;
53+
uint32_t value;
54+
};
55+
56+
static struct nu_eadc_extsmpt eadc_extsmpt_arr[] = {
57+
MBED_CONF_TARGET_EADC_EXTSMPT_LIST
58+
};
59+
#endif
60+
4861
void analogin_init(analogin_t *obj, PinName pin)
4962
{
5063
obj->adc = (ADCName) pinmap_peripheral(pin, PinMap_ADC);
@@ -81,6 +94,18 @@ void analogin_init(analogin_t *obj, PinName pin)
8194
// Configure the sample module Nmod for analog input channel Nch and software trigger source
8295
EADC_ConfigSampleModule(eadc_base, chn, EADC_SOFTWARE_TRIGGER, chn);
8396

97+
#if defined(MBED_CONF_TARGET_EADC_EXTSMPT_LIST)
98+
// Extend sampling time in EADC clocks on per-pin basis
99+
struct nu_eadc_extsmpt *eadc_extsmpt_pos = eadc_extsmpt_arr;
100+
struct nu_eadc_extsmpt *eadc_extsmpt_end = eadc_extsmpt_arr + sizeof (eadc_extsmpt_arr) / sizeof (eadc_extsmpt_arr[0]);
101+
for (; eadc_extsmpt_pos != eadc_extsmpt_end; eadc_extsmpt_pos ++) {
102+
if (eadc_extsmpt_pos->pin == pin) {
103+
EADC_SetExtendSampleTime(eadc_base, chn, eadc_extsmpt_pos->value);
104+
break;
105+
}
106+
}
107+
#endif
108+
84109
eadc_modinit_mask |= 1 << chn;
85110
}
86111

targets/TARGET_NUVOTON/TARGET_M451/analogin_api.c

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "pinmap.h"
2323
#include "PeripheralPins.h"
2424
#include "nu_modutil.h"
25+
#include "hal/PinNameAliases.h"
2526

2627
static uint32_t eadc_modinit_mask = 0;
2728

@@ -44,6 +45,18 @@ static const struct nu_modinit_s adc_modinit_tab[] = {
4445
{ADC_0_15, EADC_MODULE, 0, CLK_CLKDIV0_EADC(8), EADC_RST, ADC00_IRQn, NULL},
4546
};
4647

48+
#if defined(MBED_CONF_TARGET_EADC_EXTSMPT_LIST)
49+
/* Structure for extending sampling time on per-pin basis */
50+
struct nu_eadc_extsmpt {
51+
PinName pin;
52+
uint32_t value;
53+
};
54+
55+
static struct nu_eadc_extsmpt eadc_extsmpt_arr[] = {
56+
MBED_CONF_TARGET_EADC_EXTSMPT_LIST
57+
};
58+
#endif
59+
4760
void analogin_init(analogin_t *obj, PinName pin)
4861
{
4962
obj->adc = (ADCName) pinmap_peripheral(pin, PinMap_ADC);
@@ -80,7 +93,19 @@ void analogin_init(analogin_t *obj, PinName pin)
8093

8194
// Configure the sample module Nmod for analog input channel Nch and software trigger source
8295
EADC_ConfigSampleModule(eadc_base, chn, EADC_SOFTWARE_TRIGGER, chn);
83-
96+
97+
#if defined(MBED_CONF_TARGET_EADC_EXTSMPT_LIST)
98+
// Extend sampling time in EADC clocks on per-pin basis
99+
struct nu_eadc_extsmpt *eadc_extsmpt_pos = eadc_extsmpt_arr;
100+
struct nu_eadc_extsmpt *eadc_extsmpt_end = eadc_extsmpt_arr + sizeof (eadc_extsmpt_arr) / sizeof (eadc_extsmpt_arr[0]);
101+
for (; eadc_extsmpt_pos != eadc_extsmpt_end; eadc_extsmpt_pos ++) {
102+
if (eadc_extsmpt_pos->pin == pin) {
103+
EADC_SetExtendSampleTime(eadc_base, chn, eadc_extsmpt_pos->value);
104+
break;
105+
}
106+
}
107+
#endif
108+
84109
eadc_modinit_mask |= 1 << chn;
85110
}
86111

targets/TARGET_NUVOTON/TARGET_M460/analogin_api.c

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#include "PeripheralPins.h"
2626
#include "gpio_api.h"
2727
#include "nu_modutil.h"
28+
#include "hal/PinNameAliases.h"
2829

2930
static uint32_t eadc_modinit_mask = 0;
3031

@@ -84,6 +85,18 @@ static const struct nu_modinit_s adc_modinit_tab[] = {
8485
{ADC_2_15, EADC2_MODULE, CLK_CLKSEL0_EADC2SEL_HCLK, CLK_CLKDIV5_EADC2(8), EADC2_RST, EADC20_IRQn, NULL},
8586
};
8687

88+
#if defined(MBED_CONF_TARGET_EADC_EXTSMPT_LIST)
89+
/* Structure for extending sampling time on per-pin basis */
90+
struct nu_eadc_extsmpt {
91+
PinName pin;
92+
uint32_t value;
93+
};
94+
95+
static struct nu_eadc_extsmpt eadc_extsmpt_arr[] = {
96+
MBED_CONF_TARGET_EADC_EXTSMPT_LIST
97+
};
98+
#endif
99+
87100
void analogin_init(analogin_t *obj, PinName pin)
88101
{
89102
obj->adc = (ADCName) pinmap_peripheral(pin, PinMap_ADC);
@@ -126,6 +139,18 @@ void analogin_init(analogin_t *obj, PinName pin)
126139
// Configure the sample module Nmod for analog input channel Nch and software trigger source
127140
EADC_ConfigSampleModule(eadc_base, chn, EADC_SOFTWARE_TRIGGER, chn);
128141

142+
#if defined(MBED_CONF_TARGET_EADC_EXTSMPT_LIST)
143+
// Extend sampling time in EADC clocks on per-pin basis
144+
struct nu_eadc_extsmpt *eadc_extsmpt_pos = eadc_extsmpt_arr;
145+
struct nu_eadc_extsmpt *eadc_extsmpt_end = eadc_extsmpt_arr + sizeof (eadc_extsmpt_arr) / sizeof (eadc_extsmpt_arr[0]);
146+
for (; eadc_extsmpt_pos != eadc_extsmpt_end; eadc_extsmpt_pos ++) {
147+
if (eadc_extsmpt_pos->pin == pin) {
148+
EADC_SetExtendSampleTime(eadc_base, chn, eadc_extsmpt_pos->value);
149+
break;
150+
}
151+
}
152+
#endif
153+
129154
eadc_modinit_mask |= 1 << chn;
130155
}
131156

targets/TARGET_NUVOTON/TARGET_M480/analogin_api.c

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#include "PeripheralPins.h"
2626
#include "gpio_api.h"
2727
#include "nu_modutil.h"
28+
#include "hal/PinNameAliases.h"
2829

2930
static uint32_t eadc_modinit_mask = 0;
3031

@@ -66,6 +67,18 @@ static const struct nu_modinit_s adc_modinit_tab[] = {
6667
{ADC_1_15, EADC1_MODULE, 0, CLK_CLKDIV2_EADC1(8), EADC1_RST, EADC10_IRQn, NULL},
6768
};
6869

70+
#if defined(MBED_CONF_TARGET_EADC_EXTSMPT_LIST)
71+
/* Structure for extending sampling time on per-pin basis */
72+
struct nu_eadc_extsmpt {
73+
PinName pin;
74+
uint32_t value;
75+
};
76+
77+
static struct nu_eadc_extsmpt eadc_extsmpt_arr[] = {
78+
MBED_CONF_TARGET_EADC_EXTSMPT_LIST
79+
};
80+
#endif
81+
6982
void analogin_init(analogin_t *obj, PinName pin)
7083
{
7184
obj->adc = (ADCName) pinmap_peripheral(pin, PinMap_ADC);
@@ -102,6 +115,18 @@ void analogin_init(analogin_t *obj, PinName pin)
102115
// Configure the sample module Nmod for analog input channel Nch and software trigger source
103116
EADC_ConfigSampleModule(eadc_base, chn, EADC_SOFTWARE_TRIGGER, chn);
104117

118+
#if defined(MBED_CONF_TARGET_EADC_EXTSMPT_LIST)
119+
// Extend sampling time in EADC clocks on per-pin basis
120+
struct nu_eadc_extsmpt *eadc_extsmpt_pos = eadc_extsmpt_arr;
121+
struct nu_eadc_extsmpt *eadc_extsmpt_end = eadc_extsmpt_arr + sizeof (eadc_extsmpt_arr) / sizeof (eadc_extsmpt_arr[0]);
122+
for (; eadc_extsmpt_pos != eadc_extsmpt_end; eadc_extsmpt_pos ++) {
123+
if (eadc_extsmpt_pos->pin == pin) {
124+
EADC_SetExtendSampleTime(eadc_base, chn, eadc_extsmpt_pos->value);
125+
break;
126+
}
127+
}
128+
#endif
129+
105130
eadc_modinit_mask |= 1 << chn;
106131
}
107132

targets/TARGET_NUVOTON/TARGET_NANO100/analogin_api.c

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include "pinmap.h"
2424
#include "PeripheralPins.h"
2525
#include "nu_modutil.h"
26+
#include "hal/PinNameAliases.h"
2627

2728
static uint32_t adc_modinit_mask = 0;
2829

@@ -41,6 +42,18 @@ static const struct nu_modinit_s adc_modinit_tab[] = {
4142
{ADC_0_11, ADC_MODULE, CLK_CLKSEL1_ADC_S_HIRC, CLK_ADC_CLK_DIVIDER(1), ADC_RST, ADC_IRQn, NULL},
4243
};
4344

45+
#if defined(MBED_CONF_TARGET_ADC_SMPLCNT_LIST)
46+
/* Structure for extending sampling time on per-pin basis */
47+
struct nu_eadc_smplcnt {
48+
PinName pin;
49+
uint32_t value;
50+
};
51+
52+
static struct nu_eadc_smplcnt eadc_smplcnt_arr[] = {
53+
MBED_CONF_TARGET_ADC_SMPLCNT_LIST
54+
};
55+
#endif
56+
4457
void analogin_init(analogin_t *obj, PinName pin)
4558
{
4659
obj->adc = (ADCName) pinmap_peripheral(pin, PinMap_ADC);
@@ -82,6 +95,18 @@ void analogin_init(analogin_t *obj, PinName pin)
8295
adc_base->CHEN |= 1 << chn;
8396
}
8497

98+
#if defined(MBED_CONF_TARGET_ADC_SMPLCNT_LIST)
99+
// Extend sampling time in EADC clocks on per-pin basis
100+
struct nu_eadc_smplcnt *eadc_extsmpt_pos = eadc_smplcnt_arr;
101+
struct nu_eadc_smplcnt *eadc_extsmpt_end = eadc_smplcnt_arr + sizeof (eadc_smplcnt_arr) / sizeof (eadc_smplcnt_arr[0]);
102+
for (; eadc_extsmpt_pos != eadc_extsmpt_end; eadc_extsmpt_pos ++) {
103+
if (eadc_extsmpt_pos->pin == pin) {
104+
ADC_SetExtraSampleTime(adc_base, chn, eadc_extsmpt_pos->value);
105+
break;
106+
}
107+
}
108+
#endif
109+
85110
adc_modinit_mask |= 1 << chn;
86111
}
87112

targets/TARGET_NUVOTON/TARGET_NUC472/analogin_api.c

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "pinmap.h"
2323
#include "PeripheralPins.h"
2424
#include "nu_modutil.h"
25+
#include "hal/PinNameAliases.h"
2526

2627
static uint32_t eadc_modinit_mask = 0;
2728

@@ -45,6 +46,18 @@ static const struct nu_modinit_s adc_modinit_tab[] = {
4546
{ADC_1_7, EADC_MODULE, CLK_CLKSEL1_ADCSEL_PLL, CLK_CLKDIV0_ADC(5), ADC_RST, EADC0_IRQn, NULL}
4647
};
4748

49+
#if defined(MBED_CONF_TARGET_EADC_EXTSMPT_LIST)
50+
/* Structure for extending sampling time on per-pin basis */
51+
struct nu_eadc_extsmpt {
52+
PinName pin;
53+
uint32_t value;
54+
};
55+
56+
static struct nu_eadc_extsmpt eadc_extsmpt_arr[] = {
57+
MBED_CONF_TARGET_EADC_EXTSMPT_LIST
58+
};
59+
#endif
60+
4861
void analogin_init(analogin_t *obj, PinName pin)
4962
{
5063
obj->adc = (ADCName) pinmap_peripheral(pin, PinMap_ADC);
@@ -82,6 +95,18 @@ void analogin_init(analogin_t *obj, PinName pin)
8295
// Configure the sample module Nmod for analog input channel Nch and software trigger source
8396
EADC_ConfigSampleModule(eadc_base, smp_mod, EADC_SOFTWARE_TRIGGER, smp_chn);
8497

98+
#if defined(MBED_CONF_TARGET_EADC_EXTSMPT_LIST)
99+
// Extend sampling time in EADC clocks on per-pin basis
100+
struct nu_eadc_extsmpt *eadc_extsmpt_pos = eadc_extsmpt_arr;
101+
struct nu_eadc_extsmpt *eadc_extsmpt_end = eadc_extsmpt_arr + sizeof (eadc_extsmpt_arr) / sizeof (eadc_extsmpt_arr[0]);
102+
for (; eadc_extsmpt_pos != eadc_extsmpt_end; eadc_extsmpt_pos ++) {
103+
if (eadc_extsmpt_pos->pin == pin) {
104+
EADC_SetExtendSampleTime(eadc_base, smp_mod, eadc_extsmpt_pos->value);
105+
break;
106+
}
107+
}
108+
#endif
109+
85110
eadc_modinit_mask |= 1 << smp_mod;
86111
}
87112

0 commit comments

Comments
 (0)