STM32F103VE的ADC中断

2019-08-13 23:52发布

这是程序
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;
程序就会死,硬件单步调试的时候程序总是停在清中断标志那里!
如果不加上面语句的话,程序不会死,并且可以采集到正确的值,请问这是什么原因,为什么在中断服务程序函数里面就不可以赋值处理呢?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
正点原子
1楼-- · 2019-08-14 03:08
参考下别人的adc中断采集数据例程吧。
万能的金果果
2楼-- · 2019-08-14 05:54
正点原子 发表于 2015-5-8 22:36
参考下别人的adc中断采集数据例程吧。

那多通道的中断怎么弄呢,
这样写的么
u16 Get_Adc(u8 ch)
{
ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_28Cycles5);//ADC1
  return ADC1ConvertedValue;
}
正点原子
3楼-- · 2019-08-14 07:40
万能的金果果 发表于 2017-9-21 21:04
那多通道的中断怎么弄呢,
这样写的么
u16 Get_Adc(u8 ch)

一样的,进入一次,读取一个值

一周热门 更多>