。
三 、初始化ADC1参数,设置ADC1的工作模式以及规则序列的相关信息
ADC_InitTypeDef ADC_InitStructure;
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC工作模式:ADC1和ADC2工作在独立模式
ADC_InitStructure.ADC_ScanConvMode = DISABLE; //模数转换工作在单通道模式
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //模数转换工作在单次转换模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //转换由软件而不是外部触发启动
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 1; //顺序进行规则转换的ADC通道的数目
ADC_Init(ADC1, &ADC_InitStructure); //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器
-
参数初始化
void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct)
{
uint32_t tmpreg1 = 0;
uint8_t tmpreg2 = 0;
assert_param(IS_ADC_ALL_PERIPH(ADCx)); /* 检查参数 */
assert_param(IS_ADC_MODE(ADC_InitStruct->ADC_Mode));
assert_param(IS_FUNCTIONAL_STATE(ADC_InitStruct->ADC_ScanConvMode));
assert_param(IS_FUNCTIONAL_STATE(ADC_InitStruct->ADC_ContinuousConvMode));
assert_param(IS_ADC_EXT_TRIG(ADC_InitStruct->ADC_ExternalTrigConv));
assert_param(IS_ADC_DATA_ALIGN(ADC_InitStruct->ADC_DataAlign));
assert_param(IS_ADC_REGULAR_LENGTH(ADC_InitStruct->ADC_NbrOfChannel));
tmpreg1 = ADCx->CR1;
tmpreg1 &= CR1_CLEAR_Mask; //清除双重方式 ,清除扫描位
tmpreg1 |= (uint32_t)(ADC_InitStruct->ADC_Mode | ((uint32_t)ADC_InitStruct->ADC_ScanConvMode << 8));
ADCx->CR1 = tmpreg1;
tmpreg1 = ADCx->CR2;
tmpreg1 &= CR2_CLEAR_Mask;
tmpreg1 |= (uint32_t)(ADC_InitStruct->ADC_DataAlign | ADC_InitStruct->ADC_ExternalTrigConv |
((uint32_t)ADC_InitStruct->ADC_ContinuousConvMode << 1));
ADCx->CR2 = tmpreg1;
tmpreg1 = ADCx->SQR1;
tmpreg1 &= SQR1_CLEAR_Mask;
tmpreg2 |= (uint8_t) (ADC_InitStruct->ADC_NbrOfChannel - (uint8_t)1);
tmpreg1 |= (uint32_t)tmpreg2 << 20;
ADCx->SQR1 = tmpreg1;
}
-
结构体
typedef struct
{
uint32_t ADC_Mode; / * !<将ADC配置为独立运行或双模式。*/
FunctionalState ADC_ScanConvMode; / * <转换是否在扫描(多通道)或单(单通道)模式。启用或禁用*/
FunctionalState ADC_ContinuousConvMode; / * <指定转换是否在连续、单一模式。启用或禁用。* /
uint32_t ADC_ExternalTrigConv; / * <启动模拟的外部触发器到数字转换的常规渠道。*/
uint32_t ADC_DataAlign; / * !<ADC数据是左对齐还是右对齐。 */
uint8_t ADC_NbrOfChannel; / * !<指定将使用序列器转换的adc通道数量。范围必须在1到16之间。*/
}ADC_InitTypeDef;
typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState;
typedef struct
{
__IO uint32_t SR;
__IO uint32_t CR1;
__IO uint32_t CR2;
__IO uint32_t SMPR1;
__IO uint32_t SMPR2;
__IO uint32_t JOFR1;
__IO uint32_t JOFR2;
__IO uint32_t JOFR3;
__IO uint32_t JOFR4;
__IO uint32_t HTR;
__IO uint32_t LTR;
__IO uint32_t SQR1;
__IO uint32_t SQR2;
__IO uint32_t SQR3;
__IO uint32_t JSQR;
__IO uint32_t JDR1;
__IO uint32_t JDR2;
__IO uint32_t JDR3;
__IO uint32_t JDR4;
__IO uint32_t DR;
} ADC_TypeDef;
-
参数设定
#define SQR1_CLEAR_Mask ((uint32_t)0xFF0FFFFF)
ADC1
#define ADC1 ((ADC_TypeDef *) ADC1_BASE)
ADC_Mode_Independent
#define ADC_Mode_Independent ((uint32_t)0x00000000)
DISABLE
typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState;
ADC_ExternalTrigConv_None
#define ADC_ExternalTrigConv_None ((uint32_t)0x000E0000) /*!< For ADC1, ADC2 and ADC3 */
ADC_DataAlign_Right
#define ADC_DataAlign_Right ((uint32_t)0x00000000)
。
。
。