5#if defined(_STM32_DEF_)
8#include "stm32f1xx_ll_adc.h"
11#include "stm32f7xx_ll_adc.h"
15extern ADC_HandleTypeDef hadc[];
17int _adcToIndex(ADC_TypeDef *AdcHandle){
18 if(AdcHandle == ADC1)
return 0;
20 else if(AdcHandle == ADC2)
return 1;
23 else if(AdcHandle == ADC3)
return 2;
26 else if(AdcHandle == ADC4)
return 3;
29 else if(AdcHandle == ADC5)
return 4;
33int _adcToIndex(ADC_HandleTypeDef *AdcHandle){
34 return _adcToIndex(AdcHandle->Instance);
38ADC_TypeDef* _indexToADC(uint8_t index){
67int _findIndexOfEntry(PinName pin) {
69 PinName pinName = (PinName)(pinName & ~ALTX_MASK);
72 while (PinMap_ADC[i].pin !=NC) {
73 if (pinName == PinMap_ADC[i].pin )
81int _findIndexOfLastEntry(PinName pin) {
83 PinName pinName = (PinName)(pin & ~ALTX_MASK);
86 while (PinMap_ADC[i].pin!=NC) {
87 if ( pinName == (PinMap_ADC[i].pin & ~ALTX_MASK)
88 && pinName != (PinMap_ADC[i+1].pin & ~ALTX_MASK))
94int _findIndexOfFirstEntry(PinName pin) {
96 PinName pinName = (PinName)(pin & ~ALTX_MASK);
98 while (PinMap_ADC[i].pin !=NC) {
99 if (pinName == PinMap_ADC[i].pin )
108int _findIndexOfFirstPinMapADCEntry(
int pin) {
109 PinName pinName = digitalPinToPinName(pin);
111 return _findIndexOfFirstEntry(pinName);
116int _findIndexOfLastPinMapADCEntry(
int pin) {
117 PinName pinName = digitalPinToPinName(pin);
119 return _findIndexOfLastEntry(pinName);
126ADC_TypeDef* _findBestADCForRegularPin(
int pin, ADC_HandleTypeDef adc_handles[]) {
127 PinName pinName = digitalPinToPinName(pin);
128 int index = _findIndexOfFirstPinMapADCEntry(pin);
129 int last_index = _findIndexOfLastPinMapADCEntry(pin);
133 for (
int j = index; j <= last_index; j++) {
134 if (PinMap_ADC[j].pin == NC) {
137 int adcIndex = _adcToIndex((ADC_TypeDef*)PinMap_ADC[j].peripheral);
138 if (adc_handles[adcIndex].Instance != NP) {
140 return (ADC_TypeDef*)PinMap_ADC[j].peripheral;
144 return (ADC_TypeDef*)PinMap_ADC[index].peripheral;
152ADC_TypeDef* _findBestADCForInjectedPins(
int numPins,
int pins[], ADC_HandleTypeDef adc_handles[]) {
155 uint8_t pins_at_adc[ADC_COUNT] = {0};
159 for (
int i = 0; i < numPins; i++) {
160 if(
_isset(pins[i])) no_pins++;
164 for (
int i = 0; i < numPins; i++) {
166 if(!
_isset(pin))
continue;
168 int index = _findIndexOfFirstPinMapADCEntry(pin);
169 int last_index = _findIndexOfLastPinMapADCEntry(pin);
173 for (
int j = index; j <= last_index; j++) {
174 if (PinMap_ADC[j].pin == NC) {
177 int adcIndex = _adcToIndex((ADC_TypeDef*)PinMap_ADC[j].peripheral);
178 pins_at_adc[adcIndex]++;
182#ifndef SIMPLEFOC_DISABLE_DEBUG
183 for (
int i = 0; i < ADC_COUNT; i++) {
184 if(!pins_at_adc[i])
continue;
189 if (adc_handles[i].Instance != NP) {
191 if(!LL_ADC_INJ_IsTriggerSourceSWStart(adc_handles[i].Instance)) {
201 for (
int i = 0; i < ADC_COUNT; i++) {
202 if (adc_handles[i].Instance != NP) {
203 if (!LL_ADC_INJ_IsTriggerSourceSWStart(adc_handles[i].Instance))
206 if (pins_at_adc[i] == no_pins) {
207 return _indexToADC(i);
220uint32_t _getADCChannelFromPinMap(PinName pin)
222 uint32_t function = pinmap_function(pin, PinMap_ADC);
223 uint32_t channel = 0;
224 switch (STM_PIN_CHANNEL(function)) {
227 channel = ADC_CHANNEL_0;
232 channel = ADC_CHANNEL_1;
237 channel = ADC_CHANNEL_2;
242 channel = ADC_CHANNEL_3;
247 channel = ADC_CHANNEL_4;
252 channel = ADC_CHANNEL_5;
257 channel = ADC_CHANNEL_6;
262 channel = ADC_CHANNEL_7;
267 channel = ADC_CHANNEL_8;
272 channel = ADC_CHANNEL_9;
277 channel = ADC_CHANNEL_10;
282 channel = ADC_CHANNEL_11;
287 channel = ADC_CHANNEL_12;
292 channel = ADC_CHANNEL_13;
297 channel = ADC_CHANNEL_14;
302 channel = ADC_CHANNEL_15;
306 channel = ADC_CHANNEL_16;
310 channel = ADC_CHANNEL_17;
314 channel = ADC_CHANNEL_18;
319 channel = ADC_CHANNEL_19;
324 channel = ADC_CHANNEL_20;
329 channel = ADC_CHANNEL_21;
334 channel = ADC_CHANNEL_22;
339 channel = ADC_CHANNEL_23;
343 channel = ADC_CHANNEL_24;
348 channel = ADC_CHANNEL_25;
353 channel = ADC_CHANNEL_26;
357 channel = ADC_CHANNEL_27;
362 channel = ADC_CHANNEL_28;
367 channel = ADC_CHANNEL_29;
372 channel = ADC_CHANNEL_30;
377 channel = ADC_CHANNEL_31;
384 _Error_Handler(
"ADC: Unknown adc channel", (
int)(STM_PIN_CHANNEL(function)));
396uint32_t _getADCChannel(PinName pin, ADC_TypeDef *AdcHandle )
398 if (AdcHandle == NP) {
399 return _getADCChannelFromPinMap(pin);
402 int first_ind = _findIndexOfFirstEntry(pin);
403 int last_ind = _findIndexOfLastEntry(pin);
404 if (first_ind == -1 || last_ind == -1) {
405 _Error_Handler(
"ADC: Pin not found in PinMap_ADC", (
int)pin);
408 uint32_t channel = 0;
409 for (
int i = first_ind; i <= last_ind; i++) {
410 if (PinMap_ADC[i].peripheral == AdcHandle) {
411 channel =_getADCChannelFromPinMap(PinMap_ADC[i].pin);
418uint32_t _getADCInjectedRank(uint8_t ind){
420 #ifdef ADC_INJECTED_RANK_1
422 return ADC_INJECTED_RANK_1;
425#ifdef ADC_INJECTED_RANK_2
427 return ADC_INJECTED_RANK_2;
430#ifdef ADC_INJECTED_RANK_3
432 return ADC_INJECTED_RANK_3;
435#ifdef ADC_INJECTED_RANK_4
437 return ADC_INJECTED_RANK_4;
447uint32_t _initTimerInterruptDownsampling(Stm32CurrentSenseParams*
cs_params, STM32DriverParams* driver_params, Stm32AdcInterruptConfig& adc_interrupt_config){
451 bool next_event_high_side = (
cs_params->timer_handle->Instance->CR1 & TIM_CR1_DIR) == 0;
455 if( IS_TIM_REPETITION_COUNTER_INSTANCE(
cs_params->timer_handle->Instance) ){
461 for(
int i=0; i< 6; i++){
462 if(driver_params->timers_handle[i] == NP)
continue;
463 if(next_event_high_side){
465 driver_params->timers_handle[i]->Instance->CR1 |= TIM_CR1_DIR;
467 driver_params->timers_handle[i]->Instance->CNT = driver_params->timers_handle[i]->Instance->ARR;
470 driver_params->timers_handle[i]->Instance->CR1 &= ~TIM_CR1_DIR;
472 driver_params->timers_handle[i]->Instance->CNT = 0;
477 if(!adc_interrupt_config.use_adc_interrupt){
479 adc_interrupt_config.use_adc_interrupt = 1;
481 adc_interrupt_config.needs_downsample = 1;
483 if(next_event_high_side)
484 adc_interrupt_config.tim_downsample = 0;
486 adc_interrupt_config.tim_downsample = 1;
495uint8_t _handleInjectedConvCpltCallback(ADC_HandleTypeDef *AdcHandle, Stm32AdcInterruptConfig& adc_interrupt_config, uint32_t adc_val[4]) {
496 #ifndef ADC_INJECTED_RANK_1
501 if( adc_interrupt_config.needs_downsample && adc_interrupt_config.tim_downsample++ > 0) {
502 adc_interrupt_config.tim_downsample = 0;
506 adc_val[0]=HAL_ADCEx_InjectedGetValue(AdcHandle, ADC_INJECTED_RANK_1);
507 adc_val[1]=HAL_ADCEx_InjectedGetValue(AdcHandle, ADC_INJECTED_RANK_2);
508 adc_val[2]=HAL_ADCEx_InjectedGetValue(AdcHandle, ADC_INJECTED_RANK_3);
509 adc_val[3]=HAL_ADCEx_InjectedGetValue(AdcHandle, ADC_INJECTED_RANK_4);
518float _readADCInjectedChannelVoltage(
int pin,
void*
cs_params, Stm32AdcInterruptConfig& adc_interrupt_config, uint32_t adc_val[4]) {
519 #ifndef ADC_INJECTED_RANK_1
523 Stm32CurrentSenseParams* cs_p = (Stm32CurrentSenseParams*)
cs_params;
524 uint8_t channel_no = 0;
525 uint8_t adc_index = (uint8_t)_adcToIndex(cs_p->adc_handle);
526 for(
int i=0; i < 3; i++){
527 if( pin == cs_p->pins[i]){
528 if (adc_interrupt_config.use_adc_interrupt){
529 return adc_val[channel_no] * cs_p->adc_voltage_conv;
532 uint32_t channel = _getADCInjectedRank(channel_no);
533 return HAL_ADCEx_InjectedGetValue(cs_p->adc_handle, channel) * cs_p->adc_voltage_conv;
536 if(
_isset(cs_p->pins[i])) channel_no++;
544int last_pin[ADC_COUNT] = {-1,-1,-1,-1,-1};
545uint32_t last_channel[ADC_COUNT] = {0,0,0,0,0};
561float _readRegularADCVoltage(
const int pin){
563 ADC_HandleTypeDef* hadc = _get_adc_handles();
566 for(
int i = 0; i < ADC_COUNT; i++){
567 if(last_pin[i] == pin){
574 ADC_TypeDef* adc_instance = _findBestADCForRegularPin(pin, hadc);
575 if(adc_instance == NP){
576 #ifdef SIMPLEFOC_STM32_DEBUG
581 adc_index = _adcToIndex(adc_instance);
583 ADC_HandleTypeDef adc_handle = hadc[adc_index];
584 if (adc_handle.Instance == NP) {
585 #ifdef SIMPLEFOC_STM32_DEBUG
586 SIMPLEFOC_DEBUG(
"STM32-CS: WARN: ADC not configured, need to configure it: ADC", adc_index+1);
588 if(_adc_init_regular(adc_instance) != 0){
589 #ifdef SIMPLEFOC_STM32_DEBUG
590 SIMPLEFOC_DEBUG(
"STM32-CS: ERR: Failed to initialize ADC for pin ", pin);
597 last_pin[adc_index] = pin;
599 PinName pinName = analogInputToPinName(pin);
600 uint32_t channel = _getADCChannel(pinName, adc_instance);
602 last_channel[adc_index] = channel;
606 ADC_ChannelConfTypeDef sConfig = {0};
607 sConfig.Channel = last_channel[adc_index];
614 sConfig.SamplingTime = 0;
616#ifdef ADC_REGULAR_RANK_1
617 sConfig.Rank = ADC_REGULAR_RANK_1;
621#ifdef ADC_SINGLE_ENDED
622 sConfig.SingleDiff = ADC_SINGLE_ENDED;
624#ifdef ADC_OFFSET_NONE
625 sConfig.OffsetNumber = ADC_OFFSET_NONE;
631 if (HAL_ADC_ConfigChannel(&hadc[adc_index], &sConfig) != HAL_OK) {
632#ifdef SIMPLEFOC_STM32_DEBUG
640 HAL_StatusTypeDef status;
644 status = HAL_ADC_Start(&hadc[adc_index]);
645 if (status == HAL_BUSY) {
647 delayMicroseconds(1);
650 }
while (status == HAL_BUSY && retries > 0);
652 if (status != HAL_OK) {
653#ifdef SIMPLEFOC_STM32_DEBUG
661 if (HAL_ADC_PollForConversion(&hadc[adc_index], 1) == HAL_OK) {
662 uint32_t raw = HAL_ADC_GetValue(&hadc[adc_index]);
663 return raw * 3.3f / 4096.0f;
666#ifdef SIMPLEFOC_STM32_DEBUG
#define SIMPLEFOC_DEBUG(msg,...)
static void print(const char *msg)