ADC_HandleTypeDef hadc1; ADC_HandleTypeDef hadc2; ADC_HandleTypeDef hadc3; DMA_HandleTypeDef hdma_adc1; DMA_HandleTypeDef hdma_adc2; DMA_HandleTypeDef hdma_adc3; / ADC1 init function / void MX_ADC1_Init(void) { ADC_MultiModeTypeDef multimode = {0}; ADC_ChannelConfTypeDef sConfig = {0}; GPIO_InitTypeDef GPIO_InitStruct = {0}; HAL_RCC_DMA1_CLK_ENABLE(); / ADC1 clock enable / HAL_RCC_ADC12_CLK_ENABLE(); HAL_RCC_GPIOA_CLK_ENABLE(); HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); /*ADC1 GPIO Configuration PA5 ------> ADC1_INP19 PA7 ------> ADC1_INP7 PC5 ------> ADC1_INP8 PB0 ------> ADC1_INP9 / HAL_GPIO_DeInit(GPIOA, GPIO_PIN_5|GPIO_PIN_7); HAL_GPIO_DeInit(GPIOC, GPIO_PIN_5); HAL_GPIO_DeInit(GPIOB, GPIO_PIN_0); GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_5; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_0; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); / ADC1 DMA Init / / ADC1 Init / hdma_adc1.Instance = DMA1_Stream0; / 使用的DMA1 Stream0 / hdma_adc1.Init.Request = DMA_REQUEST_ADC1; / 请求类型采用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_HALFWORD; / 外设数据传输位宽选择半字,即16bit / hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; / 存储器数据传输位宽选择半字,即16bit / hdma_adc1.Init.Mode = DMA_CIRCULAR; / 循环模式 / hdma_adc1.Init.Priority = DMA_PRIORITY_HIGH; / 优先级低 / hdma_adc1.Init.FIFOMode = DMA_FIFOMODE_DISABLE; / 禁止FIFO/ hdma_adc1.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; / 禁止FIFO此位不起作用,用于设置阀值 / hdma_adc1.Init.MemBurst = DMA_MBURST_SINGLE; / 禁止FIFO此位不起作用,用于存储器突发 / hdma_adc1.Init.PeriphBurst = DMA_PBURST_SINGLE; / 禁止FIFO此位不起作用,用于外设突发 / if (HAL_DMA_DeInit(&hdma_adc1) != HAL_OK) { Error_Handler(); } if (HAL_DMA_Init(&hdma_adc1) != HAL_OK) { Error_Handler(); } __HAL_LINKDMA(&hadc1,DMA_Handle,hdma_adc1); / DMA interrupt init / / DMA1_Stream0_IRQn interrupt configuration / HAL_NVIC_SetPriority(DMA1_Stream0_IRQn, 4, 1); HAL_NVIC_EnableIRQ(DMA1_Stream0_IRQn); /* Common config / hadc1.Instance = ADC1; hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV2; /! ADC2_INP18 PA6 ------> ADC2_INP3 PC4 ------> ADC2_INP4 PB1 ------> ADC2_INP5 / HAL_GPIO_DeInit(GPIOA, GPIO_PIN_4|GPIO_PIN_6); HAL_GPIO_DeInit(GPIOC, GPIO_PIN_4); HAL_GPIO_DeInit(GPIOB, GPIO_PIN_1); GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_6; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_4; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_1; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); / ADC2 DMA Init / / ADC2 Init / hdma_adc2.Instance = DMA1_Stream1; / 使用的DMA1 Stream1 / hdma_adc2.Init.Request = DMA_REQUEST_ADC2; / 请求类型采用DMA_REQUEST_ADC2 / hdma_adc2.Init.Direction = DMA_PERIPH_TO_MEMORY; / 传输方向是从存储器到外设 / hdma_adc2.Init.PeriphInc = DMA_PINC_DISABLE; / 外设地址自增禁止 / hdma_adc2.Init.MemInc = DMA_MINC_ENABLE; / 存储器地址自增使能 / hdma_adc2.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; / 外设数据传输位宽选择半字,即16bit / hdma_adc2.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; / 存储器数据传输位宽选择半字,即16bit / hdma_adc2.Init.Mode = DMA_CIRCULAR; / 循环模式 / hdma_adc2.Init.Priority = DMA_PRIORITY_MEDIUM; / 优先级低 / hdma_adc2.Init.FIFOMode = DMA_FIFOMODE_DISABLE; / 禁止FIFO/ hdma_adc2.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; / 禁止FIFO此位不起作用,用于设置阀值 / hdma_adc2.Init.MemBurst = DMA_MBURST_SINGLE; / 禁止FIFO此位不起作用,用于存储器突发 / hdma_adc2.Init.PeriphBurst = DMA_PBURST_SINGLE; / 禁止FIFO此位不起作用,用于外设突发 / if (HAL_DMA_DeInit(&hdma_adc2) != HAL_OK) { Error_Handler(); } if (HAL_DMA_Init(&hdma_adc2) != HAL_OK) { Error_Handler(); } __HAL_LINKDMA(&hadc2,DMA_Handle,hdma_adc2); / DMA1_Stream1_IRQn interrupt configuration / HAL_NVIC_SetPriority(DMA1_Stream1_IRQn, 4, 3); HAL_NVIC_EnableIRQ(DMA1_Stream1_IRQn); /* Common config / hadc2.Instance = ADC2; hadc2.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV2; /! ADC3_INP10 PC3_C ------> ADC3_INP1 / HAL_GPIO_DeInit(GPIOC, GPIO_PIN_0); GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); HAL_SYSCFG_AnalogSwitchConfig(SYSCFG_SWITCH_PC3, SYSCFG_SWITCH_PC3_OPEN); / ADC3 DMA Init / / ADC3 Init / hdma_adc3.Instance = BDMA_Channel0; / 使用的BDMA_Channel0/ hdma_adc3.Init.Request = BDMA_REQUEST_ADC3; / 请求类型采用BDMA_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; / 外设数据传输位宽选择半字,即16bit / hdma_adc3.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; / 存储器数据传输位宽选择半字,即16bit / hdma_adc3.Init.Mode = DMA_CIRCULAR; / 循环模式 / hdma_adc3.Init.Priority = DMA_PRIORITY_LOW; / 优先级低 / hdma_adc3.Init.FIFOMode = DMA_FIFOMODE_DISABLE; / 禁止FIFO/ hdma_adc3.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; / 禁止FIFO此位不起作用,用于设置阀值 / hdma_adc3.Init.MemBurst = DMA_MBURST_SINGLE; / 禁止FIFO此位不起作用,用于存储器突发 / hdma_adc3.Init.PeriphBurst = DMA_PBURST_SINGLE; / 禁止FIFO此位不起作用,用于外设突发 / if (HAL_DMA_DeInit(&hdma_adc3) != HAL_OK) { Error_Handler(); } if (HAL_DMA_Init(&hdma_adc3) != HAL_OK) { Error_Handler(); } __HAL_LINKDMA(&hadc3,DMA_Handle,hdma_adc3); / BDMA_Channel0_IRQn interrupt configuration / HAL_NVIC_SetPriority(BDMA_Channel0_IRQn, 4, 7); HAL_NVIC_EnableIRQ(BDMA_Channel0_IRQn); /* Common config / hadc3.Instance = ADC3; hadc3.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV2; /*!Instance == ADC1)
|
你咨询问题尽量把芯片型号说清楚,从你的代码来看感觉是H7系列的。你说ADC3回调函数不能正常工作,ADC3能否正常工作,能否进入相关DMA传输中断,这些请检查确认下。 |
STM32L431进入STOP1模式后ADC产生多余功耗
关于STM32F4的ADC测量不准确
STM32G0B1adc+dma采样数据错位
STM32G474 ADC无法正常启动转换
ADC每次开始采样直流电压时,会出现尖峰波形?
ADC各个通道转换
STM32F405使用LL库建立SPI通讯报溢出是什么原因?
cubemx安装HAL库时要账号登录,点击注册,显示错误,ST官网点击注册也是显示错误,请问是什么问题?
STM32F373的PGA(SDADC前置)怎么校正
STM32CubeMx中的ADC和模拟输入