1
+ #include " ../hardware_api.h"
2
+ #if defined(STM32G4xx)
3
+
4
+ #include " stm32g4xx_hal.h"
5
+ #include " stm32g4xx_ll_pwr.h"
6
+ #include " stm32g4xx_hal_adc.h"
7
+ #include " stm32g4_hal.h"
8
+ // From STM32 cube IDE
9
+ /* *
10
+ ******************************************************************************
11
+ * @attention
12
+ *
13
+ * <h2><center>© Copyright (c) 2020 STMicroelectronics.
14
+ * All rights reserved.</center></h2>
15
+ *
16
+ * This software component is licensed by ST under BSD 3-Clause license,
17
+ * the "License"; You may not use this file except in compliance with the
18
+ * License. You may obtain a copy of the License at:
19
+ * opensource.org/licenses/BSD-3-Clause
20
+ *
21
+ ******************************************************************************
22
+ */
23
+
24
+
25
+ /* *
26
+ * @brief GPIO Initialization Function
27
+ * @param None
28
+ * @retval None
29
+ */
30
+ void MX_GPIO_Init (void )
31
+ {
32
+ /* GPIO Ports Clock Enable */
33
+ __HAL_RCC_GPIOC_CLK_ENABLE ();
34
+ __HAL_RCC_GPIOF_CLK_ENABLE ();
35
+ __HAL_RCC_GPIOA_CLK_ENABLE ();
36
+ __HAL_RCC_GPIOB_CLK_ENABLE ();
37
+
38
+ __HAL_RCC_ADC12_CLK_ENABLE ();
39
+ }
40
+
41
+ /* *
42
+ * Enable DMA controller clock
43
+ */
44
+ void MX_DMA_Init (void )
45
+ {
46
+ /* DMA controller clock enable */
47
+ __HAL_RCC_DMAMUX1_CLK_ENABLE ();
48
+ __HAL_RCC_DMA1_CLK_ENABLE ();
49
+ __HAL_RCC_DMA2_CLK_ENABLE ();
50
+
51
+ /* DMA interrupt init */
52
+ /* DMA1_Channel1_IRQn interrupt configuration */
53
+ HAL_NVIC_SetPriority (DMA1_Channel1_IRQn, 0 , 0 );
54
+ HAL_NVIC_EnableIRQ (DMA1_Channel1_IRQn);
55
+ /* DMA1_Channel2_IRQn interrupt configuration */
56
+ HAL_NVIC_SetPriority (DMA1_Channel2_IRQn, 0 , 0 );
57
+ HAL_NVIC_EnableIRQ (DMA1_Channel2_IRQn);
58
+
59
+ // Enable external clock for ADC
60
+ RCC_PeriphCLKInitTypeDef PeriphClkInit;
61
+ PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC12;
62
+ PeriphClkInit.Adc12ClockSelection = RCC_ADC12CLKSOURCE_PLL;
63
+ HAL_RCCEx_PeriphCLKConfig (&PeriphClkInit);
64
+ }
65
+
66
+
67
+ /* *
68
+ * @brief ADC1 Initialization Function
69
+ * @param None
70
+ * @retval None
71
+ */
72
+ void MX_ADC1_Init (ADC_HandleTypeDef* hadc1)
73
+ {
74
+ /* USER CODE BEGIN ADC1_Init 0 */
75
+
76
+ /* USER CODE END ADC1_Init 0 */
77
+
78
+ ADC_MultiModeTypeDef multimode = {0 };
79
+ ADC_ChannelConfTypeDef sConfig = {0 };
80
+
81
+ /* USER CODE BEGIN ADC1_Init 1 */
82
+
83
+ /* USER CODE END ADC1_Init 1 */
84
+ /* * Common config
85
+ */
86
+ hadc1->Instance = ADC1;
87
+ hadc1->Init .ClockPrescaler = ADC_CLOCK_ASYNC_DIV16;
88
+ hadc1->Init .Resolution = ADC_RESOLUTION_12B;
89
+ hadc1->Init .DataAlign = ADC_DATAALIGN_RIGHT;
90
+ hadc1->Init .GainCompensation = 0 ;
91
+ hadc1->Init .ScanConvMode = ADC_SCAN_ENABLE;
92
+ hadc1->Init .EOCSelection = ADC_EOC_SINGLE_CONV;
93
+ hadc1->Init .LowPowerAutoWait = DISABLE;
94
+ hadc1->Init .ContinuousConvMode = DISABLE;
95
+ hadc1->Init .NbrOfConversion = 2 ;
96
+ hadc1->Init .DiscontinuousConvMode = DISABLE;
97
+ hadc1->Init .ExternalTrigConv = ADC_EXTERNALTRIG_T1_TRGO;
98
+ hadc1->Init .ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING;
99
+ hadc1->Init .DMAContinuousRequests = ENABLE;
100
+ hadc1->Init .Overrun = ADC_OVR_DATA_PRESERVED;
101
+
102
+ if (HAL_ADC_Init (hadc1) != HAL_OK)
103
+ {
104
+ Error_Handler ();
105
+ }
106
+
107
+ /* * Configure the ADC multi-mode
108
+ */
109
+ multimode.Mode = ADC_MODE_INDEPENDENT;
110
+ if (HAL_ADCEx_MultiModeConfigChannel (hadc1, &multimode) != HAL_OK)
111
+ {
112
+ Error_Handler ();
113
+ }
114
+ /* * Configure Regular Channel
115
+ */
116
+ sConfig .Channel = ADC_CHANNEL_12; // ADC1_IN12 = PB1 = OP3_OUT
117
+ sConfig .Rank = ADC_REGULAR_RANK_1;
118
+ sConfig .SamplingTime = ADC_SAMPLETIME_2CYCLES_5;
119
+ sConfig .SingleDiff = ADC_SINGLE_ENDED;
120
+ sConfig .OffsetNumber = ADC_OFFSET_NONE;
121
+ sConfig .Offset = 0 ;
122
+ if (HAL_ADC_ConfigChannel (hadc1, &sConfig ) != HAL_OK)
123
+ {
124
+ Error_Handler ();
125
+ }
126
+ /* * Configure Regular Channel
127
+ */
128
+ sConfig .Channel = ADC_CHANNEL_3; // ADC1_IN3 = PA2 = OP1_OUT
129
+ sConfig .Rank = ADC_REGULAR_RANK_2;
130
+ if (HAL_ADC_ConfigChannel (hadc1, &sConfig ) != HAL_OK)
131
+ {
132
+ Error_Handler ();
133
+ }
134
+ /* USER CODE BEGIN ADC1_Init 2 */
135
+
136
+ /* USER CODE END ADC1_Init 2 */
137
+
138
+ }
139
+
140
+ /* *
141
+ * @brief ADC2 Initialization Function
142
+ * @param None
143
+ * @retval None
144
+ */
145
+ void MX_ADC2_Init (ADC_HandleTypeDef* hadc2)
146
+ {
147
+ /* USER CODE BEGIN ADC2_Init 0 */
148
+
149
+ /* USER CODE END ADC2_Init 0 */
150
+
151
+ ADC_ChannelConfTypeDef sConfig = {0 };
152
+
153
+ /* USER CODE BEGIN ADC2_Init 1 */
154
+
155
+ /* USER CODE END ADC2_Init 1 */
156
+ /* * Common config
157
+ */
158
+ hadc2->Instance = ADC2;
159
+ hadc2->Init .ClockPrescaler = ADC_CLOCK_ASYNC_DIV16;
160
+ hadc2->Init .Resolution = ADC_RESOLUTION_12B;
161
+ hadc2->Init .DataAlign = ADC_DATAALIGN_RIGHT;
162
+ hadc2->Init .GainCompensation = 0 ;
163
+ hadc2->Init .ScanConvMode = ADC_SCAN_ENABLE;
164
+ hadc2->Init .EOCSelection = ADC_EOC_SINGLE_CONV;
165
+ hadc2->Init .LowPowerAutoWait = DISABLE;
166
+ hadc2->Init .ContinuousConvMode = DISABLE;
167
+ hadc2->Init .NbrOfConversion = 1 ;
168
+ hadc2->Init .DiscontinuousConvMode = DISABLE;
169
+ hadc2->Init .ExternalTrigConv = ADC_EXTERNALTRIG_T1_TRGO;
170
+ hadc2->Init .ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING;
171
+ hadc2->Init .DMAContinuousRequests = ENABLE;
172
+ hadc2->Init .Overrun = ADC_OVR_DATA_PRESERVED;
173
+
174
+ if (HAL_ADC_Init (hadc2) != HAL_OK)
175
+ {
176
+ Error_Handler ();
177
+ }
178
+ /* * Configure Regular Channel
179
+ */
180
+ sConfig .Channel = ADC_CHANNEL_3; // ADC2_IN3 = PA6
181
+ sConfig .Rank = ADC_REGULAR_RANK_1;
182
+ sConfig .SamplingTime = ADC_SAMPLETIME_2CYCLES_5;
183
+ sConfig .SingleDiff = ADC_SINGLE_ENDED;
184
+ sConfig .OffsetNumber = ADC_OFFSET_NONE;
185
+ sConfig .Offset = 0 ;
186
+ if (HAL_ADC_ConfigChannel (hadc2, &sConfig ) != HAL_OK)
187
+ {
188
+ Error_Handler ();
189
+ }
190
+ /* USER CODE BEGIN ADC2_Init 2 */
191
+
192
+ /* USER CODE END ADC2_Init 2 */
193
+
194
+ }
195
+
196
+ /* *
197
+ * @brief OPAMP MSP Initialization
198
+ * This function configures the hardware resources used in this example
199
+ * @param hopamp-> OPAMP handle pointer
200
+ * @retval None
201
+ */
202
+ void HAL_OPAMP_MspInit (OPAMP_HandleTypeDef* hopamp)
203
+ {
204
+ GPIO_InitTypeDef GPIO_InitStruct = {0 };
205
+ if (hopamp->Instance ==OPAMP1)
206
+ {
207
+ /* USER CODE BEGIN OPAMP1_MspInit 0 */
208
+
209
+ /* USER CODE END OPAMP1_MspInit 0 */
210
+
211
+ __HAL_RCC_GPIOA_CLK_ENABLE ();
212
+ /* *OPAMP1 GPIO Configuration
213
+ PA1 ------> OPAMP1_VINP
214
+ PA2 ------> OPAMP1_VOUT
215
+ PA3 ------> OPAMP1_VINM
216
+ */
217
+ GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3;
218
+ GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
219
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
220
+ HAL_GPIO_Init (GPIOA, &GPIO_InitStruct);
221
+
222
+ /* USER CODE BEGIN OPAMP1_MspInit 1 */
223
+
224
+ /* USER CODE END OPAMP1_MspInit 1 */
225
+ }
226
+ else if (hopamp->Instance ==OPAMP2)
227
+ {
228
+ /* USER CODE BEGIN OPAMP2_MspInit 0 */
229
+
230
+ /* USER CODE END OPAMP2_MspInit 0 */
231
+
232
+ __HAL_RCC_GPIOA_CLK_ENABLE ();
233
+ /* *OPAMP2 GPIO Configuration
234
+ PA5 ------> OPAMP2_VINM
235
+ PA6 ------> OPAMP2_VOUT
236
+ PA7 ------> OPAMP2_VINP
237
+ */
238
+ GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;
239
+ GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
240
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
241
+ HAL_GPIO_Init (GPIOA, &GPIO_InitStruct);
242
+
243
+ /* USER CODE BEGIN OPAMP2_MspInit 1 */
244
+
245
+ /* USER CODE END OPAMP2_MspInit 1 */
246
+ }
247
+ else if (hopamp->Instance ==OPAMP3)
248
+ {
249
+ /* USER CODE BEGIN OPAMP3_MspInit 0 */
250
+
251
+ /* USER CODE END OPAMP3_MspInit 0 */
252
+
253
+ __HAL_RCC_GPIOB_CLK_ENABLE ();
254
+ /* *OPAMP3 GPIO Configuration
255
+ PB0 ------> OPAMP3_VINP
256
+ PB1 ------> OPAMP3_VOUT
257
+ PB2 ------> OPAMP3_VINM
258
+ */
259
+ GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2;
260
+ GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
261
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
262
+ HAL_GPIO_Init (GPIOB, &GPIO_InitStruct);
263
+
264
+ /* USER CODE BEGIN OPAMP3_MspInit 1 */
265
+
266
+ /* USER CODE END OPAMP3_MspInit 1 */
267
+ }
268
+
269
+ }
270
+
271
+ /* *
272
+ * @brief OPAMP MSP De-Initialization
273
+ * This function freeze the hardware resources used in this example
274
+ * @param hopamp-> OPAMP handle pointer
275
+ * @retval None
276
+ */
277
+ void HAL_OPAMP_MspDeInit (OPAMP_HandleTypeDef* hopamp)
278
+ {
279
+ if (hopamp->Instance ==OPAMP1)
280
+ {
281
+ /* USER CODE BEGIN OPAMP1_MspDeInit 0 */
282
+
283
+ /* USER CODE END OPAMP1_MspDeInit 0 */
284
+
285
+ /* *OPAMP1 GPIO Configuration
286
+ PA1 ------> OPAMP1_VINP
287
+ PA2 ------> OPAMP1_VOUT
288
+ PA3 ------> OPAMP1_VINM
289
+ */
290
+ HAL_GPIO_DeInit (GPIOA, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3);
291
+
292
+ /* USER CODE BEGIN OPAMP1_MspDeInit 1 */
293
+
294
+ /* USER CODE END OPAMP1_MspDeInit 1 */
295
+ }
296
+ else if (hopamp->Instance ==OPAMP2)
297
+ {
298
+ /* USER CODE BEGIN OPAMP2_MspDeInit 0 */
299
+
300
+ /* USER CODE END OPAMP2_MspDeInit 0 */
301
+
302
+ /* *OPAMP2 GPIO Configuration
303
+ PA5 ------> OPAMP2_VINM
304
+ PA6 ------> OPAMP2_VOUT
305
+ PA7 ------> OPAMP2_VINP
306
+ */
307
+ HAL_GPIO_DeInit (GPIOA, GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7);
308
+
309
+ /* USER CODE BEGIN OPAMP2_MspDeInit 1 */
310
+
311
+ /* USER CODE END OPAMP2_MspDeInit 1 */
312
+ }
313
+ else if (hopamp->Instance ==OPAMP3)
314
+ {
315
+ /* USER CODE BEGIN OPAMP3_MspDeInit 0 */
316
+
317
+ /* USER CODE END OPAMP3_MspDeInit 0 */
318
+
319
+ /* *OPAMP3 GPIO Configuration
320
+ PB0 ------> OPAMP3_VINP
321
+ PB1 ------> OPAMP3_VOUT
322
+ PB2 ------> OPAMP3_VINM
323
+ */
324
+ HAL_GPIO_DeInit (GPIOB, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2);
325
+
326
+ /* USER CODE BEGIN OPAMP3_MspDeInit 1 */
327
+
328
+ /* USER CODE END OPAMP3_MspDeInit 1 */
329
+ }
330
+
331
+ }
332
+
333
+ #endif
0 commit comments