5#include "../../../../communication/SimpleFOCDebug.h"
7#define SIMPLEFOC_STM32_DEBUG
10ADC_HandleTypeDef hadc[ADC_COUNT] = {0};
12ADC_HandleTypeDef* _get_adc_handles(){
25int _adc_init_regular(ADC_TypeDef* adc_instance)
31 int adc_num = _adcToIndex(adc_instance);
32 if (hadc[adc_num].Instance != NP) {
37 if(adc_instance == ADC1) {
38#ifdef __HAL_RCC_ADC1_CLK_ENABLE
39 __HAL_RCC_ADC1_CLK_ENABLE();
41#ifdef __HAL_RCC_ADC12_CLK_ENABLE
42 __HAL_RCC_ADC12_CLK_ENABLE();
46 else if (adc_instance == ADC2) {
47#ifdef __HAL_RCC_ADC2_CLK_ENABLE
48 __HAL_RCC_ADC2_CLK_ENABLE();
50#ifdef __HAL_RCC_ADC12_CLK_ENABLE
51 __HAL_RCC_ADC12_CLK_ENABLE();
56 else if (adc_instance == ADC3) {
57#ifdef __HAL_RCC_ADC3_CLK_ENABLE
58 __HAL_RCC_ADC3_CLK_ENABLE();
60#ifdef __HAL_RCC_ADC34_CLK_ENABLE
61 __HAL_RCC_ADC34_CLK_ENABLE();
63#if defined(ADC345_COMMON)
64 __HAL_RCC_ADC345_CLK_ENABLE();
69 else if (adc_instance == ADC4) {
70#ifdef __HAL_RCC_ADC4_CLK_ENABLE
71 __HAL_RCC_ADC4_CLK_ENABLE();
73#ifdef __HAL_RCC_ADC34_CLK_ENABLE
74 __HAL_RCC_ADC34_CLK_ENABLE();
76#if defined(ADC345_COMMON)
77 __HAL_RCC_ADC345_CLK_ENABLE();
82 else if (adc_instance == ADC5) {
83#if defined(ADC345_COMMON)
84 __HAL_RCC_ADC345_CLK_ENABLE();
89#ifdef SIMPLEFOC_STM32_DEBUG
90 SIMPLEFOC_DEBUG(
"STM32-CS: ERR: Cannot find a common ADC for the pins!");
95#ifdef SIMPLEFOC_STM32_DEBUG
99 hadc[adc_num].Instance = adc_instance;
100 hadc[adc_num].Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
101 hadc[adc_num].Init.Resolution = ADC_RESOLUTION_12B;
102 hadc[adc_num].Init.ScanConvMode = ADC_SCAN_ENABLE;
103 hadc[adc_num].Init.ContinuousConvMode = DISABLE;
104 hadc[adc_num].Init.LowPowerAutoWait = DISABLE;
105 hadc[adc_num].Init.DiscontinuousConvMode = DISABLE;
106 hadc[adc_num].Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
107 hadc[adc_num].Init.ExternalTrigConv = ADC_SOFTWARE_START;
108 hadc[adc_num].Init.DataAlign = ADC_DATAALIGN_RIGHT;
109 hadc[adc_num].Init.NbrOfConversion = 1;
110 hadc[adc_num].Init.DMAContinuousRequests = DISABLE;
111 hadc[adc_num].Init.EOCSelection = ADC_EOC_SINGLE_CONV;
112 hadc[adc_num].Init.Overrun = ADC_OVR_DATA_PRESERVED;
113 if ( HAL_ADC_Init(&hadc[adc_num]) != HAL_OK){
114#ifdef SIMPLEFOC_STM32_DEBUG
131int _adc_init(Stm32CurrentSenseParams*
cs_params,
const STM32DriverParams* driver_params)
136 auto adc_instance = _findBestADCForInjectedPins(3,
cs_params->pins, hadc);
137 int adc_num = _adcToIndex(adc_instance);
138 if (hadc[adc_num].Instance != NP) {
139 SIMPLEFOC_DEBUG(
"STM32-CS: ERR: ADC already in use: ADC", adc_num + 1);
142 if(_adc_init_regular(adc_instance) != 0){
146 ADC_InjectionConfTypeDef sConfigInjected;
149 sConfigInjected.InjectedNbrOfConversion =
_isset(
cs_params->pins[2]) ? 3 : 2;
150 sConfigInjected.InjectedSamplingTime = ADC_SAMPLETIME_2CYCLES_5;
151 sConfigInjected.ExternalTrigInjecConvEdge = ADC_EXTERNALTRIGINJECCONV_EDGE_RISING;
152 sConfigInjected.AutoInjectedConv = DISABLE;
153 sConfigInjected.InjectedSingleDiff = ADC_SINGLE_ENDED;
154 sConfigInjected.InjectedDiscontinuousConvMode = DISABLE;
155 sConfigInjected.InjectedOffsetNumber = ADC_OFFSET_NONE;
156 sConfigInjected.InjectedOffset = 0;
157 sConfigInjected.InjecOversamplingMode = DISABLE;
158 sConfigInjected.QueueInjectedContext = DISABLE;
162 while(driver_params->timers_handle[tim_num] != NP && tim_num < 6){
163 uint32_t trigger_flag = _timerToInjectedTRGO(driver_params->timers_handle[tim_num++]);
164 if(trigger_flag == _TRGO_NOT_AVAILABLE)
continue;
167 if((driver_params->timers_handle[tim_num-1]->Instance->CR2 & LL_TIM_TRGO_ENABLE) ||
168 (driver_params->timers_handle[tim_num-1]->Instance->CR2 & LL_TIM_TRGO_UPDATE))
175 sConfigInjected.ExternalTrigInjecConv = trigger_flag;
178 cs_params->timer_handle = driver_params->timers_handle[tim_num-1];
184#ifdef SIMPLEFOC_STM32_DEBUG
185 SIMPLEFOC_DEBUG(
"STM32-CS: ERR: cannot sync any timer to injected channels!");
189#ifdef SIMPLEFOC_STM32_DEBUG
195 uint8_t channel_no = 0;
196 for(
int i=0; i<3; i++){
200 sConfigInjected.InjectedRank = _getADCInjectedRank(channel_no++);
201 sConfigInjected.InjectedChannel = _getADCChannel(analogInputToPinName(
cs_params->pins[i]), hadc[adc_num].Instance);
202#ifdef SIMPLEFOC_STM32_DEBUG
203 SIMPLEFOC_DEBUG(
"STM32-CS: ADC channel: ", (
int)STM_PIN_CHANNEL(pinmap_function(PinMap_ADC[i].pin, PinMap_ADC)));
205 if (HAL_ADCEx_InjectedConfigChannel(&hadc[adc_num], &sConfigInjected) != HAL_OK){
206 #ifdef SIMPLEFOC_STM32_DEBUG
207 SIMPLEFOC_DEBUG(
"STM32-CS: ERR: cannot init injected channel: ", (
int)_getADCChannel(analogInputToPinName(
cs_params->pins[i]), hadc[adc_num].Instance));
225int _adc_gpio_init(Stm32CurrentSenseParams*
cs_params,
const int pinA,
const int pinB,
const int pinC)
228 const char* port_names[3] = {
"A",
"B",
"C"};
229 for(
int i=0; i<3; i++){
232 if(pinmap_peripheral(analogInputToPinName(pins[i]), PinMap_ADC) == NP){
234#if defined(SIMPLEFOC_STM32_DEBUG) && !defined(SIMPLEFOC_DISABLE_DEBUG)
241 pinmap_pinout(analogInputToPinName(pins[i]), PinMap_ADC);
249 void ADC1_2_IRQHandler(
void)
251 if (hadc[0].Instance != NP)
252 HAL_ADC_IRQHandler(&hadc[0]);
253 if (hadc[1].Instance != NP)
254 HAL_ADC_IRQHandler(&hadc[1]);
257 void ADC3_IRQHandler(
void)
259 if (hadc[2].Instance != NP)
260 HAL_ADC_IRQHandler(&hadc[2]);
265 void ADC4_IRQHandler(
void)
267 if (hadc[3].Instance != NP)
268 HAL_ADC_IRQHandler(&hadc[3]);
273 void ADC5_IRQHandler(
void)
275 if (hadc[4].Instance != NP)
276 HAL_ADC_IRQHandler(&hadc[4]);
#define SIMPLEFOC_DEBUG(msg,...)
static void print(const char *msg)
const int const int const int pinC