224 lines
6.5 KiB
C
224 lines
6.5 KiB
C
|
/**
|
|||
|
******************************************************************
|
|||
|
* @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**********************/
|
|||
|
|
|||
|
|