Skip to content

Commit 1159845

Browse files
committed
NUCLEO_F103RB: update channels management in analogin api
1 parent dd292a7 commit 1159845

File tree

2 files changed

+65
-35
lines changed

2 files changed

+65
-35
lines changed

libraries/mbed/targets/hal/TARGET_STM/TARGET_NUCLEO_F103RB/analogin_api.c

Lines changed: 64 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,14 @@ static const PinMap PinMap_ADC[] = {
2929
{PA_0, ADC_1, STM_PIN_DATA(GPIO_Mode_AIN, 0)},
3030
{PA_1, ADC_1, STM_PIN_DATA(GPIO_Mode_AIN, 0)},
3131
{PA_4, ADC_1, STM_PIN_DATA(GPIO_Mode_AIN, 0)},
32-
{PB_0, ADC_2, STM_PIN_DATA(GPIO_Mode_AIN, 0)},
33-
{PC_1, ADC_2, STM_PIN_DATA(GPIO_Mode_AIN, 0)},
34-
{PC_0, ADC_2, STM_PIN_DATA(GPIO_Mode_AIN, 0)},
32+
{PB_0, ADC_1, STM_PIN_DATA(GPIO_Mode_AIN, 0)},
33+
{PC_1, ADC_1, STM_PIN_DATA(GPIO_Mode_AIN, 0)},
34+
{PC_0, ADC_1, STM_PIN_DATA(GPIO_Mode_AIN, 0)},
3535
{NC, NC, 0}
3636
};
3737

38+
int adc_inited = 0;
39+
3840
void analogin_init(analogin_t *obj, PinName pin) {
3941

4042
ADC_TypeDef *adc;
@@ -47,48 +49,75 @@ void analogin_init(analogin_t *obj, PinName pin) {
4749
error("ADC pin mapping failed");
4850
}
4951

50-
// Get ADC registers structure address
51-
adc = (ADC_TypeDef *)(obj->adc);
52-
53-
// Enable ADC clock
54-
RCC_ADCCLKConfig(RCC_PCLK2_Div4);
55-
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_ADC2, ENABLE);
56-
5752
// Configure GPIO
5853
pinmap_pinout(pin, PinMap_ADC);
5954

60-
// Configure ADC
61-
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
62-
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
63-
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
64-
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
65-
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
66-
ADC_InitStructure.ADC_NbrOfChannel = 1;
67-
ADC_Init(adc, &ADC_InitStructure);
68-
69-
// Configure ADC channel
70-
if (pin == PA_0) { ADC_RegularChannelConfig(adc, ADC_Channel_0, 1, ADC_SampleTime_7Cycles5); }
71-
if (pin == PA_1) { ADC_RegularChannelConfig(adc, ADC_Channel_1, 1, ADC_SampleTime_7Cycles5); }
72-
if (pin == PA_4) { ADC_RegularChannelConfig(adc, ADC_Channel_4, 1, ADC_SampleTime_7Cycles5); }
73-
if (pin == PB_0) { ADC_RegularChannelConfig(adc, ADC_Channel_8, 1, ADC_SampleTime_7Cycles5); }
74-
if (pin == PC_1) { ADC_RegularChannelConfig(adc, ADC_Channel_11, 1, ADC_SampleTime_7Cycles5); }
75-
if (pin == PC_0) { ADC_RegularChannelConfig(adc, ADC_Channel_10, 1, ADC_SampleTime_7Cycles5); }
76-
77-
// Enable ADC
78-
ADC_Cmd(adc, ENABLE);
79-
80-
// Calibrate ADC
81-
ADC_ResetCalibration(adc);
82-
while(ADC_GetResetCalibrationStatus(adc));
83-
ADC_StartCalibration(adc);
84-
while(ADC_GetCalibrationStatus(adc));
55+
// Save pin number for the read function
56+
obj->pin = pin;
57+
58+
// The ADC initialization is done once
59+
if (adc_inited == 0) {
60+
adc_inited = 1;
61+
62+
// Get ADC registers structure address
63+
adc = (ADC_TypeDef *)(obj->adc);
64+
65+
// Enable ADC clock
66+
RCC_ADCCLKConfig(RCC_PCLK2_Div4);
67+
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
68+
69+
// Configure ADC
70+
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
71+
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
72+
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
73+
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
74+
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
75+
ADC_InitStructure.ADC_NbrOfChannel = 1;
76+
ADC_Init(adc, &ADC_InitStructure);
77+
78+
// Enable ADC
79+
ADC_Cmd(adc, ENABLE);
80+
81+
// Calibrate ADC
82+
ADC_ResetCalibration(adc);
83+
while(ADC_GetResetCalibrationStatus(adc));
84+
ADC_StartCalibration(adc);
85+
while(ADC_GetCalibrationStatus(adc));
86+
}
8587
}
8688

8789
static inline uint16_t adc_read(analogin_t *obj) {
8890
// Get ADC registers structure address
8991
ADC_TypeDef *adc = (ADC_TypeDef *)(obj->adc);
92+
93+
// Configure ADC channel
94+
switch (obj->pin) {
95+
case PA_0:
96+
ADC_RegularChannelConfig(adc, ADC_Channel_0, 1, ADC_SampleTime_7Cycles5);
97+
break;
98+
case PA_1:
99+
ADC_RegularChannelConfig(adc, ADC_Channel_1, 1, ADC_SampleTime_7Cycles5);
100+
break;
101+
case PA_4:
102+
ADC_RegularChannelConfig(adc, ADC_Channel_4, 1, ADC_SampleTime_7Cycles5);
103+
break;
104+
case PB_0:
105+
ADC_RegularChannelConfig(adc, ADC_Channel_8, 1, ADC_SampleTime_7Cycles5);
106+
break;
107+
case PC_1:
108+
ADC_RegularChannelConfig(adc, ADC_Channel_11, 1, ADC_SampleTime_7Cycles5);
109+
break;
110+
case PC_0:
111+
ADC_RegularChannelConfig(adc, ADC_Channel_10, 1, ADC_SampleTime_7Cycles5);
112+
break;
113+
default:
114+
return 0;
115+
}
116+
90117
ADC_SoftwareStartConvCmd(adc, ENABLE); // Start conversion
118+
91119
while(ADC_GetFlagStatus(adc, ADC_FLAG_EOC) == RESET); // Wait end of conversion
120+
92121
return(ADC_GetConversionValue(adc)); // Get conversion value
93122
}
94123

libraries/mbed/targets/hal/TARGET_STM/TARGET_NUCLEO_F103RB/objects.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ struct port_s {
4141

4242
struct analogin_s {
4343
ADCName adc;
44+
PinName pin;
4445
};
4546

4647
struct serial_s {

0 commit comments

Comments
 (0)