ST意法半导体
直播中

贾飞小

7年用户 1757经验值
私信 关注
[问答]

请问ADC DMA在stm32H743中不起作用怎么办?

我是 STM32 的新手,想通过 DMA 读取 ADC。
我浏览了一些视频并尝试阅读它但从中受益。
下面是代码请指导我
  • /* Includes ------------------------------------------------------------------*/
  • #include "main.h"
  • #include "stm32h7xx_hal.h"
  • /* USER CODE BEGIN Includes */
  • /* USER CODE END Includes */
  • /* Private variables ---------------------------------------------------------*/
  • ADC_HandleTypeDef hadc1;
  • DMA_HandleTypeDef hdma_adc1;
  • UART_HandleTypeDef huart1;
  • /* USER CODE BEGIN PV */
  • /* Private variables ---------------------------------------------------------*/
  • /* USER CODE END PV */
  • /* Private function prototypes -----------------------------------------------*/
  • void SystemClock_Config(void);
  • static void MX_GPIO_Init(void);
  • static void MX_DMA_Init(void);
  • static void MX_ADC1_Init(void);
  • static void MX_USART1_UART_Init(void);
  • /* USER CODE BEGIN PFP */
  • /* Private function prototypes -----------------------------------------------*/
  • /* USER CODE END PFP */
  • /* USER CODE BEGIN 0 */
  • /* USER CODE END 0 */
  • uint32_t value[3];
  • uint32_t val_2=0;
  • unsigned char data[] = "      rn";
  • 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();
  •   /* USER CODE BEGIN SysInit */
  •   /* USER CODE END SysInit */
  •   /* Initialize all configured peripherals */
  •   MX_GPIO_Init();
  •   MX_DMA_Init();
  •   MX_ADC1_Init();
  •   MX_USART1_UART_Init();
  •   /* USER CODE BEGIN 2 */
  •   /* USER CODE END 2 */
  •   HAL_ADC_Start_DMA(&hadc1,value,3);
  •   /* Infinite loop */
  •   /* USER CODE BEGIN WHILE */
  •   while (1)
  •   {
  •   /* USER CODE END WHILE */
  •                          data[0]=value[0]/10000+48;
  •                                              val_2 = value[0]%10000;
  •                                              data[1]=val_2/1000+48;
  •                                              val_2 = val_2%1000;
  •                                              data[2]=val_2/100+48;
  •                                              val_2 = val_2%100;
  •                                              data[3]=val_2/10+48;
  •                                              data[4] = val_2%10+48;
  •           HAL_UART_Transmit (&huart1, data , sizeof (data), 10);
  •                              data[0]=value[1]/10000+48;
  •                                                        val_2 = value[1]%10000;
  •                                                        data[1]=val_2/1000+48;
  •                                                        val_2 = val_2%1000;
  •                                                        data[2]=val_2/100+48;
  •                                                        val_2 = val_2%100;
  •                                                        data[3]=val_2/10+48;
  •                                                        data[4] = val_2%10+48;
  •                     HAL_UART_Transmit (&huart1, data , sizeof (data), 10);
  •                                        data[0]=value[2]/10000+48;
  •                                                                val_2 = value[2]%10000;
  •                                                                data[1]=val_2/1000+48;
  •                                                                val_2 = val_2%1000;
  •                                                                data[2]=val_2/100+48;
  •                                                                val_2 = val_2%100;
  •                                                                data[3]=val_2/10+48;
  •                                                                data[4] = val_2%10+48;
  •                             HAL_UART_Transmit (&huart1, data , sizeof (data), 10);
  •                             HAL_Delay(1000);
  •   /* USER CODE BEGIN 3 */
  •   }
  •   /* USER CODE END 3 */
  • }
  • /** System Clock Configuration
  • */
  • void SystemClock_Config(void)
  • {
  •   RCC_OscInitTypeDef RCC_OscInitStruct;
  •   RCC_ClkInitTypeDef RCC_ClkInitStruct;
  •   RCC_PeriphCLKInitTypeDef PeriphClkInitStruct;
  •     /**Supply configuration update enable
  •     */
  •   MODIFY_REG(PWR->CR3, PWR_CR3_SCUEN, 0);
  •     /**Configure the main internal regulator output voltage
  •     */
  •   __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
  •   while ((PWR->D3CR & (PWR_D3CR_VOSRDY)) != PWR_D3CR_VOSRDY)
  •   {
  •   }
  •     /**Macro to configure the PLL clock source
  •     */
  •   __HAL_RCC_PLL_PLLSOURCE_CONFIG(RCC_PLLSOURCE_HSI);
  •     /**Initializes the CPU, AHB and APB busses clocks
  •     */
  •   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  •   RCC_OscInitStruct.HSIState = RCC_HSI_DIV1;
  •   RCC_OscInitStruct.HSICalibrationValue = 16;
  •   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  •   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  •   RCC_OscInitStruct.PLL.PLLM = 4;
  •   RCC_OscInitStruct.PLL.PLLN = 10;
  •   RCC_OscInitStruct.PLL.PLLP = 2;
  •   RCC_OscInitStruct.PLL.PLLQ = 2;
  •   RCC_OscInitStruct.PLL.PLLR = 2;
  •   RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_3;
  •   RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOMEDIUM;
  •   RCC_OscInitStruct.PLL.PLLFRACN = 0;
  •   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  •   {
  •     _Error_Handler(__FILE__, __LINE__);
  •   }
  •     /**Initializes the CPU, AHB and APB busses 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_DIV1;
  •   RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV1;
  •   RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV1;
  •   RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV1;
  •   RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV1;
  •   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
  •   {
  •     _Error_Handler(__FILE__, __LINE__);
  •   }
  •   PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_ADC;
  •   PeriphClkInitStruct.PLL2.PLL2M = 4;
  •   PeriphClkInitStruct.PLL2.PLL2N = 14;
  •   PeriphClkInitStruct.PLL2.PLL2P = 16;
  •   PeriphClkInitStruct.PLL2.PLL2Q = 2;
  •   PeriphClkInitStruct.PLL2.PLL2R = 2;
  •   PeriphClkInitStruct.PLL2.PLL2RGE = RCC_PLL2VCIRANGE_3;
  •   PeriphClkInitStruct.PLL2.PLL2VCOSEL = RCC_PLL2VCOWIDE;
  •   PeriphClkInitStruct.PLL2.PLL2FRACN = 0;
  •   PeriphClkInitStruct.Usart16ClockSelection = RCC_USART16CLKSOURCE_D2PCLK2;
  •   PeriphClkInitStruct.AdcClockSelection = RCC_ADCCLKSOURCE_PLL2;
  •   if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
  •   {
  •     _Error_Handler(__FILE__, __LINE__);
  •   }
  •     /**Configure the Systick interrupt time
  •     */
  •   HAL_SYSTICK_Config(SystemCoreClock/1000);
  •     /**Configure the Systick
  •     */
  •   HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
  •   /* SysTick_IRQn interrupt configuration */
  •   HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
  • }
  • /* ADC1 init function */
  • static void MX_ADC1_Init(void)
  • {
  •   ADC_MultiModeTypeDef multimode;
  •   ADC_ChannelConfTypeDef sConfig;
  •     /**Common config
  •     */
  •   hadc1.Instance = ADC1;
  •   hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
  •   hadc1.Init.Resolution = ADC_RESOLUTION_16B;
  •   hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;
  •   hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
  •   hadc1.Init.LowPowerAutoWait = DISABLE;
  •   hadc1.Init.ContinuousConvMode = ENABLE;
  •   hadc1.Init.NbrOfConversion = 3;
  •   hadc1.Init.DiscontinuousConvMode = DISABLE;
  •   hadc1.Init.NbrOfDiscConversion = 1;
  •   hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  •   hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  •   hadc1.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DR;
  •   hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;
  •   hadc1.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE;
  •   hadc1.Init.BoostMode = DISABLE;
  •   hadc1.Init.OversamplingMode = DISABLE;
  •   if (HAL_ADC_Init(&hadc1) != HAL_OK)
  •   {
  •     _Error_Handler(__FILE__, __LINE__);
  •   }
  •     /**Configure the ADC multi-mode
  •     */
  •   multimode.Mode = ADC_MODE_INDEPENDENT;
  •   if (HAL_ADCEx_MultiModeConfigChannel(&hadc1, &multimode) != HAL_OK)
  •   {
  •     _Error_Handler(__FILE__, __LINE__);
  •   }
  •     /**Configure Regular Channel
  •     */
  •   sConfig.Channel = ADC_CHANNEL_6;
  •   sConfig.Rank = 1;
  •   sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
  •   sConfig.SingleDiff = ADC_SINGLE_ENDED;
  •   sConfig.OffsetNumber = ADC_OFFSET_NONE;
  •   sConfig.Offset = 0;
  •   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  •   {
  •     _Error_Handler(__FILE__, __LINE__);
  •   }
  •     /**Configure Regular Channel
  •     */
  •   sConfig.Channel = ADC_CHANNEL_3;
  •   sConfig.Rank = 2;
  •   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  •   {
  •     _Error_Handler(__FILE__, __LINE__);
  •   }
  •     /**Configure Regular Channel
  •     */
  •   sConfig.Channel = ADC_CHANNEL_5;
  •   sConfig.Rank = 3;
  •   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  •   {
  •     _Error_Handler(__FILE__, __LINE__);
  •   }
  • }
  • /* USART1 init function */
  • static void MX_USART1_UART_Init(void)
  • {
  •   huart1.Instance = USART1;
  •   huart1.Init.BaudRate = 115200;
  •   huart1.Init.WordLength = UART_WORDLENGTH_7B;
  •   huart1.Init.StopBits = UART_STOPBITS_1;
  •   huart1.Init.Parity = UART_PARITY_NONE;
  •   huart1.Init.Mode = UART_MODE_TX_RX;
  •   huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  •   huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  •   huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  •   huart1.Init.Prescaler = UART_PRESCALER_DIV1;
  •   huart1.Init.FIFOMode = UART_FIFOMODE_DISABLE;
  •   huart1.Init.TXFIFOThreshold = UART_TXFIFO_THRESHOLD_1_8;
  •   huart1.Init.RXFIFOThreshold = UART_RXFIFO_THRESHOLD_1_8;
  •   huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  •   if (HAL_UART_Init(&huart1) != HAL_OK)
  •   {
  •     _Error_Handler(__FILE__, __LINE__);
  •   }
  • }
  • /**
  •   * Enable DMA controller clock
  •   */
  • static void MX_DMA_Init(void)
  • {
  •   /* DMA controller clock enable */
  •   __HAL_RCC_DMA1_CLK_ENABLE();
  •   /* DMA interrupt init */
  •   /* DMA1_Stream0_IRQn interrupt configuration */
  •   HAL_NVIC_SetPriority(DMA1_Stream0_IRQn, 0, 0);
  •   HAL_NVIC_EnableIRQ(DMA1_Stream0_IRQn);
  • }

回帖(1)

盛珺

2022-12-16 11:21:29
数据数组应该是 uint16_t,而不是 uint32_t。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分