ADC实现过程

// 复位指定的ADC外设  
// ADCx: 指向ADC外设的指针(如ADC1, ADC2等)  
void ADC_DeInit(ADC_TypeDef* ADCx);  
  
// 根据ADC_InitTypeDef结构体中的参数初始化指定的ADC外设  
// ADCx: 指向ADC外设的指针  
// ADC_InitStruct: 指向ADC_InitTypeDef结构体的指针,包含ADC的配置信息  
void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);  
  
// 将ADC_InitTypeDef结构体的参数重置为默认值  
// ADC_InitStruct: 指向ADC_InitTypeDef结构体的指针  
void ADC_StructInit(ADC_InitTypeDef* ADC_InitStruct);  
  
// 使能或失能指定的ADC外设  
// ADCx: 指向ADC外设的指针  
// NewState: 新的状态(ENABLE 或 DISABLE)  
void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState);  
  
// 使能或失能指定的ADC外设的DMA请求  
// ADCx: 指向ADC外设的指针  
// NewState: 新的状态(ENABLE 或 DISABLE)  
void ADC_DMACmd(ADC_TypeDef* ADCx, FunctionalState NewState);  
  
// 使能或失能指定的ADC外设的中断  
// ADCx: 指向ADC外设的指针  
// ADC_IT: 要配置的中断(如ADC_IT_EOC等)  
// NewState: 新的状态(ENABLE 或 DISABLE)  
void ADC_ITConfig(ADC_TypeDef* ADCx, uint16_t ADC_IT, FunctionalState NewState);  
  
// 重置ADC的校准寄存器  
// ADCx: 指向ADC外设的指针  
void ADC_ResetCalibration(ADC_TypeDef* ADCx);  
  
// 获取ADC的校准复位状态  
// ADCx: 指向ADC外设的指针  
// 返回值: 重置校准状态(SET 或 RESET)  
FlagStatus ADC_GetResetCalibrationStatus(ADC_TypeDef* ADCx);  
  
// 开始ADC的校准  
// ADCx: 指向ADC外设的指针  
void ADC_StartCalibration(ADC_TypeDef* ADCx);  
  
// 获取ADC的校准状态  
// ADCx: 指向ADC外设的指针  
// 返回值: 校准状态(SET 或 RESET)  
FlagStatus ADC_GetCalibrationStatus(ADC_TypeDef* ADCx);  
  
// 使能或失能ADC的软件启动转换  
// ADCx: 指向ADC外设的指针  
// NewState: 新的状态(ENABLE 或 DISABLE)  
void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);  
  
// 获取ADC的软件启动转换状态  
// ADCx: 指向ADC外设的指针  
// 返回值: 软件启动转换状态(SET 或 RESET)  
FlagStatus ADC_GetSoftwareStartConvStatus(ADC_TypeDef* ADCx);  
  
// 配置ADC的间断模式通道计数  
// ADCx: 指向ADC外设的指针  
// Number: 通道计数  
void ADC_DiscModeChannelCountConfig(ADC_TypeDef* ADCx, uint8_t Number);  
  
// 使能或失能ADC的间断模式  
// ADCx: 指向ADC外设的指针  
// NewState: 新的状态(ENABLE 或 DISABLE)  
void ADC_DiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
// 配置ADC的规则通道  
// ADCx: 指向ADC外设的指针  
// ADC_Channel: 要配置的ADC通道  
// Rank: 规则通道的排序号(优先级)  
// ADC_SampleTime: 采样时间  
void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime);  
  
// 使能或失能ADC的外部触发转换  
// ADCx: 指向ADC外设的指针  
// NewState: 新的状态(ENABLE 或 DISABLE)  
void ADC_ExternalTrigConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);  
  
// 获取ADC规则通道的转换值  
// ADCx: 指向ADC外设的指针  
// 返回值: 转换后的ADC值(12位或16位,具体取决于ADC配置)  
uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx);  
  
// 获取ADC双模式(Dual Mode)的转换值(对于支持双ADC模式的STM32)  
// 返回值: 转换后的ADC值(针对两个ADC)  
uint32_t ADC_GetDualModeConversionValue(void);  
  
// 使能或失能ADC的自动注入转换  
// ADCx: 指向ADC外设的指针  
// NewState: 新的状态(ENABLE 或 DISABLE)  
void ADC_AutoInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);  
  
