1 有关的常用库函数
void ADC_CommonInit(ADC_CommonInitTypeDef* ADC_CommonInitStruct);
void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);
void ADC_DeInit(ADC_TypeDef* ADCx)
void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState);
void ADC_ITConfig(ADC_TypeDef* ADCx, uint16_t ADC_IT, FunctionalState NewState);
void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime);
uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx);
ADC通用初始化函数
void ADC_CommonInit(ADC_CommonInitTypeDef* ADC_CommonInitStruct);
一个入口参数(ADC_CommonInitTypeDef结构体指针类型变量)
typedef struct
{
uint32_t ADC_Mode;//多重ADC模式选择
//算出来的ADC时钟不能超过32M
uint32_t ADC_Prescaler; //ADC预分频
uint32_t ADC_DMAAccessMode; //DMA访问模式
uint32_t ADC_TwoSamplingDelay; //2个采样阶段之间的延迟
}ADC_CommonInitTypeDef;
以上参数用来配置ADC_CCR寄存器的相关参数
查看void ADC_CommonInit() 函数的定义
void ADC_CommonInit(ADC_CommonInitTypeDef* ADC_CommonInitStruct)
{
uint32_t tmpreg1 = 0;
/* Check the parameters */
assert_param(IS_ADC_MODE(ADC_CommonInitStruct->ADC_Mode));
assert_param(IS_ADC_PRESCALER(ADC_CommonInitStruct->ADC_Prescaler));
assert_param(IS_ADC_DMA_ACCESS_MODE(ADC_CommonInitStruct->ADC_DMAAccessMode));
assert_param(IS_ADC_SAMPLING_DELAY(ADC_CommonInitStruct->ADC_TwoSamplingDelay));
/*---------------------------- ADC CCR Configuration -----------------*/
/* Get the ADC CCR value */
tmpreg1 = ADC->CCR;
/* Clear MULTI, DELAY, DMA and ADCPRE bits */
tmpreg1 &= CR_CLEAR_MASK;
/* Configure ADCx: Multi mode, Delay between two sampling time, ADC prescaler,
and DMA access mode for multimode */
/* Set MULTI bits according to ADC_Mode value */
/* Set ADCPRE bits according to ADC_Prescaler value */
/* Set DMA bits according to ADC_DMAAccessMode value */
/* Set DELAY bits according to ADC_TwoSamplingDelay value */
tmpreg1 |= (uint32_t)(ADC_CommonInitStruct->ADC_Mode |
ADC_CommonInitStruct->ADC_Prescaler |
ADC_CommonInitStruct->ADC_DMAAccessMode |
ADC_CommonInitStruct->ADC_TwoSamplingDelay);
/* Write to ADC CCR */
ADC->CCR = tmpreg1;
}
预分频设置
assert_param(IS_ADC_PRESCALER(ADC_CommonInitStruct->ADC_Prescaler));
#define ADC_Prescaler_Div2 ((uint32_t)0x00000000)
#define ADC_Prescaler_Div4 ((uint32_t)0x00010000)
#define ADC_Prescaler_Div6 ((uint32_t)0x00020000)
#define ADC_Prescaler_Div8 ((uint32_t)0x00030000)
#define IS_ADC_PRESCALER(PRESCALER) (((PRESCALER) == ADC_Prescaler_Div2) || \
((PRESCALER) == ADC_Prescaler_Div4) || \
((PRESCALER) == ADC_Prescaler_Div6) || \
((PRESCALER) == ADC_Prescaler_Div8))
参数配置样例
ADC_CommonInitTypeDef ADC_CommonInitStructure;
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;//独立模式
ADC_CommonInitStructure.ADC_TwoSamplingDelay
= ADC_TwoSamplingDelay_5Cycles;//两个采样阶段之间的延迟5个时钟
ADC_CommonInitStructure.ADC_DMAAccessMode
= ADC_DMAAccessMode_Disabled; //DMA失能
ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;
ADC_CommonInit(&ADC_CommonInitStructure);
assert_param 的用法 : https://www.cnblogs.com/leo0621/p/9435794.html
在STM32的固件库和提供的例程中,到处都可以见到assert_param()的使用。如果打开任何一个例程中的stm32f10x_conf.h文件,就可以看到实际上assert_param是一个宏定义;
在固件库中,它的作用就是检测传递给函数的参数是否是有效的参数。
比如
assert_param(IS_ADC_ALL_PERIPH(ADCx));
这句代码用于检查参数ADCx是否有效,其中IS_ADC_ALL_PERIPH(ADCx)是一个宏定义,详情如下:
\\PERIPH通常是外设数据结构
#define IS_ADC_ALL_PERIPH(PERIPH) (((PERIPH) == ADC1) || \
((PERIPH) == ADC2) || \
((PERIPH) == ADC3))
宏定义的功能是参数ADCx是ADC1~ADC3其中的一个,表示参数ADCx有效,返回true,否则返回false。
(void)0
这里只是一个占位符而已,表示什么都不做,编译器不会对这行代码生成任何汇编代码
assert_param调用
assert_param(IS_ADC_MODE(ADC_CommonInitStruct->ADC_Mode));
assert_param(IS_ADC_PRESCALER(ADC_CommonInitStruct->ADC_Prescaler));
assert_param(IS_ADC_DMA_ACCESS_MODE(ADC_CommonInitStruct->ADC_DMAAccessMode));
assert_param(IS_ADC_SAMPLING_DELAY(ADC_CommonInitStruct->ADC_TwoSamplingDelay));
ADC_InitStruct->ADC_Resolution = ADC_Resolution_12b;//采样精度为12位
“->”表示ADC_InitStruct是一个结构体,ADC_Resolution 是结构体里面定义的一个变量。 当ADC_InitStruct->系统会提示ADC_InitStruct的成员变量
ADC初始化函数ADC_Init
void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct)
typedef struct
{
uint32_t ADC_Resolution;//ADC分辨率 可以设置 12 10 8 6
FunctionalState ADC_ScanConvMode; //是否使用扫描模式。ADC_CR1位8:SCAN位
FunctionalState ADC_ContinuousConvMode; //单次转换OR连续转换:ADC_CR2的位1:CONT
uint32_t ADC_ExternalTrigConvEdge; //外部触发使能方式:ADC_CR2的位29:28,EXTEN
uint32_t ADC_ExternalTrigConv; //触发方式:ADC_CR2的位[19:17] :EXTSEL[2:0]
uint32_t ADC_DataAlign; //对齐方式:左对齐还是右对齐:ADC_CR2的位11:ALIGN
uint8_t ADC_NbrOfChannel;//规则通道序列长度:ADC_SQR1的位[23:20]: L[3:0]
}ADC_InitTypeDef;