STM32F103 - 初始化ADC1参数 - 03 - unfinished -unfinished-unfinished

三 、初始化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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值