你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 2400|回复: 1

ADC同步规则通道采集

[复制链接]

5

主题

16

回帖

0

蝴蝶豆

新手上路

最后登录
2018-1-12
发表于 2012-12-20 15:05:52 | 显示全部楼层 |阅读模式
我现在在做一个ADC规则通道采集多路感应电压(ADC1和ADC2),我用的是软件自身触发的方式,我一共有八个通道,ADC1,ADC2各四个,用的是软件触发,我也设置一个中断标志sign(初始为0),进入DMA(DMA1_Channel1)后sign=1,同时进行相应的数据处理,在DMA_ClearITPendingBit(DMA_IT_TC)后sign置0,出DMA中断后继续进行AD采集,但我发现ADC就采集过一次,DMA中断也只进入过一次,我也不知问题在哪里
 
#include "ADC12.h"
#include "UART.h"
#include "systick.h"

// ****************************************************************************
// 常 数 宏 定 义  *
#define ADC1_DR_Address    ((uint32_t)0x4001244C)
__IO uint32_t ADC12_ValueBuffer[4];
#define   N  7

// ****************************************************************************
// 函数名称: 
// 功能描述: 
// 输   入: 
// 输   出: 
// 全局变量:
// 调用模块: 
void ACD12Init(void)

  ADC_InitTypeDef  ADC_InitStructure;
  DMA_InitTypeDef  DMA_InitStructure;
  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  TIM_OCInitTypeDef TIM_OCInitStructure;
  NVIC_InitTypeDef NVIC_InitStructure ;
  GPIO_InitTypeDef GPIO_InitStructure;
 
  /* GPIOC Configurationin6, 7, 8 and 9 as alternate function AIN */ 
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3| GPIO_Pin_4| GPIO_Pin_5| GPIO_Pin_6| GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOC, &GPIO_InitStructure); 

  //DMA
  /* Enable DMA1 and DMA2 clocks */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
/* DMA1 channel1 configuration ----------------------------------------------*/
DMA_DeInit(DMA1_Channel1);
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC1_DR_Address;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADC12_ValueBuffer;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = 4;   //控制每次ADC采集的数据个数,由于是双通道,即每个通道采集4*2/N个数据,N为通道个数
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel1, &DMA_InitStructure);
/* Enable DMA1 Channel1 */
//DMA_Cmd(DMA1_Channel1, ENABLE);
DMA_ITConfig(DMA1_Channel1,DMA_IT_TC,ENABLE) ;
/* ADC1 configuration ------------------------------------------------------*/
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE );
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2, ENABLE );  //ADC1,ADC2时钟使能

ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult;
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 = 4;
ADC_Init(ADC1, &ADC_InitStructure);
/* ADC1 regular channels configuration */ 
ADC_RegularChannelConfig(ADC1, AD_Channel,1, ADC_SampleTime_7Cycles5 );   //PB1,配置为同步规则模式,ADC1,ADC2,转换顺序为1,2,3,4.。。。
ADC_RegularChannelConfig(ADC1, AD_Channe3,2, ADC_SampleTime_7Cycles5 );   //PA7
ADC_RegularChannelConfig(ADC1, AD_Channe5,3, ADC_SampleTime_7Cycles5 );   //PA5
ADC_RegularChannelConfig(ADC1, AD_Channe7,4, ADC_SampleTime_7Cycles5 );   //PA4
/* Enable ADC1 DMA */
ADC_DMACmd(ADC1, ENABLE);
/* ADC2 configuration ------------------------------------------------------*/
ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult;
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 = 4;
ADC_Init(ADC2, &ADC_InitStructure);
/* ADC2 regular channels configuration */ 
ADC_RegularChannelConfig(ADC2, AD_Channe8,4, ADC_SampleTime_7Cycles5 );   //Vref
ADC_RegularChannelConfig(ADC2, AD_Channe6,3, ADC_SampleTime_7Cycles5 );   //PA4
ADC_RegularChannelConfig(ADC2, AD_Channe4,2, ADC_SampleTime_7Cycles5 );   //PA6
ADC_RegularChannelConfig(ADC2, AD_Channe2,1, ADC_SampleTime_7Cycles5 );   //PC5
/* Enable ADC2 external trigger conversion */
ADC_ExternalTrigConvCmd(ADC2, ENABLE);  //外部触发源来自ADC1的规则组多路器(由/* Enable ADC2 */
ADC_Cmd(ADC2, ENABLE);
/* Enable ADC2 reset calibration register */   
ADC_ResetCalibration(ADC2);
/* Check the end of ADC2 reset calibration register */
while(ADC_GetResetCalibrationStatus(ADC2));
/* Start ADC2 calibration */
ADC_StartCalibration(ADC2);
/* Check the end of ADC2 calibration */
while(ADC_GetCalibrationStatus(ADC2));
/* Enable ADC1 */
ADC_Cmd(ADC1, ENABLE);
/* Enable Vrefint channel17 */
ADC_TempSensorVrefintCmd(ENABLE);
/* Enable ADC1 reset calibration register */   
ADC_ResetCalibration(ADC1);
/* Check the end of ADC1 reset calibration register */
while(ADC_GetResetCalibrationStatus(ADC1));
/* Start ADC1 calibration */
ADC_StartCalibration(ADC1);
/* Check the end of ADC1 calibration */
while(ADC_GetCalibrationStatus(ADC1));
/* Start ADC1 Software Conversion */ 
//ADC_ExternalTrigConvCmd(ADC1, ENABLE);
/* Test on DMA1 channel1 transfer complete flag */
//while(RESET==DMA_GetFlagStatus(DMA1_FLAG_TC1));   //容易卡在这里我就屏蔽了
/* Clear DMA1 channel1 transfer complete flag */
//DMA_ClearFlag(DMA1_FLAG_TC1);
//while(RESET==DMA_GetFlagStatus(DMA1_FLAG_TC1));       
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn ;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1 ;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0 ;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE ;
NVIC_Init(&NVIC_InitStructure);
//TIM_Cmd(TIM4,ENABLE);
return;
 }
