OpenEdv-开源电子网

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

stm32 adc交替触发模式 配置

[复制链接]

3

主题

29

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
299
金钱
299
注册时间
2018-8-18
在线时间
67 小时
发表于 2019-12-31 18:36:19 | 显示全部楼层 |阅读模式
6金钱
        这个出不来数据,进不了中断。说明配置不对   
//pc4 pA4
void  Adcatm_Init(void)
{        
        ADC_InitTypeDef ADC_InitStructure;
        GPIO_InitTypeDef GPIO_InitStructure;
        NVIC_InitTypeDef  NVIC_InitStruct;

        RCC_APB2PeriphClockCmd(         RCC_APB2Periph_GPIOA
                                                        |RCC_APB2Periph_GPIOC
                                                        |RCC_APB2Periph_ADC1
                                                        |RCC_APB2Periph_ADC2, ENABLE );          //使能ADC1通道时钟
        RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M


       
        //  PC4  PA4  /////////////////////////////////////                  
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;                       
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                //模拟输入引脚
        GPIO_Init(GPIOC, &GPIO_InitStructure);       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;                                               
        GPIO_Init(GPIOA, &GPIO_InitStructure);


        //配置adc1//////////////////////////////////////////
        ADC_DeInit(ADC1);  
        //复位ADC1,将外设 ADC1 的全部寄存器重设为缺省值
        ADC_InitStructure.ADC_Mode = ADC_Mode_AlterTrig;       
        //ADC工作模式:ADC1和ADC2工作在独立模式
        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数据右对齐
        ADC_InitStructure.ADC_NbrOfChannel = 2;       
        //顺序进行规则转换的ADC通道的数目
        ADC_Init(ADC1, &ADC_InitStructure);       
        //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器   
        //ADC_RegularChannelConfig(ADC1, 4, 1, ADC_SampleTime_239Cycles5 );
        //ADC_ExternalTrigConvCmd( ADC1, ENABLE);
        ADC_InjectedChannelConfig(ADC1,ADC_Channel_4, 1, ADC_SampleTime_239Cycles5 );
        ADC_InjectedChannelConfig(ADC1,ADC_Channel_14,2, ADC_SampleTime_239Cycles5 );
        //ADC_ExternalTrigInjectedConvConfig(ADC1, ADC_ExternalTrigInjecConv_None);
        //ADC_InjectedSequencerLengthConfig(  ADC1, 2);
       
        ADC_DMACmd(ADC1, ENABLE);
        //开启ADC的DMA,在双ADC模式里,为了在主数据寄存器上读取从转换数据,必须使能DMA位,
        //即使不使用DMA传输规则通道数据。
        //只有ADC1和ADC3能产生DMA请求。所以只需设置ADC1的DMA:ADC_DMACmd(ADC1, ENABLE);


        //配置adc2/////////////////////////////////
        ADC_DeInit(ADC2);  
        //复位ADC1,将外设 ADC1 的全部寄存器重设为缺省值
        ADC_InitStructure.ADC_Mode = ADC_Mode_AlterTrig;       
        //ADC工作模式:ADC1和ADC2工作在独立模式
        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数据右对齐
        ADC_InitStructure.ADC_NbrOfChannel = 2;       
        //顺序进行规则转换的ADC通道的数目
        ADC_Init(ADC2, &ADC_InitStructure);       
        ADC_ExternalTrigInjectedConvCmd( ADC2, ENABLE);
        //ADC_InjectedSequencerLengthConfig(  ADC2, 2);
       
        //ADC_ExternalTrigInjectedConvConfig(ADC2, ADC_ExternalTrigInjecConv_None);
        //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器  
       
        //ADC_RegularChannelConfig(ADC2, 4, 1, ADC_SampleTime_239Cycles5 );
        ADC_InjectedChannelConfig(ADC2,ADC_Channel_2, 1, ADC_SampleTime_239Cycles5);
        ADC_InjectedChannelConfig(ADC2,ADC_Channel_3, 2, ADC_SampleTime_239Cycles5);
       
       

        //配置adc中断///////////////////////////////////////
        //NVIC_InitTypeDef
       
        NVIC_InitStruct.NVIC_IRQChannel=ADC1_2_IRQn;
        NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
        NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=2;
        NVIC_InitStruct.NVIC_IRQChannelSubPriority=0;
        NVIC_Init(&NVIC_InitStruct);
       
        ADC_InjectedDiscModeCmd(ADC1, DISABLE);
        ADC_InjectedDiscModeCmd(ADC2, DISABLE);
       
        ADC_Cmd(ADC2, ENABLE);        //使能指定的ADC1 adon
        ADC_Cmd(ADC1, ENABLE);        //使能指定的ADC1 adon
       
        ADC_ITConfig(ADC1, ADC_IT_JEOC,ENABLE);
        //ADC_ITConfig(ADC2, ADC_IT_JEOC,ENABLE);

       
        ADC_ResetCalibration(ADC1);        //使能复位校准  rstcal
        ADC_ResetCalibration(ADC2);        //使能复位校准  rstcal
        while(ADC_GetResetCalibrationStatus(ADC1));        //等待复位校准结束
        while(ADC_GetResetCalibrationStatus(ADC2));        //等待复位校准结束

        ADC_StartCalibration(ADC1);         //开启AD校准  //cal 开始校正
        while(ADC_GetCalibrationStatus(ADC1));         //等待校准结束   //cal等待校正完成
        ADC_StartCalibration(ADC2);         //开启AD校准  //cal 开始校正
        while(ADC_GetCalibrationStatus(ADC2));         //等待校准结束   //cal等待校正完成

        ADC_SoftwareStartInjectedConvCmd(ADC1, ENABLE);
        //ADC_SoftwareStartInjectedConvCmd(ADC2, ENABLE);
        //ADC_SoftwareStartConvCmd(ADC1, ENABLE);                //使能指定的ADC1的软件转换启动功能
        LED1=0;
}


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

使用道具 举报

3

主题

29

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
299
金钱
299
注册时间
2018-8-18
在线时间
67 小时
 楼主| 发表于 2019-12-31 18:37:26 | 显示全部楼层
//ADC工作模式:ADC1和ADC2工作在独立模式
        ADC_InitStructure.ADC_ScanConvMode =ENABLE;        
        //模数转换工作在单通道模式
        ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;  我修改过为disable,也不行
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2020-5-29
在线时间
2 小时
发表于 2020-12-1 19:33:53 | 显示全部楼层
好可爱
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-23 15:17

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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