// 使能或失能ADC的注入通道间断模式  
// ADCx: 指向ADC外设的指针  
// NewState: 新的状态(ENABLE 或 DISABLE)  
void ADC_InjectedDiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState);  
  
// 配置ADC的注入通道外部触发转换  
// ADCx: 指向ADC外设的指针  
// ADC_ExternalTrigInjecConv: 外部触发源和触发极性  
void ADC_ExternalTrigInjectedConvConfig(ADC_TypeDef* ADCx, uint32_t ADC_ExternalTrigInjecConv);  
  
// 使能或失能ADC的注入通道外部触发转换  
// ADCx: 指向ADC外设的指针  
// NewState: 新的状态(ENABLE 或 DISABLE)  
void ADC_ExternalTrigInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);  
  
// 使能或失能ADC的注入通道软件触发转换  
// ADCx: 指向ADC外设的指针  
// NewState: 新的状态(ENABLE 或 DISABLE)  
void ADC_SoftwareStartInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);  
  
// 获取ADC注入通道的软件触发转换状态  
// ADCx: 指向ADC外设的指针  
// 返回值: 软件触发转换状态(SET 或 RESET)  
FlagStatus ADC_GetSoftwareStartInjectedConvCmdStatus(ADC_TypeDef* ADCx);  
  
// 配置ADC的注入通道  
// ADCx: 指向ADC外设的指针  
// ADC_Channel: 要配置的ADC注入通道  
// Rank: 注入通道的排序号(优先级)  
// ADC_SampleTime: 采样时间  
void ADC_InjectedChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime);
// 配置ADC注入通道的序列长度  
// ADCx: 指向ADC外设的指针  
// Length: 注入序列的长度(即注入通道的数量)  
void ADC_InjectedSequencerLengthConfig(ADC_TypeDef* ADCx, uint8_t Length);  
  
// 设置ADC注入通道的偏移量  
// ADCx: 指向ADC外设的指针  
// ADC_InjectedChannel: 注入通道号  
// Offset: 注入通道的偏移量  
void ADC_SetInjectedOffset(ADC_TypeDef* ADCx, uint8_t ADC_InjectedChannel, uint16_t Offset);  
  
// 获取ADC注入通道的转换值  
// ADCx: 指向ADC外设的指针  
// ADC_InjectedChannel: 注入通道号  
// 返回值: 注入通道的转换值  
uint16_t ADC_GetInjectedConversionValue(ADC_TypeDef* ADCx, uint8_t ADC_InjectedChannel);  
  
// 使能或失能ADC的模拟看门狗  
// ADCx: 指向ADC外设的指针  
// ADC_AnalogWatchdog: 模拟看门狗的配置(可以是单个通道、所有通道等)  
void ADC_AnalogWatchdogCmd(ADC_TypeDef* ADCx, uint32_t ADC_AnalogWatchdog);  
  
// 配置ADC模拟看门狗的高低阈值  
// ADCx: 指向ADC外设的指针  
// HighThreshold: 模拟看门狗的高阈值  
// LowThreshold: 模拟看门狗的低阈值  
void ADC_AnalogWatchdogThresholdsConfig(ADC_TypeDef* ADCx, uint16_t HighThreshold, uint16_t LowThreshold);  
  
// 配置ADC模拟看门狗以监视单个通道  
// ADCx: 指向ADC外设的指针  
// ADC_Channel: 要监视的ADC通道  
void ADC_AnalogWatchdogSingleChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel);  
  
// 使能或失能ADC的温度传感器和内部参考电压  
// NewState: 新的状态(ENABLE 或 DISABLE)  
void ADC_TempSensorVrefintCmd(FunctionalState NewState);  
  
// 获取ADC的标志状态  
// ADCx: 指向ADC外设的指针  
// ADC_FLAG: 要检查的ADC标志  
// 返回值: 标志状态(SET 或 RESET)  
FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t ADC_FLAG);  
  
// 清除ADC的标志  
// ADCx: 指向ADC外设的指针  
// ADC_FLAG: 要清除的ADC标志  
void ADC_ClearFlag(ADC_TypeDef* ADCx, uint8_t ADC_FLAG);  
  
// 获取ADC的中断状态  
// ADCx: 指向ADC外设的指针  
// ADC_IT: 要检查的中断  
// 返回值: 中断状态(SET 或 RESET)  
ITStatus ADC_GetITStatus(ADC_TypeDef* ADCx, uint16_t ADC_IT);  
  
