ADC

#include "sys.h"
#include "delay.h"
#include "adc.h"


//PF6  ADC3  通道4
void my_adc3_init()
{
    ADC_InitTypeDef  ADC_InitStruct;
    GPIO_InitTypeDef GPIO_InitStruct;
    ADC_CommonInitTypeDef ADC_CommonStruct;
    //1.打开ADC时钏
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3, ENABLE);
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
    
    //配置成模拟模式
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AN;
    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_Init(GPIOF, &GPIO_InitStruct);
    
/*
    配置CR1 CR2寄存器 每个ADC控制器,配置对应的CR1,CR2
    使用 void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct)
    来初始化ADC控制器
    ADC_TypeDef* ADCx  选择对应的控制器
    
    uint32_t ADC_Resolution;  
    功能:配置分辨率
    范围:ADC_Resolution_6b ~12
    寄存器:CR1 24~25位
    
    FunctionalState ADC_ScanConvMode;
    功能:是否开启扫描模式
    范围:ENABLE DISABLE
    
    FunctionalState ADC_ContinuousConvMode;
    功能:是否开启连续模式
    范围:ENABLE DISALBE
    
    uint32_t ADC_ExternalTrigConvEdge;
    功能:触发方式
    范围:ADC_ExternalTrigConvEdge_None
    寄存器:CR2 28~29位
    
    uint32_t ADC_ExternalTrigConv;
    功能:触发源的选择
    范围:……。
    寄存器:CR2 24~27
    
    uint32_t ADC_DataAlign; 
    功能:数据对齐方式
    范围:ADC_DataAlign_Right  ADC_DataAlign_Left
    寄存器CR2  11
    
    uint8_t  ADC_NbrOfConversion; 
    功能:规则通道的选择
    范围:
    寄存器:SQR1寄存器 20-23位
     
*/    
    ADC_InitStruct.ADC_ContinuousConvMode = DISABLE;
    ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;
    //ADC_InitStruct.ADC_ExternalTrigConv = 
    ADC_InitStruct.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
    ADC_InitStruct.ADC_NbrOfConversion = 1; //1个规则通道
    ADC_InitStruct.ADC_Resolution = ADC_Resolution_12b;
    ADC_InitStruct.ADC_ScanConvMode = DISABLE;
    ADC_Init(ADC3, &ADC_InitStruct);
    
/*
void ADC_CommonInit(ADC_CommonInitTypeDef* ADC_CommonInitStruct);
主要配置通用寄存器 CCR,配置该寄存器三个ADC控制器都有效
uint32_t ADC_Mode;
功能:配置ADC模式
范围:ADC_Mode_Independent ……。
寄存器:CCR  0~4

uint32_t ADC_Prescaler;
功能:配置分频系数
范围:ADC_Prescaler_Div2~8  最后分率不能超过36MHz 
寄存器:16~17位

uint32_t ADC_DMAAccessMode;
功能:是否开启DMA模式
范围:ADC_DMAAccessMode_Disabled
寄存器:CCR 14~15位

uint32_t ADC_TwoSamplingDelay;
功能:两次采样延迟时间
范围: ADC_TwoSamplingDelay_5Cycles~20
寄存器CCR 8~11位
*/
    ADC_CommonStruct.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
    ADC_CommonStruct.ADC_Mode = ADC_Mode_Independent;
    ADC_CommonStruct.ADC_Prescaler = ADC_Prescaler_Div4;
    ADC_CommonStruct.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
    ADC_CommonInit(&ADC_CommonStruct);
    
    //使能ADC控制器
    //CR2 0位 开启ADC控制器
    ADC_Cmd(ADC3, ENABLE);
    
    
    //规则通道的配置
    ADC_RegularChannelConfig(ADC3,ADC_Channel_4,1 ,ADC_SampleTime_480Cycles);
/*
void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime)
ADC_TypeDef* ADCx 1~3

通道:ADC_Channel_0~4

Rank:  1

ADC_SampleTime_3Cycles~480   周期
转换周期

*/    
}


//手动开启ADC的转换
uint16_t get_val()
{
/*
    开启转换
    void ADC_SoftwareStartConv(ADC_TypeDef* ADCx);
    */
    
    //ADC_SoftwareStartConvCmd;
    ADC_SoftwareStartConv(ADC3);
    
    //转换ADC值,需要一定时间 
    //delay_ms(10);
/*
    FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t ADC_FLAG);
*/    
    //等待时间必须要有
    while(ADC_GetFlagStatus(ADC3, ADC_FLAG_EOC) == RESET)
    {
        
    }
    
    
    return ADC_GetConversionValue(ADC3);
}
原文地址:https://www.cnblogs.com/baoshulin/p/6217714.html