[STM32H7] 在使用STM32 Cube IDE时,无法自定义使用ADC

[复制链接]
165|8
内核558 发表于 2025-9-2 09:02 | 显示全部楼层 |阅读模式

我在使用ADC时遇到了问题,感觉已经尝试了所有方法却没有任何结果。开始怀疑是这块芯片本身存在问题,但在更换之前想先排除人为错误。ADC似乎始终无法存储任何数据,总是返回0以及错误代码1。到目前为止,已经尝试了所有ADC模式,但始终无法获取任何数据。

以下是一些具体情况:

我使用的是STM32H743ZIT6芯片,通过STLINK3和SWD在STM32CubeIDE中进行编程。
我的板上有一个48 MHz的晶体振荡器,已在IDE中配置且似乎工作正常,其他功能均运行良好。
我通过SPI连接了一个显示屏,且显示屏工作正常。
我有一个分压器连接到PA1,可提供2V至3.3V的电压(已验证),并通过DMA启用ADC输入来测量该电压。
当我调用ADC错误检查时,返回错误代码1,表示存在内部错误。
寄存器ADEN已启用,但ADRDY始终无法被设置。每次尝试设置时,都会恢复原状。
在STM32CubeIDE中配置芯片时,ADC时钟多路复用器显示为灰色。当我高亮显示该选项时,仅提示需要启用ADC,而我已经启用了ADC。试过启用多个ADC,但该选项仍然显示为灰色,不确定这是否正常。
附上我的完整代码库,这些代码大部分是由Cube生成的,仅添加了显示屏相关的代码。
#include "main.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <st7789.h>
#include <stdio.h>
#include <string.h>
#include <stdarg.h> //for va_list var arg functions
/* 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;

I2C_HandleTypeDef hi2c1;

SPI_HandleTypeDef hspi1;
SPI_HandleTypeDef hspi2;
DMA_HandleTypeDef hdma_spi1_tx;
DMA_HandleTypeDef hdma_spi2_tx;
DMA_HandleTypeDef hdma_spi2_rx;

UART_HandleTypeDef huart1;
UART_HandleTypeDef huart2;

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MPU_Config(void);
static void MX_GPIO_Init(void);
static void MX_I2C1_Init(void);
static void MX_SPI1_Init(void);
static void MX_SPI2_Init(void);
static void MX_USART1_UART_Init(void);
static void MX_DMA_Init(void);
static void MX_USART2_UART_Init(void);
static void MX_ADC1_Init(void);
/* USER CODE BEGIN PFP */
void myprintf(const char *fmt, ...);
/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
uint32_t value;




/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MPU Configuration--------------------------------------------------------*/
  MPU_Config();

  /* 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_I2C1_Init();
  MX_SPI1_Init();
  MX_SPI2_Init();
  MX_USART1_UART_Init();
  MX_DMA_Init();
  MX_USART2_UART_Init();
  MX_ADC1_Init();
  /* USER CODE BEGIN 2 */

  ST7789_Init();
  ST7789_Fill_Color(WHITE);
  HAL_ADC_Start_DMA(&hadc1,value,3);



  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */



  char buffer[100];
  char buffer2[100];
  uint32_t status;

      /* USER CODE BEGIN WHILE */
      while (1)
      {


    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

              status = HAL_ADC_GetError(&hadc1);
              sprintf(buffer,"Error %X \r\n", status);
              ST7789_WriteString(10, 10, buffer, Font_16x26, GBLUE, RED);
              HAL_UART_Transmit(&huart1, buffer, strlen(buffer), HAL_MAX_DELAY);
              sprintf(buffer2,"Current %X \r\n", value);
              ST7789_WriteString(10, 60, buffer2, Font_16x26, GBLUE, RED);
              HAL_UART_Transmit(&huart1, buffer2, strlen(buffer2), HAL_MAX_DELAY);

              HAL_Delay(1000);

              ST7789_Fill_Color(WHITE);
      }
  /* USER CODE END 3 */
}


七毛钱 发表于 2025-9-2 14:53 | 显示全部楼层
可能ADC时钟没有正确配置。
duo点 发表于 2025-9-2 15:53 | 显示全部楼层
STM32H7的ADC时钟需要由PER或ADC专用时钟提供,如果时钟配置错误,ADC可能无法正常工作。
onlycook 发表于 2025-9-2 19:54 | 显示全部楼层
在CubeMX中,ADC时钟多路复用器显示为灰色可能是因为时钟源未正确选择。
七毛钱 发表于 2025-9-2 19:55 | 显示全部楼层
ADC可能未正确初始化!
内政奇才 发表于 2025-9-2 18:55 | 显示全部楼层
DMA可能未正确配置,导致ADC数据无法正确传输到内存。
海滨消消 发表于 2025-9-2 20:56 | 显示全部楼层
检查PA1的硬件连接是否正确。
豌豆爹 发表于 2025-9-2 21:56 | 显示全部楼层
检查ADC时钟配置,修正ADC初始化代码。
麻花油条 发表于 2025-9-2 22:57 | 显示全部楼层
不使用DMA试试,如果这种方式能读取数据,说明DMA配置有问题。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

41

主题

41

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部