1 步骤:
1.1 初始化ADC
ADC_HandleTypeDef hadc1; void MX_ADC1_Init(void) { ADC_ChannelConfTypeDef sConfig = {0}; hadc1.Instance = ADC1; hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; //四分频,ADCCLK=PCLK2/4 hadc1.Init.Resolution = ADC_RESOLUTION_12B; //12位模式 hadc1.Init.ScanConvMode = DISABLE; //非扫描模式 hadc1.Init.ContinuousConvMode = DISABLE; //非连续转换模式 hadc1.Init.DiscontinuousConvMode = DISABLE; //禁止不连续采样模式 hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; //使用软件触发 hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; //软件触发 hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; //右对齐(推荐) hadc1.Init.NbrOfConversion = 1; //1个转换在规则序列中 hadc1.Init.DMAContinuousRequests = DISABLE; //关闭DMA请求 hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV; //关闭EOC中断 HAL_ADC_Init(&hadc1); //初始化
1.2 配置ADC底层驱动,配置引脚
void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle) { GPIO_InitTypeDef GPIO_InitStruct = {0}; if(adcHandle->Instance==ADC1) //判断是否为ADC1 { __HAL_RCC_ADC1_CLK_ENABLE(); //使能ADC1时钟 __HAL_RCC_GPIOA_CLK_ENABLE(); //开启GPIOA时钟 GPIO_InitStruct.Pin = GPIO_PIN_5; //PA5 GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; //模拟 GPIO_InitStruct.Pull = GPIO_NOPULL; //不带上下拉 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); HAL_NVIC_SetPriority(ADC_IRQn, 0, 0); HAL_NVIC_EnableIRQ(ADC_IRQn); } }
1.3 配置通道,读取ADC值
uint16_t Get_ADC(uint32_t channel) { ADC_ChannelConfTypeDef sConfig = {0}; sConfig.Channel = channel; //通道,取值范围ADC_CHANNEL_0~ADC_CHANNEL_16 sConfig.Rank = 1; //第1个序列,序列1 sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES; //采样时间 HAL_ADC_ConfigChannel(&hadc1, &sConfig); HAL_ADC_Start(&hadc1); //开启ADC HAL_ADC_PollForConversion(&hadc1,10); //轮询转换 return (uint16_t)HAL_ADC_GetValue(&hadc1); //返回最近转换结果 }
1.4 在main函数中调用Get_ADC(uint32_t channel)
2 使用CubeMX配置