ADC同步采样问题。
在使用CubeMX生成一个ADC采样程序。芯片为STM32H743.使用的开发板为野火的繁星电机开发板。ADC1和ADC2实现同步,全部是通道2.
ADC3 为独立实现。ADC3的通道为0-10.
但是生成程序,并添加一下使能代码之后, ADC_Enable(&hadc1);
HAL_ADCEx_MultiModeStart_DMA(&hadc1,(uint32_t*)&ADC12_CoveredValue,1);
HAL_ADC_Start(&hadc1);
ADC_Enable(&hadc2);
HAL_ADC_Start(&hadc2);
ADC_Enable(&hadc3);
HAL_ADC_Start_DMA(&hadc3,(uint32_t *)ADC3_Value,11);
HAL_ADC_Start(&hadc3);
进行程序运行之后发现主函数里面的while部分未运行,且进入硬件错误判断函数voidError_Handler(void)。该程序在未添加ADC12的采样时,ADC3是能够正常的采样以及对采样结果赋值的且不会进入硬件判断错误函数。当前问题为实现仿真之后,程序ADC123,DR寄存器均存在值,DMA序列计数也均正常,传递目标数组和变量也存在值。但是不能够实现下列程序中的循环赋值,用以实现状态机的状态选择。
下列为代码:主函数:
/* USER CODE END Header *//* Includes ------------------------------------------------------------------*/#include "main.h"#include "adc.h"#include "dma.h"#include "tim.h"#include "gpio.h"
/* Private includes ----------------------------------------------------------*//* USER CODE BEGIN Includes */
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*//* USER CODE BEGIN PTD */__IO uint32_t ADC12_CoveredValue;__IOuint16_t ADC3_Value;/* USER CODE END PTD */
/* Private define ------------------------------------------------------------*//* USER CODE BEGIN PD */
float i_0, u_0; //由ADC12同步采集,电机两侧的电流和电压float i_sw1, i_sw2; //开关电路的电流float T1, T2, T3, T4; //两路热头温度T1,T2; 水冷温度 T3; 机壳温度 T4float P; //压力float I_m, U_m; //母线电流,母线电压float V_bat, T5; //芯片供电电压,芯片温度
/* USER CODE END PD */
/* Private macro -------------------------------------------------------------*//* USER CODE BEGIN PM */
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/void SystemClock_Config(void);void PeriphCommonClock_Config(void);/* USER CODE BEGIN PFP */
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*//* USER CODE BEGIN 0 */
/* USER CODE END 0 */
/*** @briefThe application entry point.* @retval int*/int main(void){/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */SystemClock_Config();
/* Configure the peripherals common clocks */PeriphCommonClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */MX_GPIO_Init();MX_TIM1_Init();MX_DMA_Init();MX_ADC3_Init();MX_ADC1_Init();MX_ADC2_Init();/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop *//* USER CODE BEGIN WHILE */while(1){ /* USER CODE END WHILE */i_0 = (float)((uint16_t) ADC12_CoveredValue )/65536*(float)3.3 ;u_0 = (float)((uint16_t)(( ADC12_CoveredValue & 0xFFFF0000) >> 16))/65536*(float)3.3 ;i_sw1 = (float)ADC3_Value/65536*(float)3.3 ;i_sw2 = (float)ADC3_Value/65535*(float)3.3 ;T1 =(float) ADC3_Value/65536*(float)3.3 ;T2 = (float) ADC3_Value/65536*(float)3.3 ;T3 = (float) ADC3_Value/65536*(float)3.3 ;T4 = (float) ADC3_Value/65536*(float)3.3;P = (float) ADC3_Value/65536*(float)3.3;I_m = (float) ADC3_Value/65536*(float)3.3;U_m = (float) ADC3_Value/65536*(float)3.3;V_bat = (float) ADC3_Value/65536*(float)3.3;T5 = (float) ADC3_Value/65536*(float)3.3; /* USER CODE BEGIN 3 */}/* USER CODE END 3 */}
/*** @brief System Clock Configuration* @retval None*/void SystemClock_Config(void){RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
/** Supply configuration update enable*/HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);
/** Configure the main internal regulator output voltage*/__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}
__HAL_RCC_SYSCFG_CLK_ENABLE();__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0);
while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}
/** Macro to configure the PLL clock source*/__HAL_RCC_PLL_PLLSOURCE_CONFIG(RCC_PLLSOURCE_HSE);
/** Initializes the RCC Oscillators according to the specified parameters* in the RCC_OscInitTypeDef structure.*/RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLM = 5;RCC_OscInitStruct.PLL.PLLN = 160;RCC_OscInitStruct.PLL.PLLP = 2;RCC_OscInitStruct.PLL.PLLQ = 2;RCC_OscInitStruct.PLL.PLLR = 2;RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2;RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;RCC_OscInitStruct.PLL.PLLFRACN = 394;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){ Error_Handler();}
/** Initializes the CPU, AHB and APB buses clocks*/RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2 |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK){ Error_Handler();}}
/*** @brief Peripherals Common Clock Configuration* @retval None*/void PeriphCommonClock_Config(void){RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
/** Initializes the peripherals clock*/PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_ADC;PeriphClkInitStruct.PLL2.PLL2M = 25;PeriphClkInitStruct.PLL2.PLL2N = 504;PeriphClkInitStruct.PLL2.PLL2P = 7;PeriphClkInitStruct.PLL2.PLL2Q = 2;PeriphClkInitStruct.PLL2.PLL2R = 2;PeriphClkInitStruct.PLL2.PLL2RGE = RCC_PLL2VCIRANGE_0;PeriphClkInitStruct.PLL2.PLL2VCOSEL = RCC_PLL2VCOWIDE;PeriphClkInitStruct.PLL2.PLL2FRACN = 0;PeriphClkInitStruct.AdcClockSelection = RCC_ADCCLKSOURCE_PLL2;if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK){ Error_Handler();}}
/* USER CODE BEGIN 4 */
/* USER CODE END 4 */
/*** @briefThis function is executed in case of error occurrence.* @retval None*/void Error_Handler(void){/* USER CODE BEGIN Error_Handler_Debug *//* User can add his own implementation to report the HAL error return state */__disable_irq();while (1){}/* USER CODE END Error_Handler_Debug */}
#ifdefUSE_FULL_ASSERT/*** @briefReports the name of the source file and the source line number* where the assert_param error has occurred.* @paramfile: pointer to the source file name* @paramline: assert_param error line source number* @retval None*/void assert_failed(uint8_t *file, uint32_t line){/* USER CODE BEGIN 6 *//* User can add his own implementation to report the file name and line number, ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) *//* USER CODE END 6 */}#endif /* USE_FULL_ASSERT */
adc.c
/* USER CODE BEGIN Header *//********************************************************************************* @file adc.c* @brief This file provides code for the configuration* of the ADC instances.******************************************************************************* @attention** Copyright (c) 2022 STMicroelectronics.* All rights reserved.** This software is licensed under terms that can be found in the LICENSE file* in the root directory of this software component.* If no LICENSE file comes with this software, it is provided AS-IS.********************************************************************************//* USER CODE END Header *//* Includes ------------------------------------------------------------------*/#include "adc.h"
/* USER CODE BEGIN 0 */externuint32_t ADC12_CoveredValue;
externuint16_t ADC3_Value;
extern float i_0, u_0; //由ADC12同步采集,电机两侧的电流和电压extern float i_sw1, i_sw2; //开关电路的电流extern float T1, T2, T3, T4; //两路热头温度T1,T2; 水冷温度 T3; 机壳温度 T4extern float P; //压力extern float I_m, U_m; //母线电流,母线电压extern float V_bat, T5; //芯片供电电压,芯片温度/* USER CODE END 0 */
ADC_HandleTypeDef hadc1;ADC_HandleTypeDef hadc2;ADC_HandleTypeDef hadc3;DMA_HandleTypeDef hdma_adc1;DMA_HandleTypeDef hdma_adc3;
/* ADC1 init function */void MX_ADC1_Init(void){
/* USER CODE BEGIN ADC1_Init 0 */
/* USER CODE END ADC1_Init 0 */
ADC_MultiModeTypeDef multimode = {0};ADC_ChannelConfTypeDef sConfig = {0};
/* USER CODE BEGIN ADC1_Init 1 */
/* USER CODE END ADC1_Init 1 */
/** Common config*/hadc1.Instance = ADC1;hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;hadc1.Init.Resolution = ADC_RESOLUTION_16B;hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;hadc1.Init.LowPowerAutoWait = DISABLE;hadc1.Init.ContinuousConvMode = ENABLE;hadc1.Init.NbrOfConversion = 1;hadc1.Init.DiscontinuousConvMode = DISABLE;hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;hadc1.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_CIRCULAR;hadc1.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;hadc1.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE;hadc1.Init.OversamplingMode = DISABLE;if (HAL_ADC_Init(&hadc1) != HAL_OK){ Error_Handler();}
/** Configure the ADC multi-mode*/multimode.Mode = ADC_DUALMODE_REGSIMULT;multimode.DualModeData = ADC_DUALMODEDATAFORMAT_32_10_BITS;multimode.TwoSamplingDelay = ADC_TWOSAMPLINGDELAY_1CYCLE;if (HAL_ADCEx_MultiModeConfigChannel(&hadc1, &multimode) != HAL_OK){ Error_Handler();}
/** Configure Regular Channel*/sConfig.Channel = ADC_CHANNEL_2;sConfig.Rank = ADC_REGULAR_RANK_1;sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;sConfig.SingleDiff = ADC_SINGLE_ENDED;sConfig.OffsetNumber = ADC_OFFSET_NONE;sConfig.Offset = 0;sConfig.OffsetSignedSaturation = DISABLE;if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK){ Error_Handler();}/* USER CODE BEGIN ADC1_Init 2 */ HAL_ADCEx_Calibration_Start(&hadc1,ADC_CALIB_OFFSET,ADC_SINGLE_ENDED); //ADC1校准
ADC_Enable(&hadc1);
HAL_ADCEx_MultiModeStart_DMA(&hadc1,(uint32_t*)&ADC12_CoveredValue,1);
HAL_ADC_Start(&hadc1);
/* USER CODE END ADC1_Init 2 */
}/* ADC2 init function */void MX_ADC2_Init(void){
/* USER CODE BEGIN ADC2_Init 0 */
/* USER CODE END ADC2_Init 0 */
ADC_ChannelConfTypeDef sConfig = {0};
/* USER CODE BEGIN ADC2_Init 1 */
/* USER CODE END ADC2_Init 1 */
/** Common config*/hadc2.Instance = ADC2;hadc2.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;hadc2.Init.Resolution = ADC_RESOLUTION_16B;hadc2.Init.ScanConvMode = ADC_SCAN_DISABLE;hadc2.Init.EOCSelection = ADC_EOC_SINGLE_CONV;hadc2.Init.LowPowerAutoWait = DISABLE;hadc2.Init.ContinuousConvMode = ENABLE;hadc2.Init.NbrOfConversion = 1;hadc2.Init.DiscontinuousConvMode = DISABLE;hadc2.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DR;hadc2.Init.Overrun = ADC_OVR_DATA_PRESERVED;hadc2.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE;hadc2.Init.OversamplingMode = DISABLE;
if (HAL_ADC_Init(&hadc2) != HAL_OK){ Error_Handler();}
/** Configure Regular Channel*/sConfig.Channel = ADC_CHANNEL_2;sConfig.Rank = ADC_REGULAR_RANK_1;sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;sConfig.SingleDiff = ADC_SINGLE_ENDED;sConfig.OffsetNumber = ADC_OFFSET_NONE;sConfig.Offset = 0;sConfig.OffsetSignedSaturation = DISABLE;// HAL_ADC_ConfigChannel(&hadc2, &sConfig);
if (HAL_ADC_ConfigChannel(&hadc2, &sConfig) != HAL_OK){ Error_Handler();}/* USER CODE BEGIN ADC2_Init 2 */ HAL_ADCEx_Calibration_Start(&hadc2,ADC_CALIB_OFFSET,ADC_SINGLE_ENDED);//校准ADC2
ADC_Enable(&hadc2);//
// HAL_ADCEx_MultiModeStart_DMA(&hadc2,(uint32_t*)&ADC12_CoveredValue,1); HAL_ADC_Start(&hadc2);
/* USER CODE END ADC2_Init 2 */
}/* ADC3 init function */void MX_ADC3_Init(void){
/* USER CODE BEGIN ADC3_Init 0 */
/* USER CODE END ADC3_Init 0 */
ADC_ChannelConfTypeDef sConfig = {0};
/* USER CODE BEGIN ADC3_Init 1 */
/* USER CODE END ADC3_Init 1 */
/** Common config*/hadc3.Instance = ADC3;hadc3.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;hadc3.Init.Resolution = ADC_RESOLUTION_16B;hadc3.Init.ScanConvMode = ADC_SCAN_ENABLE;hadc3.Init.EOCSelection = ADC_EOC_SEQ_CONV;hadc3.Init.LowPowerAutoWait = DISABLE;hadc3.Init.ContinuousConvMode = ENABLE;hadc3.Init.NbrOfConversion = 11;hadc3.Init.DiscontinuousConvMode = DISABLE;hadc3.Init.ExternalTrigConv = ADC_SOFTWARE_START;hadc3.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;hadc3.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_CIRCULAR;hadc3.Init.Overrun = ADC_OVR_DATA_PRESERVED;hadc3.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE;hadc3.Init.OversamplingMode = DISABLE;if (HAL_ADC_Init(&hadc3) != HAL_OK){ Error_Handler();}
/** Configure Regular Channel*/sConfig.Channel = ADC_CHANNEL_0;sConfig.Rank = ADC_REGULAR_RANK_1;sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5;sConfig.SingleDiff = ADC_SINGLE_ENDED;sConfig.OffsetNumber = ADC_OFFSET_NONE;sConfig.Offset = 0;sConfig.OffsetSignedSaturation = DISABLE;if (HAL_ADC_ConfigChannel(&hadc3, &sConfig) != HAL_OK){ Error_Handler();}
/** Configure Regular Channel*/sConfig.Channel = ADC_CHANNEL_1;sConfig.Rank = ADC_REGULAR_RANK_2;if (HAL_ADC_ConfigChannel(&hadc3, &sConfig) != HAL_OK){ Error_Handler();}
/** Configure Regular Channel*/sConfig.Channel = ADC_CHANNEL_2;sConfig.Rank = ADC_REGULAR_RANK_3;if (HAL_ADC_ConfigChannel(&hadc3, &sConfig) != HAL_OK){ Error_Handler();}
/** Configure Regular Channel*/sConfig.Channel = ADC_CHANNEL_3;sConfig.Rank = ADC_REGULAR_RANK_4;if (HAL_ADC_ConfigChannel(&hadc3, &sConfig) != HAL_OK){ Error_Handler();}
/** Configure Regular Channel*/sConfig.Channel = ADC_CHANNEL_4;sConfig.Rank = ADC_REGULAR_RANK_5;if (HAL_ADC_ConfigChannel(&hadc3, &sConfig) != HAL_OK){ Error_Handler();}
/** Configure Regular Channel*/sConfig.Channel = ADC_CHANNEL_5;sConfig.Rank = ADC_REGULAR_RANK_6;if (HAL_ADC_ConfigChannel(&hadc3, &sConfig) != HAL_OK){ Error_Handler();}
/** Configure Regular Channel*/sConfig.Channel = ADC_CHANNEL_6;sConfig.Rank = ADC_REGULAR_RANK_7;if (HAL_ADC_ConfigChannel(&hadc3, &sConfig) != HAL_OK){ Error_Handler();}
/** Configure Regular Channel*/sConfig.Channel = ADC_CHANNEL_7;sConfig.Rank = ADC_REGULAR_RANK_8;if (HAL_ADC_ConfigChannel(&hadc3, &sConfig) != HAL_OK){ Error_Handler();}
/** Configure Regular Channel*/sConfig.Channel = ADC_CHANNEL_8;sConfig.Rank = ADC_REGULAR_RANK_9;if (HAL_ADC_ConfigChannel(&hadc3, &sConfig) != HAL_OK){ Error_Handler();}
/** Configure Regular Channel*/sConfig.Channel = ADC_CHANNEL_VBAT;sConfig.Rank = ADC_REGULAR_RANK_10;if (HAL_ADC_ConfigChannel(&hadc3, &sConfig) != HAL_OK){ Error_Handler();}
/** Configure Regular Channel*/sConfig.Channel = ADC_CHANNEL_TEMPSENSOR;sConfig.Rank = ADC_REGULAR_RANK_11;if (HAL_ADC_ConfigChannel(&hadc3, &sConfig) != HAL_OK){ Error_Handler();}/* USER CODE BEGIN ADC3_Init 2 */
HAL_ADCEx_Calibration_Start(&hadc3,ADC_CALIB_OFFSET,ADC_SINGLE_ENDED);
//ADC_TempSensorVrefintCmd(ENABLE);//使能温度传感器
ADC_Enable(&hadc3);
HAL_ADC_Start_DMA(&hadc3,(uint32_t *)ADC3_Value,11);
HAL_ADC_Start(&hadc3);/* USER CODE END ADC3_Init 2 */
}
static uint32_t HAL_RCC_ADC12_CLK_ENABLED=0;
void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle){
GPIO_InitTypeDef GPIO_InitStruct = {0};if(adcHandle->Instance==ADC1){/* USER CODE BEGIN ADC1_MspInit 0 */
/* USER CODE END ADC1_MspInit 0 */ /* ADC1 clock enable */ HAL_RCC_ADC12_CLK_ENABLED++; if(HAL_RCC_ADC12_CLK_ENABLED==1){ __HAL_RCC_ADC12_CLK_ENABLE(); }
__HAL_RCC_GPIOF_CLK_ENABLE(); /**ADC1 GPIO Configuration PF11 ------> ADC1_INP2 */ GPIO_InitStruct.Pin = GPIO_PIN_11; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);
/* ADC1 DMA Init */ /* ADC1 Init */ hdma_adc1.Instance = DMA1_Stream0; hdma_adc1.Init.Request = DMA_REQUEST_ADC1; hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY; hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE; hdma_adc1.Init.MemInc = DMA_MINC_ENABLE; hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD; hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_WORD; hdma_adc1.Init.Mode = DMA_CIRCULAR; hdma_adc1.Init.Priority = DMA_PRIORITY_LOW; hdma_adc1.Init.FIFOMode = DMA_FIFOMODE_DISABLE; if (HAL_DMA_Init(&hdma_adc1) != HAL_OK) { Error_Handler(); }
__HAL_LINKDMA(adcHandle,DMA_Handle,hdma_adc1);
/* USER CODE BEGIN ADC1_MspInit 1 */
/* USER CODE END ADC1_MspInit 1 */}else if(adcHandle->Instance==ADC2){/* USER CODE BEGIN ADC2_MspInit 0 */
/* USER CODE END ADC2_MspInit 0 */ /* ADC2 clock enable */ HAL_RCC_ADC12_CLK_ENABLED++; if(HAL_RCC_ADC12_CLK_ENABLED==1){ __HAL_RCC_ADC12_CLK_ENABLE(); }
__HAL_RCC_GPIOF_CLK_ENABLE(); /**ADC2 GPIO Configuration PF13 ------> ADC2_INP2 */ GPIO_InitStruct.Pin = GPIO_PIN_13; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);
/* USER CODE BEGIN ADC2_MspInit 1 */
/* USER CODE END ADC2_MspInit 1 */}else if(adcHandle->Instance==ADC3){/* USER CODE BEGIN ADC3_MspInit 0 */
/* USER CODE END ADC3_MspInit 0 */ /* ADC3 clock enable */ __HAL_RCC_ADC3_CLK_ENABLE();
__HAL_RCC_GPIOF_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); /**ADC3 GPIO Configuration PF3 ------> ADC3_INP5 PF5 ------> ADC3_INP4 PF6 ------> ADC3_INP8 PF7 ------> ADC3_INP3 PF8 ------> ADC3_INP7 PF9 ------> ADC3_INP2 PF10 ------> ADC3_INP6 PC2_C ------> ADC3_INP0 PC3_C ------> ADC3_INP1 */ GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7 |GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);
HAL_SYSCFG_AnalogSwitchConfig(SYSCFG_SWITCH_PC2, SYSCFG_SWITCH_PC2_OPEN);
HAL_SYSCFG_AnalogSwitchConfig(SYSCFG_SWITCH_PC3, SYSCFG_SWITCH_PC3_OPEN);
/* ADC3 DMA Init */ /* ADC3 Init */ hdma_adc3.Instance = DMA1_Stream2; hdma_adc3.Init.Request = DMA_REQUEST_ADC3; hdma_adc3.Init.Direction = DMA_PERIPH_TO_MEMORY; hdma_adc3.Init.PeriphInc = DMA_PINC_DISABLE; hdma_adc3.Init.MemInc = DMA_MINC_ENABLE; hdma_adc3.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; hdma_adc3.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; hdma_adc3.Init.Mode = DMA_CIRCULAR; hdma_adc3.Init.Priority = DMA_PRIORITY_VERY_HIGH; hdma_adc3.Init.FIFOMode = DMA_FIFOMODE_DISABLE; if (HAL_DMA_Init(&hdma_adc3) != HAL_OK) { Error_Handler(); }
__HAL_LINKDMA(adcHandle,DMA_Handle,hdma_adc3);
/* USER CODE BEGIN ADC3_MspInit 1 */
/* USER CODE END ADC3_MspInit 1 */}}
void HAL_ADC_MspDeInit(ADC_HandleTypeDef* adcHandle){
if(adcHandle->Instance==ADC1){/* USER CODE BEGIN ADC1_MspDeInit 0 */
/* USER CODE END ADC1_MspDeInit 0 */ /* Peripheral clock disable */ HAL_RCC_ADC12_CLK_ENABLED--; if(HAL_RCC_ADC12_CLK_ENABLED==0){ __HAL_RCC_ADC12_CLK_DISABLE(); }
/**ADC1 GPIO Configuration PF11 ------> ADC1_INP2 */ HAL_GPIO_DeInit(GPIOF, GPIO_PIN_11);
/* ADC1 DMA DeInit */ HAL_DMA_DeInit(adcHandle->DMA_Handle);/* USER CODE BEGIN ADC1_MspDeInit 1 */
/* USER CODE END ADC1_MspDeInit 1 */}else if(adcHandle->Instance==ADC2){/* USER CODE BEGIN ADC2_MspDeInit 0 */
/* USER CODE END ADC2_MspDeInit 0 */ /* Peripheral clock disable */ HAL_RCC_ADC12_CLK_ENABLED--; if(HAL_RCC_ADC12_CLK_ENABLED==0){ __HAL_RCC_ADC12_CLK_DISABLE(); }
/**ADC2 GPIO Configuration PF13 ------> ADC2_INP2 */ HAL_GPIO_DeInit(GPIOF, GPIO_PIN_13);
/* USER CODE BEGIN ADC2_MspDeInit 1 */
/* USER CODE END ADC2_MspDeInit 1 */}else if(adcHandle->Instance==ADC3){/* USER CODE BEGIN ADC3_MspDeInit 0 */
/* USER CODE END ADC3_MspDeInit 0 */ /* Peripheral clock disable */ __HAL_RCC_ADC3_CLK_DISABLE();
/**ADC3 GPIO Configuration PF3 ------> ADC3_INP5 PF5 ------> ADC3_INP4 PF6 ------> ADC3_INP8 PF7 ------> ADC3_INP3 PF8 ------> ADC3_INP7 PF9 ------> ADC3_INP2 PF10 ------> ADC3_INP6 PC2_C ------> ADC3_INP0 PC3_C ------> ADC3_INP1 */ HAL_GPIO_DeInit(GPIOF, GPIO_PIN_3|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7 |GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10);
/* ADC3 DMA DeInit */ HAL_DMA_DeInit(adcHandle->DMA_Handle);/* USER CODE BEGIN ADC3_MspDeInit 1 */
/* USER CODE END ADC3_MspDeInit 1 */}}
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
同步指什么 硬件上是如何连接的呢 能成功初始化吗 三者会不会互相干扰了啊 会不会是因为采样速度过快导致的呢 相应的引脚进行初始化了没有 三个通道采样都打到同步吗 同步是什么意思? 代码好长啊
页:
[1]