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

查看: 1347|回复: 4

F407 ADC及DMA应用数据溢出求指点~

[复制链接]

1

主题

4

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
发表于 2015-1-22 13:56:14 | 显示全部楼层 |阅读模式
  1. void ADC_DMA_Config(void)
  2. {
  3.         NVIC_InitTypeDef NVIC_InitStructure;
  4.         //DMA for ADCÅäÖýṹ
  5.         DMA_InitTypeDef DMA_InitStructure;   

  6.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
  7.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_ADC2, ENABLE);

  8.         DMA_DeInit(DMA2_Stream0);
  9.         /* DMA2 Stream0 channe0 configuration **************************************/
  10.         DMA_InitStructure.DMA_Channel = ADC_DMAn;  
  11.         DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)0x40012308;
  12.         DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&DMABuf[DMABufFlag][0];
  13.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
  14.         DMA_InitStructure.DMA_BufferSize = ADC_REG_SEQ_SIZE;
  15.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  16.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  17.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
  18.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
  19.         DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  20.         //        DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
  21.         DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  22.         DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;         
  23.         DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
  24.         DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
  25.         DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
  26.         DMA_Init(DMA2_Stream0, &DMA_InitStructure);
  27.   
  28.         /* Enable the DMA gloabal Interrupt */
  29.         DMA_ClearITPendingBit(DMA2_Stream0,DMA_IT_TC);
  30.     DMA_ITConfig(DMA2_Stream0, DMA_IT_TC, ENABLE);
  31.     //Enable DMA ADC_DMAn
  32.     DMA_Cmd(DMA2_Stream0, ENABLE);
  33.     //DMA for ADC ÖжÏʹÄÜ
  34.        
  35.         NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream0_IRQn;
  36.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  37.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  
  38.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  39.         NVIC_Init(&NVIC_InitStructure);
  40. }
复制代码
  1. void ADC_Config(void)
  2. {
  3.         ADC_InitTypeDef   ADC_InitStructure;
  4.         ADC_CommonInitTypeDef ADC_CommonInitStructure;

  5.         /* Enable ADC clock */
  6.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_ADC2, ENABLE);

  7.         /* ADC2 regular channel 12 configuration ************************************/
  8.         ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
  9.         ADC_InitStructure.ADC_ScanConvMode = ENABLE;
  10.         ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
  11.         ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
  12.         ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T2_CC4;
  13.         ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  14.         ADC_InitStructure.ADC_NbrOfConversion = ADC_REG_SEQ_SIZE;
  15.         ADC_Init(ADC2, &ADC_InitStructure);
  16.         /* ADC1 regular channel 12 configuration ************************************/
  17.         ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
  18.         ADC_InitStructure.ADC_ScanConvMode = ENABLE;
  19.         ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;        //ENABLE
  20.         ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_Rising;
  21.         ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T2_CC4;
  22.         ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  23.         ADC_InitStructure.ADC_NbrOfConversion = ADC_REG_SEQ_SIZE;
  24.         ADC_Init(ADC1, &ADC_InitStructure);

  25.         /* ADC Common configuration *************************************************/
  26.         ADC_CommonInitStructure.ADC_Mode = ADC_DualMode_RegSimult;        //Ë«ÖØÄ£Ê½¡¢¹æÔò×é
  27.         ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
  28.         ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_2;  
  29.         ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;
  30.         ADC_CommonInit(&ADC_CommonInitStructure);

  31.     //¸üÐÂɨÃèÐòÁÐ×é
  32.     ReNewADC_RegularSeqConfig();
  33.     //ʹÄÜζȴ«¸ÐÆ÷ºÍÄÚ²¿²Î¿¼µçѹͨµÀ
  34.     ADC_TempSensorVrefintCmd(ENABLE);

  35.     //Enable ADC1 DMA
  36.     ADC_DMACmd(ADC1, ENABLE);
  37.        
  38.         //Enable ADC1 ADC2
  39.     ADC_Cmd(ADC1, ENABLE);
  40.     ADC_Cmd(ADC2, ENABLE);                                                         //Ë«ADC
  41. }
复制代码
  1. void TIM2_Config(void)
  2. {
  3.     TIM_TimeBaseInitTypeDef          TIM_TimeBaseStructure;
  4.         TIM_OCInitTypeDef                          TIM_OCInitStructure;

  5.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);  
  6.         TIM_DeInit(TIM2);//¸´Î»TIM2¶¨Ê±Æ÷

  7.         //X us¶¨Ê±ÖжÏ
  8.         TIM_TimeBaseStructure.TIM_Period = SamplePeriod; //×î´ó¼ÆÊýÖµ0xffff         
  9.         TIM_TimeBaseStructure.TIM_Prescaler = 71;//·ÖƵ  1us     
  10.         TIM_TimeBaseStructure.TIM_ClockDivision = 0x00;//·ÖƵÒò×Ó  //CK_CNT = FCLK /(TIM_Prescaler+1)
  11.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  12.         TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

  13.         //PWM1 Mode configuration: Channel4
  14.     TIM_OCInitStructure.TIM_OCMode          = TIM_OCMode_PWM1;
  15.     TIM_OCInitStructure.TIM_OutputState     = TIM_OutputState_Enable;               
  16.     TIM_OCInitStructure.TIM_Pulse           = (SamplePeriod>>1);//(Õ¼¿Õ)
  17.     TIM_OCInitStructure.TIM_OCPolarity      = TIM_OCPolarity_High;
  18.         TIM_OC4Init(TIM2, &TIM_OCInitStructure);
  19.         TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Disable);//¹Ø±ÕÔ¤×°ÔØ
  20.         TIM_ARRPreloadConfig(TIM2, ENABLE);        //ʹÄÜ×Ô¶¯ÖØ×°
  21. }
