OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3171|回复: 3

STM32F103VE的ADC中断

[复制链接]

54

主题

100

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
432
金钱
432
注册时间
2013-5-8
在线时间
33 小时
发表于 2015-5-8 15:02:15 | 显示全部楼层 |阅读模式
5金钱

这是程序
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;
程序就会死,硬件单步调试的时候程序总是停在清中断标志那里!
如果不加上面语句的话,程序不会死,并且可以采集到正确的值,请问这是什么原因,为什么在中断服务程序函数里面就不可以赋值处理呢?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-5-8 22:36:09 | 显示全部楼层
参考下别人的adc中断采集数据例程吧。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
114
金钱
114
注册时间
2016-6-29
在线时间
28 小时
发表于 2017-9-21 21:04:26 | 显示全部楼层
正点原子 发表于 2015-5-8 22:36
参考下别人的adc中断采集数据例程吧。

那多通道的中断怎么弄呢,
这样写的么
u16 Get_Adc(u8 ch)
{
ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_28Cycles5);//ADC1
  return ADC1ConvertedValue;
}
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-9-22 00:45:13 | 显示全部楼层
万能的金果果 发表于 2017-9-21 21:04
那多通道的中断怎么弄呢,
这样写的么
u16 Get_Adc(u8 ch)

一样的,进入一次,读取一个值
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-18 01:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表