打印
[STM32F3]

在扫描连续模式读取ADC 的 4 个通道,程序就HardFault

[复制链接]
115|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
SocialButterfly|  楼主 | 2025-3-25 23:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 SocialButterfly 于 2025-3-25 23:06 编辑

在STM32F303RE写了一个简单的程序,
将 ADC1设置为扫描连续模式,
以单端、12 位大小读取 IN6、IN7、IN8、IN9。
ADC1 开启了 DMA,使用半字大小、循环缓冲器。
一旦进入 while 循环,处理器就会崩溃,代码卡在 stm32fxx_it.c 文件中的 HardFault_Handler 函数中。


/* USER CODE BEGIN Header *//**  ******************************************************************************  * @file           : main.c  * @brief          : Main program body  ******************************************************************************  * @Attention  *  * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.  * All rights reserved.</center></h2>  *  * This software component is licensed by ST under BSD 3-Clause license,  * the "License"; You may not use this file except in compliance with the  * License. You may obtain a copy of the License at:  *                        opensource.org/licenses/BSD-3-Clause  *  ******************************************************************************  *//* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/#include "main.h" /* Private includes ----------------------------------------------------------*//* USER CODE BEGIN Includes */ /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*//* USER CODE BEGIN PTD */ /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*//* USER CODE BEGIN PD */ /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*//* USER CODE BEGIN PM */ /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ADC_HandleTypeDef hadc1;DMA_HandleTypeDef hdma_adc1; /* USER CODE BEGIN PV */ /* 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);/* USER CODE BEGIN PFP */ /* USER CODE END PFP */ /* Private user code ---------------------------------------------------------*//* USER CODE BEGIN 0 */uint16_t adcValArray[3];uint32_t k = 0;/* USER CODE END 0 */ /**  * @brief  The 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();   /* USER CODE BEGIN SysInit */   /* USER CODE END SysInit */   /* Initialize all configured peripherals */  MX_GPIO_Init();  MX_DMA_Init();  MX_ADC1_Init();  /* USER CODE BEGIN 2 */  HAL_ADC_Start_DMA(&hadc1, (uint32_t *)adcValArray, 8);  /* USER CODE END 2 */   /* Infinite loop */  /* USER CODE BEGIN WHILE */  while (1)  {          k += 1;    /* USER CODE END WHILE */     /* 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};  RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};   /** Initializes the CPU, AHB and APB busses clocks   */  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;  RCC_OscInitStruct.HSIState = RCC_HSI_ON;  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL2;  RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV1;  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)  {    Error_Handler();  }  /** Initializes the CPU, AHB and APB busses clocks   */  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)  {    Error_Handler();  }  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC12;  PeriphClkInit.Adc12ClockSelection = RCC_ADC12PLLCLK_DIV1;  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)  {    Error_Handler();  }} /**  * @brief ADC1 Initialization Function  * @param None  * @retval None  */static 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_12B;  hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;  hadc1.Init.ContinuousConvMode = ENABLE;  hadc1.Init.DiscontinuousConvMode = DISABLE;  hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;  hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;  hadc1.Init.NbrOfConversion = 4;  hadc1.Init.DMAContinuousRequests = ENABLE;  hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;  hadc1.Init.LowPowerAutoWait = DISABLE;  hadc1.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;  if (HAL_ADC_Init(&hadc1) != HAL_OK)  {    Error_Handler();  }  /** Configure the ADC multi-mode   */  multimode.Mode = ADC_MODE_INDEPENDENT;  if (HAL_ADCEx_MultiModeConfigChannel(&hadc1, &multimode) != HAL_OK)  {    Error_Handler();  }  /** Configure Regular Channel   */  sConfig.Channel = ADC_CHANNEL_6;  sConfig.Rank = ADC_REGULAR_RANK_1;  sConfig.SingleDiff = ADC_SINGLE_ENDED;  sConfig.SamplingTime = ADC_SAMPLETIME_19CYCLES_5;  sConfig.OffsetNumber = ADC_OFFSET_NONE;  sConfig.Offset = 0;  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)  {    Error_Handler();  }  /** Configure Regular Channel   */  sConfig.Channel = ADC_CHANNEL_7;  sConfig.Rank = ADC_REGULAR_RANK_2;  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)  {    Error_Handler();  }  /** Configure Regular Channel   */  sConfig.Channel = ADC_CHANNEL_8;  sConfig.Rank = ADC_REGULAR_RANK_3;  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)  {    Error_Handler();  }  /** Configure Regular Channel   */  sConfig.Channel = ADC_CHANNEL_9;  sConfig.Rank = ADC_REGULAR_RANK_4;  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)  {    Error_Handler();  }  /* USER CODE BEGIN ADC1_Init 2 */   /* USER CODE END ADC1_Init 2 */ } static void MX_DMA_Init(void) {   /* DMA controller clock enable */  __HAL_RCC_DMA1_CLK_ENABLE();   /* DMA interrupt init */  /* DMA1_Channel1_IRQn interrupt configuration */  HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0);  HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn); } static void MX_GPIO_Init(void){   /* GPIO Ports Clock Enable */  __HAL_RCC_GPIOC_CLK_ENABLE(); }  
  

使用特权

评论回复
沙发
peterLaw| | 2025-3-26 17:24 | 只看该作者
程序如果能分一下就更好

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

6

帖子

0

粉丝