3#if defined(STM32G4xx) && !defined(ARDUINO_B_G431B_ESC1)
5#include "../../../../communication/SimpleFOCDebug.h"
7#define SIMPLEFOC_STM32_DEBUG
11ADC_HandleTypeDef hadc[ADC_COUNT] = {0};
13ADC_HandleTypeDef* _get_adc_handles(){
24int _adc_init_regular(ADC_TypeDef* adc_instance){
25 ADC_InjectionConfTypeDef sConfigInjected;
28 if(adc_instance == ADC1) {
29#ifdef __HAL_RCC_ADC1_CLK_ENABLE
30 __HAL_RCC_ADC1_CLK_ENABLE();
32#ifdef __HAL_RCC_ADC12_CLK_ENABLE
33 __HAL_RCC_ADC12_CLK_ENABLE();
37 else if (adc_instance == ADC2) {
38#ifdef __HAL_RCC_ADC2_CLK_ENABLE
39 __HAL_RCC_ADC2_CLK_ENABLE();
41#ifdef __HAL_RCC_ADC12_CLK_ENABLE
42 __HAL_RCC_ADC12_CLK_ENABLE();
47 else if (adc_instance == ADC3) {
48#ifdef __HAL_RCC_ADC3_CLK_ENABLE
49 __HAL_RCC_ADC3_CLK_ENABLE();
51#ifdef __HAL_RCC_ADC34_CLK_ENABLE
52 __HAL_RCC_ADC34_CLK_ENABLE();
54#if defined(ADC345_COMMON)
55 __HAL_RCC_ADC345_CLK_ENABLE();
60 else if (adc_instance == ADC4) {
61#ifdef __HAL_RCC_ADC4_CLK_ENABLE
62 __HAL_RCC_ADC4_CLK_ENABLE();
64#ifdef __HAL_RCC_ADC34_CLK_ENABLE
65 __HAL_RCC_ADC34_CLK_ENABLE();
67#if defined(ADC345_COMMON)
68 __HAL_RCC_ADC345_CLK_ENABLE();
73 else if (adc_instance == ADC5) {
74#if defined(ADC345_COMMON)
75 __HAL_RCC_ADC345_CLK_ENABLE();
80#ifdef SIMPLEFOC_STM32_DEBUG
81 SIMPLEFOC_DEBUG(
"STM32-CS: ERR: Cannot find a common ADC for the pins!");
86 int adc_num = _adcToIndex(adc_instance);
88#ifdef SIMPLEFOC_STM32_DEBUG
92 hadc[adc_num].Instance = adc_instance;
94 hadc[adc_num].Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
95 hadc[adc_num].Init.Resolution = ADC_RESOLUTION_12B;
96 hadc[adc_num].Init.ScanConvMode = ADC_SCAN_ENABLE;
97 hadc[adc_num].Init.ContinuousConvMode = DISABLE;
98 hadc[adc_num].Init.LowPowerAutoWait = DISABLE;
99 hadc[adc_num].Init.GainCompensation = 0;
100 hadc[adc_num].Init.DiscontinuousConvMode = DISABLE;
101 hadc[adc_num].Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
102 hadc[adc_num].Init.ExternalTrigConv = ADC_SOFTWARE_START;
103 hadc[adc_num].Init.DataAlign = ADC_DATAALIGN_RIGHT;
104 hadc[adc_num].Init.NbrOfConversion = 1;
105 hadc[adc_num].Init.DMAContinuousRequests = DISABLE;
106 hadc[adc_num].Init.EOCSelection = ADC_EOC_SINGLE_CONV;
107 hadc[adc_num].Init.Overrun = ADC_OVR_DATA_PRESERVED;
108 if ( HAL_ADC_Init(&hadc[adc_num]) != HAL_OK){
109#ifdef SIMPLEFOC_STM32_DEBUG
126int _adc_init(Stm32CurrentSenseParams*
cs_params,
const STM32DriverParams* driver_params)
131 auto adc_instance = _findBestADCForInjectedPins(3,
cs_params->pins, hadc);
132 if(adc_instance == NP){
133#ifdef SIMPLEFOC_STM32_DEBUG
138 if( _adc_init_regular(adc_instance) != 0){
141 int adc_num = _adcToIndex(adc_instance);
145 ADC_InjectionConfTypeDef sConfigInjected;
146 sConfigInjected.InjectedNbrOfConversion = 0;
147 for(
int pin_no=0; pin_no<3; pin_no++){
149 sConfigInjected.InjectedNbrOfConversion++;
152 sConfigInjected.InjectedSamplingTime = ADC_SAMPLETIME_2CYCLES_5;
153 sConfigInjected.ExternalTrigInjecConvEdge = ADC_EXTERNALTRIGINJECCONV_EDGE_RISING;
154 sConfigInjected.AutoInjectedConv = DISABLE;
155 sConfigInjected.InjectedSingleDiff = ADC_SINGLE_ENDED;
156 sConfigInjected.InjectedDiscontinuousConvMode = DISABLE;
157 sConfigInjected.InjectedOffsetNumber = ADC_OFFSET_NONE;
158 sConfigInjected.InjectedOffset = 0;
159 sConfigInjected.InjecOversamplingMode = DISABLE;
160 sConfigInjected.QueueInjectedContext = DISABLE;
164 while(driver_params->timers_handle[tim_num] != NP && tim_num < 6){
165 uint32_t trigger_flag = _timerToInjectedTRGO(driver_params->timers_handle[tim_num++]);
166 if(trigger_flag == _TRGO_NOT_AVAILABLE)
continue;
169 if((driver_params->timers_handle[tim_num-1]->Instance->CR2 & LL_TIM_TRGO_ENABLE) ||
170 (driver_params->timers_handle[tim_num-1]->Instance->CR2 & LL_TIM_TRGO_UPDATE))
177 sConfigInjected.ExternalTrigInjecConv = trigger_flag;
180 cs_params->timer_handle = driver_params->timers_handle[tim_num-1];
186#ifdef SIMPLEFOC_STM32_DEBUG
187 SIMPLEFOC_DEBUG(
"STM32-CS: ERR: cannot sync any timer to injected channels!");
191#ifdef SIMPLEFOC_STM32_DEBUG
196 uint8_t channel_no = 0;
197 for(
int i=0; i<3; i++){
201 sConfigInjected.InjectedRank = _getADCInjectedRank(channel_no++);
202 sConfigInjected.InjectedChannel = _getADCChannel(analogInputToPinName(
cs_params->pins[i]), hadc[adc_num].Instance);
203#ifdef SIMPLEFOC_STM32_DEBUG
204 SIMPLEFOC_DEBUG(
"STM32-CS: ADC channel: ", (
int)STM_PIN_CHANNEL(pinmap_function(PinMap_ADC[i].pin, PinMap_ADC)));
206 if (HAL_ADCEx_InjectedConfigChannel(&hadc[adc_num], &sConfigInjected) != HAL_OK){
207 #ifdef SIMPLEFOC_STM32_DEBUG
208 SIMPLEFOC_DEBUG(
"STM32-CS: ERR: cannot init injected channel: ", (
int)STM_PIN_CHANNEL(pinmap_function(PinMap_ADC[i].pin, PinMap_ADC)));
226int _adc_gpio_init(Stm32CurrentSenseParams*
cs_params,
const int pinA,
const int pinB,
const int pinC)
229 const char* port_names[3] = {
"A",
"B",
"C"};
230 for(
int i=0; i<3; i++){
233 if(pinmap_peripheral(analogInputToPinName(pins[i]), PinMap_ADC) == NP){
235#if defined(SIMPLEFOC_STM32_DEBUG) && !defined(SIMPLEFOC_DISABLE_DEBUG)
242 pinmap_pinout(analogInputToPinName(pins[i]), PinMap_ADC);
251 void ADC1_2_IRQHandler(
void)
253 if (hadc[0].Instance != NP)
254 HAL_ADC_IRQHandler(&hadc[0]);
255 if (hadc[1].Instance != NP)
256 HAL_ADC_IRQHandler(&hadc[1]);
259 void ADC3_IRQHandler(
void)
261 if (hadc[2].Instance != NP)
262 HAL_ADC_IRQHandler(&hadc[2]);
267 void ADC4_IRQHandler(
void)
269 if (hadc[3].Instance != NP)
270 HAL_ADC_IRQHandler(&hadc[3]);
275 void ADC5_IRQHandler(
void)
277 if (hadc[4].Instance != NP)
278 HAL_ADC_IRQHandler(&hadc[4]);
#define SIMPLEFOC_DEBUG(msg,...)
static void print(const char *msg)
const int const int const int pinC