这是程序
void ADC_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
/* 配置ADC时钟分频 */
//RCC_ADCCLKConfig(RCC_PCLK2_Div8);//在采集直流单信号时,该函数没啥影响
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //开启ADC1的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOC,&GPIO_InitStructure);
//ADC1,单独测试是可以的
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //独立模式
ADC_InitStructure.ADC_ScanConvMode = ENABLE; //连续多通道模式
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //连续转换模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//不受外界决定
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 1; //扫描通道数3
ADC_Init(ADC1,&ADC_InitStructure);
//ADC_SampleTime:该参数
ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_28Cycles5);//ADC1
ADC_Cmd(ADC1,ENABLE);
ADC_SoftwareStartConvCmd(ADC1,ENABLE);
// 复位指定的ADC1的校准寄存器
ADC_ResetCalibration(ADC1);
/* Check the end of ADC1 reset calibration register */
while(ADC_GetResetCalibrationStatus(ADC1));// 获取 ADC1 复位校准寄存器的状态 ,设置 状态则等待
/* Start ADC1 calibaration */
ADC_StartCalibration(ADC1);
// 开始指定ADC1的校准状态
/* Check the end of ADC1 calibration */
while(ADC_GetCalibrationStatus(ADC1));
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = ADC1_2_IRQn;
//ADC1,ADC2全局中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
//先占优先级0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
//从优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
ADC_ITConfig(ADC1,ADC_IT_EOC,ENABLE);
}
ADC中断服务程序
void ADC1_2_IRQHandler(void)
{
static u16 i = 0;
//检查指定的ADC中断是否发生
if(ADC_GetITStatus(ADC1,ADC_IT_EOC)==SET)
{
//ADC_SoftwareStartConvCmd(ADC1,ENABLE);
//ADCChBuff0[i++] = ADC_GetConversionValue(ADC1);
ADC_ConversionValue = ADC_GetConversionValue(ADC1);
//ADCChBuff0[i++] = ADC_ConversionValue;
if ( i > 31 )
{
i = 0;
}
ADC_ClearITPendingBit(ADC1, ADC_IT_EOC);
}
}
只要加该语句ADCChBuff0[i++] = ADC_ConversionValue;
程序就会死,硬件单步调试的时候程序总是停在清中断标志那里!
如果不加上面语句的话,程序不会死,并且可以采集到正确的值,请问这是什么原因,为什么在中断服务程序函数里面就不可以赋值处理呢?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
那多通道的中断怎么弄呢,
这样写的么
u16 Get_Adc(u8 ch)
{
ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_28Cycles5);//ADC1
return ADC1ConvertedValue;
}
一样的,进入一次,读取一个值
一周热门 更多>