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