// 清除ADC的挂起中断位  
// ADCx: 指向ADC外设的指针  
// ADC_IT: 要清除的中断  
void ADC_ClearITPendingBit(ADC_TypeDef* ADCx, uint16_t ADC_IT);

image.png

  1. 开启时钟
/*开启时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);	//开启ADC1的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	//开启GPIOA的时钟
  1. 设置ADC时钟
/*设置ADC时钟*/
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);						//选择时钟6分频,ADCCLK = 72MHz / 6 = 12MHz
	
  1. GPIO初始化
/*GPIO初始化*/
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);					//将PA0引脚初始化为模拟输入
	
  1. 规则组通道配置
/*规则组通道配置*/
	ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);		//规则组序列1的位置,配置为通道0
	
#define ADC_Channel_0                               ((uint8_t)0x00)
#define ADC_Channel_1                               ((uint8_t)0x01)
#define ADC_Channel_2                               ((uint8_t)0x02)
#define ADC_Channel_3                               ((uint8_t)0x03)
#define ADC_Channel_4                               ((uint8_t)0x04)
#define ADC_Channel_5                               ((uint8_t)0x05)
#define ADC_Channel_6                               ((uint8_t)0x06)
#define ADC_Channel_7                               ((uint8_t)0x07)
#define ADC_Channel_8                               ((uint8_t)0x08)
#define ADC_Channel_9                               ((uint8_t)0x09)
#define ADC_Channel_10                              ((uint8_t)0x0A)
#define ADC_Channel_11                              ((uint8_t)0x0B)
#define ADC_Channel_12                              ((uint8_t)0x0C)
#define ADC_Channel_13                              ((uint8_t)0x0D)
#define ADC_Channel_14                              ((uint8_t)0x0E)
#define ADC_Channel_15                              ((uint8_t)0x0F)
#define ADC_Channel_16                              ((uint8_t)0x10)
#define ADC_Channel_17                              ((uint8_t)0x11)

#define ADC_SampleTime_1Cycles5                    ((uint8_t)0x00)
#define ADC_SampleTime_7Cycles5                    ((uint8_t)0x01)
#define ADC_SampleTime_13Cycles5                   ((uint8_t)0x02)
#define ADC_SampleTime_28Cycles5                   ((uint8_t)0x03)
#define ADC_SampleTime_41Cycles5                   ((uint8_t)0x04)
#define ADC_SampleTime_55Cycles5                   ((uint8_t)0x05)
#define ADC_SampleTime_71Cycles5                   ((uint8_t)0x06)
#define ADC_SampleTime_239Cycles5                  ((uint8_t)0x07)

image.png
image.png

  1. ADC初始化
/*ADC初始化*/
	ADC_InitTypeDef ADC_InitStructure;						//定义结构体变量
	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;		//模式,选择独立模式,即单独使用ADC1
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;	//数据对齐,选择右对齐
	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;	//外部触发,使用软件触发,不需要外部触发
	ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;		//连续转换,失能,每转换一次规则组序列后停止
	ADC_InitStructure.ADC_ScanConvMode = DISABLE;			//扫描模式,失能,只转换规则组的序列1这一个位置
	ADC_InitStructure.ADC_NbrOfChannel = 1;					//通道数,为1,仅在扫描模式下,才需要指定大于1的数,在非扫描模式下,只能是1
	ADC_Init(ADC1, &ADC_InitStructure);						//将结构体变量交给ADC_Init,配置ADC1
	
//ADC_Mode
// 定义ADC独立模式,ADC工作时不与其他通道同时转换  
#define ADC_Mode_Independent                       ((uint32_t)0x00000000)  
  
// 定义ADC规则通道和注入通道的同时转换模式  
// 在这种模式下,规则通道和注入通道会同时启动转换  
#define ADC_Mode_RegInjecSimult                    ((uint32_t)0x00010000)  
  
// 定义ADC规则通道的同时转换与注入通道的交替触发模式  
// 规则通道首先进行转换,完成后注入通道开始转换,交替进行  
#define ADC_Mode_RegSimult_AlterTrig               ((uint32_t)0x00020000)  
  
// 定义ADC注入通道的快速交替转换模式  
// 注入通道以较快的速率交替进行转换  
#define ADC_Mode_InjecSimult_FastInterl            ((uint32_t)0x00030000)  
  
// 定义ADC注入通道的慢速交替转换模式  
// 注入通道以较慢的速率交替进行转换  
#define ADC_Mode_InjecSimult_SlowInterl            ((uint32_t)0x00040000)  
  
