#include "stm32f10x.h"
u16 ADCConvertedValue;
int main()
{
GPIO_InitTypeDef m_GPIO_InitTypeDef;
ADC_InitTypeDef ADC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB,ENABLE);//打开APB2时钟,GPIO都是挂在APB2上的
m_GPIO_InitTypeDef.GPIO_Pin = GPIO_Pin_14 | GPIO_Pin_7;
m_GPIO_InitTypeDef.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
m_GPIO_InitTypeDef.GPIO_Speed = GPIO_Speed_2MHz; //速度2M
GPIO_Init(GPIOB,&m_GPIO_InitTypeDef); //GPIO初始化
m_GPIO_InitTypeDef.GPIO_Pin = GPIO_Pin_6;
m_GPIO_InitTypeDef.GPIO_Mode = GPIO_Mode_AIN;
m_GPIO_InitTypeDef.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOA,&m_GPIO_InitTypeDef); //GPIO初始化
RCC_ADCCLKConfig(RCC_PCLK2_Div2);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA, ENABLE); // 打开ADC1的APB2时钟
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC1和ADC2工作在独立模式
ADC_InitStructure.ADC_ScanConvMode = DISABLE; //ADC工作在单通道模式
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //ADC工作在单次模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //转换由软件而不是外部触发启动
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);
ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 1, ADC_SampleTime_28Cycles5);
ADC_ITConfig(ADC1,ADC_IT_EOC,ENABLE); //开启转换结束中断
ADC_Cmd(ADC1, ENABLE); //使能ADC1转换器
while(1)
{
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能ADC1的软件转换启动功能
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC )); //等待转换结束
if(ADCConvertedValue > 1800)
{
GPIO_WriteBit(GPIOB,GPIO_Pin_7, Bit_SET); //清除GPB_7 点亮LED
}
else if(ADCConvertedValue < 50)
{
GPIO_WriteBit(GPIOB,GPIO_Pin_14, Bit_SET);
}
else
{
GPIO_WriteBit(GPIOB,GPIO_Pin_14 | GPIO_Pin_7, Bit_RESET);
}
}
}
void ADC1_IRQHandler()
{
ADCConvertedValue = ADC_GetConversionValue(ADC1);
GPIO_WriteBit(GPIOB,GPIO_Pin_14, Bit_RESET); //清除GPB_14 点亮LED
ADC_ClearITPendingBit(ADC1,ADC_IT_EOC);
}
可以转换,但是不能进入中断,不知道是哪里配置出错