// *****************************************************************************
// 函数名称: 
// 功能描述:  
// 输   入:
// 输   出: 
// 全局变量:
// 调用模块: 
extern uint8_t sign ; // 将7路外部AD口的数据分为七组,依次编号为0,1,2,3.....
uint16_t p,j,k=0;
uint16_t Value1[N],Value2[N],Value3[N],Value4[N],Value5[N],Value6[N],Value7[N];
uint32_t Sum0=0,Sum1=0,Sum2=0,Sum3=0,Sum4=0,Sum5=0,Sum6=0,Sum7=0;
void DMA1_Channel1_IRQHandler(void)
{ if(DMA_GetITStatus(DMA_IT_TC)!= RESET)
   { 
       p++;                      //想看看进入过中断几次
      sign = 1;                 //sign=1,表示七通道采集轮询一次完成  
  DMA_Cmd(DMA1_Channel1, DISABLE);
  //ADC_SoftwareStartConvCmd(ADC1, DISABLE);
      for(k=0,j=0;k>16)&0x0000ffff))|0x1000; 
              Sum2+=Value2[j];
              Value3[j]=((ADC12_ValueBuffer[k+1]&0x0000ffff))|0x2000;
              Sum3+=Value3[j];
              Value4[j]=((ADC12_ValueBuffer[k+1]>>16)&0x0000ffff)|0x3000; 
              Sum4+=Value4[j];
  Value5[j]=(ADC12_ValueBuffer[k+2]&0x0000ffff)|0x4000;
              Sum5+=Value5[j];
              Value6[j]=((ADC12_ValueBuffer[k+2]>>16)&0x0000ffff)|0x5000; 
              Sum6+=Value6[j];
  Value7[j]=(ADC12_ValueBuffer[k+3]&0x0000ffff)|0x6000;
              Sum7+=Value7[j]; 
    }          
    //DMA_Configuration() ;
   //DelayMS(100);
   }               
DMA_Cmd(DMA1_Channel1, ENABLE);
//ADC_SoftwareStartConvCmd(ADC1, ENABLE);
DMA_ClearITPendingBit(DMA_IT_TC); 
sign = 0 ;
 }
 
<
回复

使用道具 举报

1

主题

7

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
发表于 2013-2-22 09:55:39 | 显示全部楼层

回复:ADC同步规则通道采集

清除中断标志位了吗?
回复 支持 反对

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版