Skip to content

Commit a911c11

Browse files
Merge pull request ARMmbed#4 from bcostm/dev_NUCLEO_H743ZI
NUCLEO_H743ZI: analogin improvements - 16b feature confirmed by IntroPack
2 parents 2f52b66 + 40dc4cf commit a911c11

File tree

2 files changed

+29
-9
lines changed

2 files changed

+29
-9
lines changed

targets/TARGET_STM/TARGET_STM32H7/analogin_device.c

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -67,18 +67,28 @@ void analogin_init(analogin_t *obj, PinName pin)
6767

6868
// Configure ADC object structures
6969
obj->handle.State = HAL_ADC_STATE_RESET;
70-
obj->handle.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
71-
obj->handle.Init.Resolution = ADC_RESOLUTION_12B;
72-
obj->handle.Init.ScanConvMode = DISABLE;
73-
obj->handle.Init.ContinuousConvMode = DISABLE;
74-
obj->handle.Init.DiscontinuousConvMode = DISABLE;
75-
obj->handle.Init.NbrOfDiscConversion = 0;
76-
obj->handle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
70+
obj->handle.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
71+
obj->handle.Init.Resolution = ADC_RESOLUTION_16B;
72+
obj->handle.Init.ScanConvMode = DISABLE;
73+
obj->handle.Init.ContinuousConvMode = DISABLE;
74+
obj->handle.Init.DiscontinuousConvMode = DISABLE;
75+
obj->handle.Init.NbrOfDiscConversion = 0;
76+
obj->handle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
7777
obj->handle.Init.ExternalTrigConv = ADC_EXTERNALTRIG_T1_CC1;
7878
obj->handle.Init.LeftBitShift = 0;
7979
obj->handle.Init.NbrOfConversion = 1;
8080
obj->handle.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DR;
8181
obj->handle.Init.EOCSelection = DISABLE;
82+
obj->handle.Init.LowPowerAutoWait = DISABLE;
83+
obj->handle.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
84+
obj->handle.Init.OversamplingMode = DISABLE;
85+
86+
RCC_PeriphCLKInitTypeDef PeriphClkInitStruct;
87+
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_ADC;
88+
PeriphClkInitStruct.AdcClockSelection = RCC_ADCCLKSOURCE_CLKP;
89+
PeriphClkInitStruct.PLL2.PLL2P = 4;
90+
HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);
91+
__HAL_RCC_ADC_CONFIG(RCC_ADCCLKSOURCE_CLKP);
8292

8393
#if defined(ADC1)
8494
if ((ADCName)obj->handle.Instance == ADC_1) {
@@ -99,16 +109,20 @@ void analogin_init(analogin_t *obj, PinName pin)
99109
if (HAL_ADC_Init(&obj->handle) != HAL_OK) {
100110
error("Cannot initialize ADC");
101111
}
112+
113+
HAL_ADCEx_Calibration_Start(&obj->handle, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED);
102114
}
103115

104116
uint16_t adc_read(analogin_t *obj)
105117
{
106118
ADC_ChannelConfTypeDef sConfig = {0};
107119

108120
// Configure ADC channel
109-
sConfig.Rank = 1;
110-
sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
121+
sConfig.Rank = ADC_REGULAR_RANK_1;
122+
sConfig.SamplingTime = ADC_SAMPLETIME_64CYCLES_5;
111123
sConfig.Offset = 0;
124+
sConfig.SingleDiff = ADC_SINGLE_ENDED;
125+
sConfig.OffsetNumber = ADC_OFFSET_NONE;
112126

113127
switch (obj->channel) {
114128
case 0:

targets/TARGET_STM/analogin_api.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,15 +34,21 @@ uint16_t adc_read(analogin_t *obj);
3434
uint16_t analogin_read_u16(analogin_t *obj)
3535
{
3636
uint16_t value = adc_read(obj);
37+
#ifndef TARGET_STM32H7
3738
// 12-bit to 16-bit conversion
3839
value = ((value << 4) & (uint16_t)0xFFF0) | ((value >> 8) & (uint16_t)0x000F);
40+
#endif
3941
return value;
4042
}
4143

4244
float analogin_read(analogin_t *obj)
4345
{
4446
uint16_t value = adc_read(obj);
47+
#ifdef TARGET_STM32H7
48+
return (float)value * (1.0f / (float)0xFFFF); // 16 bits range
49+
#else
4550
return (float)value * (1.0f / (float)0xFFF); // 12 bits range
51+
#endif
4652
}
4753

4854
#endif

0 commit comments

Comments
 (0)