// 定义ADC注入通道的同时转换模式  
// 注入通道的所有通道会同时启动转换  
#define ADC_Mode_InjecSimult                       ((uint32_t)0x00050000)  
  
// 定义ADC规则通道的同时转换模式  
// 规则通道的所有通道会同时启动转换  
#define ADC_Mode_RegSimult                         ((uint32_t)0x00060000)  
  
// 定义ADC的快速交替转换模式  
// 在某些ADC中可能指规则通道的快速交替,但具体含义可能依赖于硬件  
#define ADC_Mode_FastInterl                        ((uint32_t)0x00070000)  
  
// 定义ADC的慢速交替转换模式  
// 在某些ADC中可能指规则通道的慢速交替,但具体含义可能依赖于硬件  
#define ADC_Mode_SlowInterl                        ((uint32_t)0x00080000)  
  
// 定义ADC的交替触发模式  
// 通常用于规则通道,可能意味着在每次触发后,规则通道中的不同通道会交替进行转换  
#define ADC_Mode_AlterTrig                         ((uint32_t)0x00090000)//ADC_DataAlign
#define ADC_DataAlign_Right                        ((uint32_t)0x00000000)
#define ADC_DataAlign_Left                         ((uint32_t)0x00000800)
//ADC_ExternalTrigConv 触发源
// 定义ADC1和ADC2的外部触发转换宏  
#define ADC_ExternalTrigConv_T1_CC1                ((uint32_t)0x00000000) /*!< 使用定时器1的捕获/比较输出1作为ADC1和ADC2的外部触发源 */  
#define ADC_ExternalTrigConv_T1_CC2                ((uint32_t)0x00020000) /*!< 使用定时器1的捕获/比较输出2作为ADC1和ADC2的外部触发源 */  
#define ADC_ExternalTrigConv_T2_CC2                ((uint32_t)0x00060000) /*!< 使用定时器2的捕获/比较输出2作为ADC1和ADC2的外部触发源 */  
#define ADC_ExternalTrigConv_T3_TRGO               ((uint32_t)0x00080000) /*!< 使用定时器3的触发输出作为ADC1和ADC2的外部触发源 */  
#define ADC_ExternalTrigConv_T4_CC4                ((uint32_t)0x000A0000) /*!< 使用定时器4的捕获/比较输出4作为ADC1和ADC2的外部触发源 */  
#define ADC_ExternalTrigConv_Ext_IT11_TIM8_TRGO    ((uint32_t)0x000C0000) /*!< 使用外部中断线11(可能是TIM8的触发输出)作为ADC1和ADC2的外部触发源 */  
  
// 定义ADC1、ADC2和ADC3共享的外部触发转换宏  
#define ADC_ExternalTrigConv_T1_CC3                ((uint32_t)0x00040000) /*!< 使用定时器1的捕获/比较输出3作为ADC1、ADC2和ADC3的外部触发源 */  
#define ADC_ExternalTrigConv_None                  ((uint32_t)0x000E0000) /*!< 不使用外部触发源,可能是软件触发或连续转换模式 */  
  
// 定义ADC3专用的外部触发转换宏  
#define ADC_ExternalTrigConv_T3_CC1                ((uint32_t)0x00000000) /*!< 使用定时器3的捕获/比较输出1作为ADC3的外部触发源(注意:这与ADC1和ADC2的T1_CC1相同)*/  
#define ADC_ExternalTrigConv_T2_CC3                ((uint32_t)0x00020000) /*!< 使用定时器2的捕获/比较输出3作为ADC3的外部触发源 */  
#define ADC_ExternalTrigConv_T8_CC1                ((uint32_t)0x00060000) /*!< 使用定时器8的捕获/比较输出1作为ADC3的外部触发源 */  
#define ADC_ExternalTrigConv_T8_TRGO               ((uint32_t)0x00080000) /*!< 使用定时器8的触发输出作为ADC3的外部触发源 */  
#define ADC_ExternalTrigConv_T5_CC1                ((uint32_t)0x000A0000) /*!< 使用定时器5的捕获/比较输出1作为ADC3的外部触发源 */  
#define ADC_ExternalTrigConv_T5_CC3                ((uint32_t)0x000C0000) /*!< 使用定时器5的捕获/比较输出3作为ADC3的外部触发源 */
  1. ADC使能
/*ADC使能*/
	ADC_Cmd(ADC1, ENABLE);									//使能ADC1,ADC开始运行
	
  1. ADC校准