复制代码
  1. void ADC_DMA_TIM2Config(void)
  2. {
  3.     GPIO_InitTypeDef GPIO_InitStructure;
  4.    
  5.         /* Enable GPIOA clock */
  6.         RCC_APB2PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
  7.         RCC_APB2PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);

  8.     /* Configure PA.0-7 pin (ADC Channel0 ~ Channel7) as analog input */
  9.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3        |
  10.                                                                   GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
  11.                                                                   
  12.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  13.     GPIO_Init(GPIOA, &GPIO_InitStructure);   

  14.     /* Configure PC.0-3 pin (ADC Channel10 ~ Channel2) as analog input */
  15.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
  16.     GPIO_Init(GPIOC, &GPIO_InitStructure);   

  17.         ADC_DMA_Config();
  18.     ADC_Config();
  19.         TIM2_Config();

  20.         /* Enable DMA request after last transfer (multi-ADC mode) ******************/
  21.         ADC_MultiModeDMARequestAfterLastTransferCmd(ENABLE);
  22.         /* TIM2 main Output Enable */
  23.         TIM_CtrlPWMOutputs(TIM2,ENABLE);       
  24.         //ÍⲿʱÖÓ´¥·¢ADC
  25.         TIM_Cmd(TIM2, ENABLE);
  26. }
复制代码
  1. void DMA2_Stream0_IRQHandler(void)
  2. {
  3.         INT8U err;
  4.         u8 temp;

  5.     if(DMA_GetITStatus(DMA2_Stream0,DMA_IT_TCIF0))
  6.     {
  7.                 if(SampleCounter < HITS) //Öܲ¨²ÉÑùÍê³É
  8.         {
  9.                 temp = DMABufFlag; //±£´æÍê³ÉͨµÀµÄ±êÖ¾
  10.                                                                                         
  11.                 DMABufFlag ^= 0x01;   //ÂÖתͨµÀ
  12.                 DMA2_Stream0->M0AR = (u32)&DMABuf[DMABufFlag][0];//еĽÓÊÕ»º´æÇø
  13.                         //...
  14.                         SampleCounter++;
  15.                         if(SampleCounter >= HITS) //Öܲ¨²ÉÑùÍê³É
  16.                 {
  17.                                 SampleCounter = 0;
  18.                                 //...
  19.                         }

  20.                 } //if(SampleCounter < HITS)
  21.                 else
  22.                         SampleCounter = 0;
  23.             DMA_ClearITPendingBit(DMA2_Stream0,DMA_IT_TCIF0);
  24.     }//end if(DMA_GetITStatus(DMA1_IT_TC1))
  25. }
复制代码
程序预想的流程是:采用ADC1、ADC2规则组对多个通道进行数据采样,用DMA保存采样数据,规则组中所有通道采样完成后备份数据后续处理。
调用ADC_DMA_TIM2Config函数初始化后,程序运行仿真,只能进入一次中断服务程序DMA2_Stream0_IRQHandler,SR寄存器的OVR位被置位,查不出是什么原因。求指点。。。。。。。。。

回复

使用道具 举报

1

主题

4

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
 楼主| 发表于 2015-1-22 15:28:20 | 显示全部楼层
没人啊?
最新进展,溢出是由DMA2_Stream0->M0AR = (u32)&DMABuf[DMABufFlag][0];引起的,好像不能这样操作,DMA改为双缓存模式后,不会溢出,能连续进入DMA2中断服务程序了,DMA初始化函数增加如下代码:
  1.         DMA_DoubleBufferModeConfig(DMA2_Stream0, (uint32_t)DMABuf32[1],DMA_Memory_0);
  2.         DMA_DoubleBufferModeCmd(DMA2_Stream0, ENABLE);
复制代码

但是缓冲区接收不到采样数据。缓存区指示标志CT也不会变化。
回复 支持 反对

使用道具 举报

1

主题

4

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
 楼主| 发表于 2015-1-23 14:12:27 | 显示全部楼层
没事了,可以正常用了,是我自己不熟悉407的库,很多地方应用很103的搞混了
回复 支持 反对

使用道具 举报

0

主题

3

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
发表于 2015-10-16 01:36:41 | 显示全部楼层
最近也在做,楼主做的很好,已经做出来了吗?求发一份程序学习学习。
回复 支持 反对

使用道具 举报

0

主题

3

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
发表于 2015-10-16 01:37:11 | 显示全部楼层
2285633228@qq.com,多谢!
回复 支持 反对

使用道具 举报

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