STM32H750XB_RT-THREAD/29-ADC电压采集/ADC—双重ADC-单通道—交替采集/User/adc/bsp_adc.c

224 lines
6.5 KiB
C
Raw Normal View History

2025-07-21 06:34:29 +00:00
/**
******************************************************************
* @file bsp_adcd.c
* @author fire
* @version V1.1
* @date 2019xx-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"
extern float ADC_vol;
ADC_HandleTypeDef ADC_Handle;
ADC_HandleTypeDef ADC_SLAVE_Handle;
DMA_HandleTypeDef hdma_adc;
ADC_MultiModeTypeDef ADC_multimode;
__IO uint32_t ADC_ConvertedValue = 0;
/**
* @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();
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Pin = RHEOSTAT_ADC_PIN;
/* <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);
}
/**
* @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>ADCʱ<43><CAB1> */
RHEOSTAT_ADC_MASTER_CLK_ENABLE();
/* ʹ<><CAB9>DMAʱ<41><CAB1> */
RHEOSTAT_ADC_DMA_CLK_ENABLE();
/* ʹ<><CAB9>ADC_SLAVEʱ<45><CAB1> */
RHEOSTAT_ADC_SLAVE_CLK_ENABLE();
//ѡ<><D1A1>DMA1<41><31>Stream1
hdma_adc.Instance = RHEOSTAT_ADC_DMA_Base;
//ADC1<43><31>DMA<4D><41><EFBFBD><EFBFBD>
hdma_adc.Init.Request = RHEOSTAT_ADC_DMA_Request;
//<2F><><EFBFBD><EFBFBD><E4B7BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-<2D><><EFBFBD>ڴ<EFBFBD>
hdma_adc.Init.Direction = DMA_PERIPH_TO_MEMORY;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
hdma_adc.Init.PeriphInc = DMA_PINC_DISABLE;
//<2F>ڴ<EFBFBD><DAB4><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
hdma_adc.Init.MemInc = DMA_PINC_DISABLE;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD><DDBF>ȣ<EFBFBD><C8A3><EFBFBD>
hdma_adc.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
//<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>ݿ<EFBFBD><DDBF>ȣ<EFBFBD><C8A3><EFBFBD>
hdma_adc.Init.MemDataAlignment = DMA_PDATAALIGN_WORD;
//DMAѭ<41><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
hdma_adc.Init.Mode = DMA_CIRCULAR;
//DMA<4D><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD><C8BC><EFBFBD><EFBFBD><EFBFBD>
hdma_adc.Init.Priority = DMA_PRIORITY_LOW;
//FIFOģʽ<C4A3>ر<EFBFBD>
hdma_adc.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
//DMA<4D><41>ʼ<EFBFBD><CABC>
HAL_DMA_Init(&hdma_adc);
//hdma_adc<64><63>ADC_Handle.DMA_Handle<6C><65><EFBFBD><EFBFBD>
__HAL_LINKDMA(&ADC_Handle,DMA_Handle,hdma_adc);
ADC_Handle.Instance = RHEOSTAT_ADC_MASTER;
//ADCʱ<43><CAB1>1<EFBFBD><31>Ƶ
ADC_Handle.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
//ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>ģʽ
ADC_Handle.Init.ContinuousConvMode = ENABLE;
//<2F><><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݼĴ<DDBC><C4B4><EFBFBD><EFBFBD><EFBFBD>
ADC_Handle.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_CIRCULAR;
//<2F>رղ<D8B1><D5B2><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>ģʽ
ADC_Handle.Init.DiscontinuousConvMode = DISABLE;
//<2F><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>
ADC_Handle.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ADC_Handle.Init.ExternalTrigConv = ADC_SOFTWARE_START;
//<2F>رյ͹<D5B5><CDB9><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6>ȴ<EFBFBD>
ADC_Handle.Init.LowPowerAutoWait = DISABLE;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4>
ADC_Handle.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
//<2F><>ʹ<EFBFBD>ܹ<EFBFBD><DCB9><EFBFBD><EFBFBD><EFBFBD>ģʽ
ADC_Handle.Init.OversamplingMode = DISABLE;
//<2F>ֱ<EFBFBD><D6B1><EFBFBD>Ϊ<EFBFBD><CEAA>16bit
ADC_Handle.Init.Resolution = ADC_RESOLUTION_16B;
//<2F><>ʹ<EFBFBD>ܶ<EFBFBD>ͨ<EFBFBD><CDA8>ɨ<EFBFBD><C9A8>
ADC_Handle.Init.ScanConvMode = DISABLE;
//<2F><>ʼ<EFBFBD><CABC> ADC_MASTER
HAL_ADC_Init(&ADC_Handle);
//ADCУ׼
HAL_ADCEx_Calibration_Start(&ADC_Handle,ADC_CALIB_OFFSET,ADC_SINGLE_ENDED);
//<2F><>ʼ<EFBFBD><CABC> ADC_SLAVE
ADC_SLAVE_Handle.Instance = RHEOSTAT_ADC_SLAVE;
ADC_SLAVE_Handle.Init = ADC_Handle.Init;
HAL_ADC_Init(&ADC_SLAVE_Handle);
//ADCУ׼
HAL_ADCEx_Calibration_Start(&ADC_SLAVE_Handle,ADC_CALIB_OFFSET,ADC_SINGLE_ENDED);
//ʹ<><CAB9>ͨ<EFBFBD><CDA8>18
ADC_Config.Channel = RHEOSTAT_ADC_MASTER_CHANNEL;
//ת<><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><D1A1><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD>
ADC_Config.OffsetNumber = ADC_OFFSET_NONE;
//<2F><><EFBFBD><EFBFBD>ADC_MASTERͨ<52><CDA8>
HAL_ADC_ConfigChannel(&ADC_Handle, &ADC_Config);
ADC_Config.Channel =RHEOSTAT_ADC_SLAVE_CHANNEL;
//<2F><><EFBFBD><EFBFBD>ADC_SLAVEͨ<45><CDA8>
HAL_ADC_ConfigChannel(&ADC_SLAVE_Handle, &ADC_Config);
//ʹ<><CAB9>ADC1<43><31>2
ADC_Enable(&ADC_Handle);
ADC_Enable(&ADC_SLAVE_Handle);
//<2F><><EFBFBD>ݸ<EFBFBD>ʽ
ADC_multimode.DualModeData = ADC_DUALMODEDATAFORMAT_32_10_BITS;
//˫<><CBAB>ADC<44><43><EFBFBD><EFBFBD>ģʽ
ADC_multimode.Mode = ADC_DUALMODE_INTERL;
//ADC_MASTER<45><52>ADC_SLAVE<56><45><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>3<EFBFBD><33>ADCʱ<43><CAB1>
ADC_multimode.TwoSamplingDelay = ADC_TWOSAMPLINGDELAY_3CYCLES;
//ADC˫<43><CBAB>ģʽ<C4A3><CABD><EFBFBD>ó<EFBFBD>ʼ<EFBFBD><CABC>
HAL_ADCEx_MultiModeConfigChannel(&ADC_Handle, &ADC_multimode);
//ʹ<><CAB9>DMA
HAL_ADCEx_MultiModeStart_DMA(&ADC_Handle, (uint32_t*)&ADC_ConvertedValue, 1);
}
/**
* @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, 1, 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();
//<2F><>ʼADCת<43><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
HAL_ADC_Start(&ADC_Handle);
HAL_ADC_Start(&ADC_SLAVE_Handle);
}
/**
* @brief ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϻص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD><EFBFBD>
* @param AdcHandle : ADC<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD>
*/
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* AdcHandle)
{
/* <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD> */
ADC_ConvertedValue = HAL_ADC_GetValue(AdcHandle);
}
/*********************************************END OF FILE**********************/