Skip to content

Commit 511c897

Browse files
authored
Merge pull request #13572 from jeromecoutant/PR_H7_ADC2
STM32H7 ADC: clock selection lost after deepsleep
2 parents 0190014 + b65afe0 commit 511c897

File tree

1 file changed

+33
-23
lines changed

1 file changed

+33
-23
lines changed

targets/TARGET_STM/TARGET_STM32H7/analogin_device.c

Lines changed: 33 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,35 @@
3636
#include "mbed_error.h"
3737
#include "PeripheralPins.h"
3838

39+
40+
void analogin_pll_configuration(void)
41+
{
42+
#if defined(DUAL_CORE)
43+
while (LL_HSEM_1StepLock(HSEM, CFG_HW_RCC_SEMID)) {
44+
}
45+
#endif /* DUAL_CORE */
46+
47+
RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
48+
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_ADC;
49+
PeriphClkInitStruct.PLL2.PLL2M = 4;
50+
PeriphClkInitStruct.PLL2.PLL2N = 240;
51+
PeriphClkInitStruct.PLL2.PLL2P = 2;
52+
PeriphClkInitStruct.PLL2.PLL2Q = 2;
53+
PeriphClkInitStruct.PLL2.PLL2R = 2;
54+
PeriphClkInitStruct.PLL2.PLL2RGE = RCC_PLL2VCIRANGE_1;
55+
PeriphClkInitStruct.PLL2.PLL2VCOSEL = RCC_PLL2VCOWIDE;
56+
PeriphClkInitStruct.PLL2.PLL2FRACN = 0;
57+
PeriphClkInitStruct.AdcClockSelection = RCC_ADCCLKSOURCE_PLL2;
58+
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) {
59+
error("analogin_init HAL_RCCEx_PeriphCLKConfig");
60+
}
61+
62+
#if defined(DUAL_CORE)
63+
LL_HSEM_ReleaseLock(HSEM, CFG_HW_RCC_SEMID, HSEM_CR_COREID_CURRENT);
64+
#endif /* DUAL_CORE */
65+
66+
}
67+
3968
void analogin_init(analogin_t *obj, PinName pin)
4069
{
4170
uint32_t function = (uint32_t)NC;
@@ -99,29 +128,7 @@ void analogin_init(analogin_t *obj, PinName pin)
99128
obj->handle.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE;
100129
obj->handle.Init.OversamplingMode = DISABLE;
101130

102-
#if defined(DUAL_CORE)
103-
while (LL_HSEM_1StepLock(HSEM, CFG_HW_RCC_SEMID)) {
104-
}
105-
#endif /* DUAL_CORE */
106-
107-
RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
108-
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_ADC;
109-
PeriphClkInitStruct.PLL2.PLL2M = 4;
110-
PeriphClkInitStruct.PLL2.PLL2N = 240;
111-
PeriphClkInitStruct.PLL2.PLL2P = 2;
112-
PeriphClkInitStruct.PLL2.PLL2Q = 2;
113-
PeriphClkInitStruct.PLL2.PLL2R = 2;
114-
PeriphClkInitStruct.PLL2.PLL2RGE = RCC_PLL2VCIRANGE_1;
115-
PeriphClkInitStruct.PLL2.PLL2VCOSEL = RCC_PLL2VCOWIDE;
116-
PeriphClkInitStruct.PLL2.PLL2FRACN = 0;
117-
PeriphClkInitStruct.AdcClockSelection = RCC_ADCCLKSOURCE_PLL2;
118-
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) {
119-
error("analogin_init HAL_RCCEx_PeriphCLKConfig");
120-
}
121-
122-
#if defined(DUAL_CORE)
123-
LL_HSEM_ReleaseLock(HSEM, CFG_HW_RCC_SEMID, HSEM_CR_COREID_CURRENT);
124-
#endif /* DUAL_CORE */
131+
analogin_pll_configuration();
125132

126133
#if defined(ADC1)
127134
if ((ADCName)obj->handle.Instance == ADC_1) {
@@ -163,6 +170,9 @@ uint16_t adc_read(analogin_t *obj)
163170
{
164171
ADC_ChannelConfTypeDef sConfig = {0};
165172

173+
/* Reconfigure PLL as it could be lost during deepsleep */
174+
analogin_pll_configuration();
175+
166176
// Configure ADC channel
167177
sConfig.Rank = ADC_REGULAR_RANK_1;
168178
sConfig.SamplingTime = ADC_SAMPLETIME_64CYCLES_5;

0 commit comments

Comments
 (0)