/*ADC校准*/
	ADC_ResetCalibration(ADC1);								//固定流程,内部有电路会自动执行校准
	while (ADC_GetResetCalibrationStatus(ADC1) == SET);
	ADC_StartCalibration(ADC1);
	while (ADC_GetCalibrationStatus(ADC1) == SET);
  1. 获取ADC的值
uint16_t AD_GetValue(void)
{
	ADC_SoftwareStartConvCmd(ADC1, ENABLE);					//软件触发AD转换一次
	while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);	//等待EOC标志位,即等待AD转换结束
	return ADC_GetConversionValue(ADC1);					//读数据寄存器,得到AD转换的结果
}
// 定义ADC的模拟看门狗事件标志  
// 当ADC转换结果超出预设的模拟看门狗阈值时,此标志会被设置  
#define ADC_FLAG_AWD                               ((uint8_t)0x01)  
  
// 定义ADC的规则通道转换结束标志  
// 当ADC完成一个或多个规则通道的转换时,此标志会被设置  
#define ADC_FLAG_EOC                               ((uint8_t)0x02)  
  
// 定义ADC的注入通道转换结束标志  
// 当ADC完成一个或多个注入通道的转换时,此标志会被设置  
#define ADC_FLAG_JEOC                              ((uint8_t)0x04)  
  
// 定义ADC的注入通道开始标志  
// 当注入通道的转换开始时,此标志会被设置  
#define ADC_FLAG_JSTRT                             ((uint8_t)0x08)  
  
// 定义ADC的规则通道开始标志  
// 当规则通道的转换开始时,此标志会被设置  
#define ADC_FLAG_STRT                              ((uint8_t)0x10)

二. 多通道

  1. 开启时钟
/*开启时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);	//开启ADC1的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	//开启GPIOA的时钟
	
  1. 设置ADC时钟
/*设置ADC时钟*/
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);						//选择时钟6分频,ADCCLK = 72MHz / 6 = 12MHz
	
  1. GPIO初始化
/*GPIO初始化*/
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);					//将PA0、PA1、PA2和PA3引脚初始化为模拟输入
	
  1. 规则组通道配置
/*不在此处配置规则组序列,而是在每次AD转换前配置,这样可以灵活更改AD转换的通道*/
	
  1. ADC初始化
/*ADC初始化*/
	ADC_InitTypeDef ADC_InitStructure;						//定义结构体变量
	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;		//模式,选择独立模式,即单独使用ADC1
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;	//数据对齐,选择右对齐
	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;	//外部触发,使用软件触发,不需要外部触发
	ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;		//连续转换,失能,每转换一次规则组序列后停止
	ADC_InitStructure.ADC_ScanConvMode = DISABLE;			//扫描模式,失能,只转换规则组的序列1这一个位置
	ADC_InitStructure.ADC_NbrOfChannel = 1;					//通道数,为1,仅在扫描模式下,才需要指定大于1的数,在非扫描模式下,只能是1
	ADC_Init(ADC1, &ADC_InitStructure);						//将结构体变量交给ADC_Init,配置ADC1
	
  1. ADC使能
/*ADC使能*/
	ADC_Cmd(ADC1, ENABLE);									//使能ADC1,ADC开始运行
	
  1. ADC校准
/*ADC校准*/
	ADC_ResetCalibration(ADC1);								//固定流程,内部有电路会自动执行校准
	while (ADC_GetResetCalibrationStatus(ADC1) == SET);
	ADC_StartCalibration(ADC1);
	while (ADC_GetCalibrationStatus(ADC1) == SET);

  1. 获取AD转换的值
/**
  * 函    数:获取AD转换的值
  * 参    数:ADC_Channel 指定AD转换的通道,范围:ADC_Channel_x,其中x可以是0/1/2/3
  * 返 回 值:AD转换的值,范围:0~4095
  */
uint16_t AD_GetValue(uint8_t ADC_Channel)
{
	ADC_RegularChannelConfig(ADC1, ADC_Channel, 1, ADC_SampleTime_55Cycles5);	//在每次转换前,根据函数形参灵活更改规则组的通道1
	ADC_SoftwareStartConvCmd(ADC1, ENABLE);					//软件触发AD转换一次
	while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);	//等待EOC标志位,即等待AD转换结束
	return ADC_GetConversionValue(ADC1);					//读数据寄存器,得到AD转换的结果
}

  • 15
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值