STM32H750XB_RT-THREAD/29-ADC电压采集/ADC—独立模式-多通道—DMA/User/adc/bsp_adc.c

203 lines
6.0 KiB
C
Raw Normal View History

2025-07-21 06:34:29 +00:00
/**
******************************************************************
* @file bsp_adcd.c
* @author fire
* @version V1.1
* @date 2018-xx-xx
* @brief adcӦ<EFBFBD>ú<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD>
******************************************************************
* @attention
*
* ʵ<EFBFBD><EFBFBD>ƽ̨:Ұ<EFBFBD><EFBFBD> STM32H750<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD>˾ :http://www.embedfire.com
* <EFBFBD><EFBFBD>̳ :http://www.firebbs.cn
* <EFBFBD>Ա<EFBFBD> :https://fire-stm32.taobao.com
*
******************************************************************
*/
#include "./adc/bsp_adc.h"
#include "stm32h7xx.h"
extern float ADC_vol;
ADC_HandleTypeDef ADC1_Handle;
DMA_HandleTypeDef hdma_adc1;
__IO uint16_t ADC_ConvertedValue[4];
/**
* @brief ADC<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ú<EFBFBD><EFBFBD><EFBFBD>
* @param <EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD>
*/
static void ADC_GPIO_Mode_Config(void)
{
/* <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>GPIO_InitTypeDef<65><66><EFBFBD>͵Ľṹ<C4BD><E1B9B9> */
GPIO_InitTypeDef GPIO_InitStruct;
/* ʹ<><CAB9>ADC<44><43><EFBFBD>ŵ<EFBFBD>ʱ<EFBFBD><CAB1> */
RHEOSTAT_ADC_GPIO_CLK_ENABLE();
//ͨ<><CDA8>18<31><38><EFBFBD><EFBFBD>IO<49><4F>ʼ<EFBFBD><CABC>
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Pin = RHEOSTAT_ADC_PIN1;
/* <20><><EFBFBD><EFBFBD>Ϊģ<CEAA><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBA3AC><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
HAL_GPIO_Init(RHEOSTAT_ADC_GPIO_PORT, &GPIO_InitStruct);
//ͨ<><CDA8>19<31><39><EFBFBD><EFBFBD>IO<49><4F>ʼ<EFBFBD><CABC>
GPIO_InitStruct.Pin = RHEOSTAT_ADC_PIN2;
HAL_GPIO_Init(RHEOSTAT_ADC_GPIO_PORT, &GPIO_InitStruct);
//ͨ<><CDA8>3<EFBFBD><33><EFBFBD><EFBFBD>IO<49><4F>ʼ<EFBFBD><CABC>
GPIO_InitStruct.Pin = RHEOSTAT_ADC_PIN3;
HAL_GPIO_Init(RHEOSTAT_ADC_GPIO_PORT, &GPIO_InitStruct);
//ͨ<><CDA8>7<EFBFBD><37><EFBFBD><EFBFBD>IO<49><4F>ʼ<EFBFBD><CABC>
GPIO_InitStruct.Pin = RHEOSTAT_ADC_PIN4;
HAL_GPIO_Init(RHEOSTAT_ADC_GPIO_PORT, &GPIO_InitStruct);
}
/**
* @brief ADC<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD><EFBFBD><EFBFBD>ú<EFBFBD><EFBFBD><EFBFBD>
* @param <EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD>
*/
static void ADC_Mode_Config(void)
{
ADC_ChannelConfTypeDef ADC_Config;
RCC_PeriphCLKInitTypeDef RCC_PeriphClkInit;
/* <20><><EFBFBD><EFBFBD>ADC3ʱ<33><CAB1>Դ */
/* HSE Frequency(Hz) = 25000000 */
/* PLL_M = 5 */
/* PLL_N = 160 */
/* PLL_P = 25 */
/* PLL_Q = 2 */
/* PLL_R = 2 */
/* ADC_ker_clk = 32000000 */
RCC_PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;
RCC_PeriphClkInit.PLL2.PLL2FRACN = 0;
RCC_PeriphClkInit.PLL2.PLL2M = 5;
RCC_PeriphClkInit.PLL2.PLL2N = 160;
RCC_PeriphClkInit.PLL2.PLL2P = 25;
RCC_PeriphClkInit.PLL2.PLL2Q = 2;
RCC_PeriphClkInit.PLL2.PLL2R = 2;
RCC_PeriphClkInit.PLL2.PLL2RGE = RCC_PLL2VCIRANGE_2;
RCC_PeriphClkInit.PLL2.PLL2VCOSEL = RCC_PLL2VCOWIDE;
RCC_PeriphClkInit.AdcClockSelection = RCC_ADCCLKSOURCE_PLL2;
HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphClkInit);
/* ʹ<><CAB9>ADC1<43><31><32><CAB1> */
RHEOSTAT_ADC1_CLK_ENABLE();
__HAL_RCC_DMA1_CLK_ENABLE();
hdma_adc1.Instance = DMA1_Stream1;
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_HALFWORD;
hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
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)
{}
__HAL_LINKDMA(&ADC1_Handle,DMA_Handle,hdma_adc1);
ADC1_Handle.Instance = RHEOSTAT_ADC1;
//ADCʱ<43><CAB1>1<EFBFBD><31>Ƶ
ADC1_Handle.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV2;
//ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>ģʽ
ADC1_Handle.Init.ContinuousConvMode = ENABLE;
//<2F><><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݼĴ<DDBC><C4B4><EFBFBD><EFBFBD><EFBFBD>
ADC1_Handle.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_CIRCULAR;
//<2F>رղ<D8B1><D5B2><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>ģʽ
ADC1_Handle.Init.DiscontinuousConvMode = DISABLE;
//<2F><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>
ADC1_Handle.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ADC1_Handle.Init.ExternalTrigConv = ADC_SOFTWARE_START;
//<2F>رյ͹<D5B5><CDB9><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6>ȴ<EFBFBD>
ADC1_Handle.Init.LowPowerAutoWait = DISABLE;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4>
ADC1_Handle.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
//<2F><>ʹ<EFBFBD>ܹ<EFBFBD><DCB9><EFBFBD><EFBFBD><EFBFBD>ģʽ
ADC1_Handle.Init.OversamplingMode = DISABLE;
//<2F>ֱ<EFBFBD><D6B1><EFBFBD>Ϊ<EFBFBD><CEAA>16bit
ADC1_Handle.Init.Resolution = ADC_RESOLUTION_16B;
//<2F><>ʹ<EFBFBD>ܶ<EFBFBD>ͨ<EFBFBD><CDA8>ɨ<EFBFBD><C9A8>
ADC1_Handle.Init.ScanConvMode = ENABLE;
//ɨ<><C9A8><EFBFBD>ĸ<EFBFBD>ͨ<EFBFBD><CDA8>
ADC1_Handle.Init.NbrOfConversion = 4;
//<2F><>ʼ<EFBFBD><CABC> ADC1
HAL_ADC_Init(&ADC1_Handle);
//ADCУ׼
HAL_ADCEx_Calibration_Start(&ADC1_Handle,ADC_CALIB_OFFSET,ADC_SINGLE_ENDED);
//ʹ<><CAB9>ͨ<EFBFBD><CDA8>18
ADC_Config.Channel = RHEOSTAT_ADC_CHANNEL1;
//ת<><D7AA>˳<EFBFBD><CBB3>Ϊ1
ADC_Config.Rank = ADC_REGULAR_RANK_1;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ64.5<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ADC_Config.SamplingTime = ADC_SAMPLETIME_64CYCLES_5;
//<2F><>ʹ<EFBFBD>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĺ<EFBFBD><C4B9><EFBFBD>
ADC_Config.SingleDiff = ADC_SINGLE_ENDED ;
//<2F><><EFBFBD><EFBFBD>ADCͨ<43><CDA8>
HAL_ADC_ConfigChannel(&ADC1_Handle, &ADC_Config);
//ʹ<><CAB9>ͨ<EFBFBD><CDA8>19
ADC_Config.Channel = RHEOSTAT_ADC_CHANNEL2;
//ת<><D7AA>˳<EFBFBD><CBB3>Ϊ2
ADC_Config.Rank = ADC_REGULAR_RANK_2;
//<2F><><EFBFBD><EFBFBD>ADCͨ<43><CDA8>
HAL_ADC_ConfigChannel(&ADC1_Handle, &ADC_Config);
//ʹ<><CAB9>ͨ<EFBFBD><CDA8>3
ADC_Config.Channel = RHEOSTAT_ADC_CHANNEL3;
//ת<><D7AA>˳<EFBFBD><CBB3>Ϊ1
ADC_Config.Rank = ADC_REGULAR_RANK_3;
//<2F><><EFBFBD><EFBFBD>ADCͨ<43><CDA8>
HAL_ADC_ConfigChannel(&ADC1_Handle, &ADC_Config);
//ʹ<><CAB9>ͨ<EFBFBD><CDA8>7
ADC_Config.Channel = RHEOSTAT_ADC_CHANNEL4;
//ת<><D7AA>˳<EFBFBD><CBB3>Ϊ1
ADC_Config.Rank = ADC_REGULAR_RANK_4;
//<2F><><EFBFBD><EFBFBD>ADCͨ<43><CDA8>
HAL_ADC_ConfigChannel(&ADC1_Handle, &ADC_Config);
//ʹ<><CAB9>ADC1
ADC_Enable(&ADC1_Handle);
HAL_ADC_Start_DMA(&ADC1_Handle, (uint32_t *)ADC_ConvertedValue, 4);
}
/**
* @brief ADC<EFBFBD>ж<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ú<EFBFBD><EFBFBD><EFBFBD>
* @param <EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD>
*/
void Rheostat_ADC_NVIC_Config(void)
{
HAL_NVIC_SetPriority(Rheostat_ADC12_IRQ, 0, 0);
HAL_NVIC_EnableIRQ(Rheostat_ADC12_IRQ);
}
/**
* @brief ADC<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param <EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD>
*/
void ADC_Init(void)
{
ADC_GPIO_Mode_Config();
ADC_Mode_Config();
HAL_ADC_Start(&ADC1_Handle);
}
/*********************************************END OF FILE**********************/