常用函数
1
| void RCC_ADCCLKConfig(uint32_t RCC_PCLK2);
|
配置ADCCLK分频器,可以对APB2的72MHz选择2、4、6、8分频,输入到ADCCLK。
1
| void ADC_DeInit(ADC_TypeDef* ADCx);
|
恢复缺省配置
1
| void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);
|
初始化
1
| void ADC_StructInit(ADC_InitTypeDef* ADC_InitStruct);
|
结构体初始化
1
| void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState);
|
ADC上电,开关控制。
1
| void ADC_DMACmd(ADC_TypeDef* ADCx, FunctionalState NewState);
|
开启DMA输出信号,如果使用DMA转运数据,调用此函数。
1
| void ADC_ITConfig(ADC_TypeDef* ADCx, uint16_t ADC_IT, FunctionalState NewState);
|
中断输出控制,控制某个中断,通往NVIC。
1 2 3 4
| void ADC_ResetCalibration(ADC_TypeDef* ADCx); FlagStatus ADC_GetResetCalibrationStatus(ADC_TypeDef* ADCx); void ADC_StartCalibration(ADC_TypeDef* ADCx); FlagStatus ADC_GetCalibrationStatus(ADC_TypeDef* ADCx);
|
在ADC初始化完成后,依次调用完成校准。
1
| void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
|
ADC软件开始转换控制,用于软件触发函数,软件触发转换
1
| FlagStatus ADC_GetSoftwareStartConvStatus(ADC_TypeDef* ADCx);
|
ADC获取软件开始转换状态,给SWSTART位置1,开始转换,返回SWSTART状态。(一般不用)
1 2
| void ADC_DiscModeChannelCountConfig(ADC_TypeDef* ADCx, uint8_t Number); void ADC_DiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
|
配置间断模式,第一个函数是每个几个通道间断一次,第二个函数是是否启用间断模式。
1
| void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime);
|
ADC规则组通道配置,给序列的每个位置填写指定的通道。
1
| void ADC_ExternalTrigConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
|
ADC外部触发转换控制,是否允许外部触发转换。
1
| uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx);
|
ADC获取转换值,获取AD转换数据寄存器,读取结果。
1
| uint32_t ADC_GetDualModeConversionValue(void);
|
ADC获取双模式转换器,双ADC模式读取转换结果。
1 2 3 4 5 6 7 8 9 10
| void ADC_AutoInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState); void ADC_InjectedDiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState); void ADC_ExternalTrigInjectedConvConfig(ADC_TypeDef* ADCx, uint32_t ADC_ExternalTrigInjecConv); void ADC_ExternalTrigInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState); void ADC_SoftwareStartInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState); FlagStatus ADC_GetSoftwareStartInjectedConvCmdStatus(ADC_TypeDef* ADCx); void ADC_InjectedChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime); void ADC_InjectedSequencerLengthConfig(ADC_TypeDef* ADCx, uint8_t Length); void ADC_SetInjectedOffset(ADC_TypeDef* ADCx, uint8_t ADC_InjectedChannel, uint16_t Offset); uint16_t ADC_GetInjectedConversionValue(ADC_TypeDef* ADCx, uint8_t ADC_InjectedChannel);
|
对ADC注入组进行配置。
1 2 3
| void ADC_AnalogWatchdogCmd(ADC_TypeDef* ADCx, uint32_t ADC_AnalogWatchdog); void ADC_AnalogWatchdogThresholdsConfig(ADC_TypeDef* ADCx, uint16_t HighThreshold, uint16_t LowThreshold); void ADC_AnalogWatchdogSingleChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel);
|
对模拟看门狗进行配置
1
| void ADC_TempSensorVrefintCmd(FunctionalState NewState);
|
开启内部通道:ADC温度传感器、内部参考电压控制
1 2 3 4
| FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t ADC_FLAG); void ADC_ClearFlag(ADC_TypeDef* ADCx, uint8_t ADC_FLAG); ITStatus ADC_GetITStatus(ADC_TypeDef* ADCx, uint16_t ADC_IT); void ADC_ClearITPendingBit(ADC_TypeDef* ADCx, uint16_t ADC_IT);
|
AD单通道
AD.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| #include "stm32f10x.h"
void AD_Init(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); RCC_ADCCLKConfig(RCC_PCLK2_Div6); 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); ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_55Cycles5); ADC_InitTypeDef ADC_InitStructure; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; ADC_InitStructure.ADC_ScanConvMode = DISABLE; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC1,&ADC_InitStructure); ADC_Cmd(ADC1,ENABLE); ADC_ResetCalibration(ADC1); while (ADC_GetResetCalibrationStatus(ADC1) == SET); ADC_StartCalibration(ADC1); while (ADC_GetCalibrationStatus(ADC1) == SET); }
uint16_t AD_GetValue(void) { ADC_SoftwareStartConvCmd(ADC1,ENABLE); while (ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC) == RESET); return ADC_GetConversionValue(ADC1); }
|
main.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| #include "stm32f10x.h" #include "Delay.h" #include "OLED.h" #include "AD.h" uint16_t ADValue; int main(void) { OLED_Init(); AD_Init(); OLED_ShowString(1,1,"ADValue:"); OLED_ShowString(2,1,"Voltage:0.00V"); while(1) { ADValue = AD_GetValue(); OLED_ShowNum(1,9,ADValue,4); OLED_ShowNum(2,9,((float)ADValue/4095*3.3),1); OLED_ShowNum(2,11,((uint16_t)(((float)ADValue/4095*3.3)*100)%100),2); Delay_ms(100); } }
|
AD多通道
AD.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| #include "stm32f10x.h"
void AD_Init(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); RCC_ADCCLKConfig(RCC_PCLK2_Div6); 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); ADC_InitTypeDef ADC_InitStructure; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; ADC_InitStructure.ADC_ScanConvMode = DISABLE; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC1,&ADC_InitStructure); ADC_Cmd(ADC1,ENABLE); ADC_ResetCalibration(ADC1); while (ADC_GetResetCalibrationStatus(ADC1) == SET); ADC_StartCalibration(ADC1); while (ADC_GetCalibrationStatus(ADC1) == SET); }
uint16_t AD_GetValue(uint8_t ADC_Channel) { ADC_RegularChannelConfig(ADC1,ADC_Channel,1,ADC_SampleTime_55Cycles5); ADC_SoftwareStartConvCmd(ADC1,ENABLE); while (ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC) == RESET); return ADC_GetConversionValue(ADC1); }
|
main.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| #include "stm32f10x.h" #include "Delay.h" #include "OLED.h" #include "AD.h" uint16_t AD0,AD1,AD2,AD3; int main(void) { OLED_Init(); AD_Init(); OLED_ShowString(1,1,"AD0:"); OLED_ShowString(2,1,"AD1:"); OLED_ShowString(3,1,"AD2:"); OLED_ShowString(4,1,"AD3:"); while(1) { AD0 = AD_GetValue(ADC_Channel_0); AD1 = AD_GetValue(ADC_Channel_1); AD2 = AD_GetValue(ADC_Channel_2); AD3 = AD_GetValue(ADC_Channel_3); OLED_ShowNum(1,5,AD0,4); OLED_ShowNum(2,5,AD1,4); OLED_ShowNum(3,5,AD2,4); OLED_ShowNum(4,5,AD3,4); Delay_ms(100); } }
|