OpenEdv-开源电子网

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

ADC+DMA传输出线问题

[复制链接]

5

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
90
金钱
90
注册时间
2019-4-1
在线时间
18 小时
发表于 2019-4-1 21:34:51 | 显示全部楼层 |阅读模式
源码:
u32 adc_data;                                                                                                                  
void  Adc_Init(void)
{   
  GPIO_InitTypeDef  GPIO_InitStructure;
        ADC_CommonInitTypeDef ADC_CommonInitStructure;
        ADC_InitTypeDef       ADC_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
       
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//ê1ÄüGPIOAê±Öó
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //ê1ÄüADC1ê±Öó

  //Ïè3õê¼»ˉADC1í¨μà5 IO¿ú
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;//PA5 í¨μà5
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;//Ä£Äaêäèë
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;//2»′øéÏÏÂà-
  GPIO_Init(GPIOA, &GPIO_InitStructure);//3õê¼»ˉ  

        RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE);          //ADC1¸′λ
        RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE);        //¸′λ½áêø         

       
  ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;//¶àá¢Ä£ê½
  ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;//ὸö2éÑù½×¶ÎÖ®¼äμÄÑó3ù5¸öê±Öó
  ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_1; //DMAê§Äü
  ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;//Ô¤·ÖÆμ4·ÖÆμ¡£ADCCLK=PCLK2/4=84/4=21Mhz,ADCê±Öó×îoÃ2»òa3¬1y36Mhz
  ADC_CommonInit(&ADC_CommonInitStructure);//3õê¼»ˉ
       
  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;//12λÄ£ê½
  ADC_InitStructure.ADC_ScanConvMode = DISABLE;//·Çé¨Ãèģ꽠      
  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//¿aÆôá¬Dø×a»»
  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;//½ûÖ1′¥·¢¼ì2a£¬ê1óÃèí¼t′¥·¢
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//óò¶ÔÆë       
  ADC_InitStructure.ADC_NbrOfConversion = 1;//1¸ö×a»»Ôú1æÔòDòáDÖD ò2¾íêÇÖ»×a»»1æÔòDòáD1
  ADC_Init(ADC1, &ADC_InitStructure);//ADC3õê¼»ˉ
       
        ADC_ITConfig(ADC1,ADC_IT_EOC,ENABLE);//ADCÖD¶Ï¿aÆô
        ADC_Cmd(ADC1, ENABLE);//¿aÆôAD×a»»Æ÷       
        ADC_DMACmd(ADC1,ENABLE);//¿aÆôADCμÄDMA
  NVIC_InitStructure.NVIC_IRQChannel = ADC_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//ÇàÕ¼óÅÏè¼¶3
        NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;                //×óóÅÏè¼¶3
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQí¨μàê1Äü
        NVIC_Init(&NVIC_InitStructure);        //¸ù¾YÖ¸¶¨μÄ2Îêy3õê¼»ˉVIC¼Ä′æÆ÷
       
        ADC_RegularChannelConfig(ADC1, 4, 1, ADC_SampleTime_480Cycles);
}       
void ADC_IRQHandler(void)
{   
        if(ADC_GetITStatus(ADC1,ADC_IT_EOC)==SET)
  {
                usart4.printf("the orginal data:%d\r\n",ADC_GetConversionValue(ADC1));   
                MYDMA_Enable(DMA2_Stream0,32);                /*??DMA*/        
    usart4.printf("the dma data:%d\r\n",adc_data);
               

                ADC_ClearITPendingBit(ADC1, ADC_IT_EOC);      //????????
                //usart4.printf("flag\r\n");
  }       
}
/////////////////////////////////////////////////////////////////////////////////////////////
#include "..\include\dma.h"       
#include "..\include\usart.h"       
#include "delay.h"                 
// streamxêy¾Yá÷ chxí¨μàÑ¡Ôñ paríaéèμØÖ· mar′æ′¢Æ÷μØÖ· ndtrêy¾Y′«êäá¿
void MYDMA_Config(DMA_Stream_TypeDef *DMA_Streamx,u32 chx,u32 par,u32 mar,u16 ndtr)
{

        DMA_InitTypeDef  DMA_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
        if((u32)DMA_Streamx>(u32)DMA2)//????stream???DMA2??DMA1
        {
          RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);//DMA2????
               
        }else
        {
          RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE);//DMA1????
        }
  DMA_DeInit(DMA_Streamx);
       
        while (DMA_GetCmdStatus(DMA_Streamx) != DISABLE){}//??DMA???
       
  /* ?? DMA Stream */
  DMA_InitStructure.DMA_Channel = chx;  //????
  DMA_InitStructure.DMA_PeripheralBaseAddr = par;//DMA????
  DMA_InitStructure.DMA_Memory0BaseAddr = mar;//DMA ???0??
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;//????????
  DMA_InitStructure.DMA_BufferSize = ndtr;//?????
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//???????
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//???????
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//??????:8?
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//???????:8?
  DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;// ??????
  DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//?????
  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;         
  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;//?????????
  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//????????
  DMA_Init(DMA_Streamx, &DMA_InitStructure);//???DMA Stream
               
        DMA_ITConfig(DMA2_Stream0,DMA_IT_TC, ENABLE);
        NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream0_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//ÇàÕ¼óÅÏè¼¶3
        NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;                //×óóÅÏè¼¶3
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQí¨μàê1Äü
        NVIC_Init(&NVIC_InitStructure);       

}
//????DMA??
//DMA_StreamxMA???,DMA1_Stream0~7/DMA2_Stream0~7
//ndtr:?????  
void MYDMA_Enable(DMA_Stream_TypeDef *DMA_Streamx,u16 ndtr)
{

        DMA_Cmd(DMA_Streamx, DISABLE);                      //??DMA??
       
        while (DMA_GetCmdStatus(DMA_Streamx) != DISABLE){}        //??DMA?????  
               
        DMA_SetCurrDataCounter(DMA_Streamx,ndtr);          //?????  
        DMA_Cmd(DMA_Streamx, ENABLE);  
                 //??DMA??
}       
void DMA2_Stream0_IRQHandler(void)
{
        usart4.printf("flag\r\n");
        if(DMA_GetFlagStatus(DMA2_Stream0,DMA_FLAG_TCIF0)!=RESET)//μè′yDMA2_Steam7′«êäíê3é
        {
               
               
                DMA_ClearFlag(DMA2_Stream0,DMA_FLAG_TCIF0);//Çå3yDMA2_Steam7′«êäíê3é±êÖ¾
        }       
}


为什么只传输一次就不传输了?


         




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

使用道具 举报

6

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
133
金钱
133
注册时间
2015-7-23
在线时间
28 小时
发表于 2019-4-2 08:54:42 | 显示全部楼层
寄存器ADC_CR2的DDS位 置1了吗?
回复 支持 反对

使用道具 举报

4

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2019-4-3
在线时间
40 小时
发表于 2019-4-3 10:56:13 | 显示全部楼层
用的是h7的板子吗
回复 支持 反对

使用道具 举报

0

主题

160

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
226
金钱
226
注册时间
2019-3-4
在线时间
4 小时
发表于 2019-4-3 11:51:08 | 显示全部楼层
看不明白!嘿嘿
回复 支持 反对

使用道具 举报

4

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2019-4-3
在线时间
40 小时
发表于 2019-4-8 10:00:01 | 显示全部楼层

我最近也是遇到这个问题,但和你做的不一样,你解决了吗?
回复 支持 反对

使用道具 举报

7

主题

40

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2018-7-24
在线时间
13 小时
发表于 2019-4-8 11:20:40 | 显示全部楼层
一定是这个     把DMA模式改成circular   就是这句  你从枚举中找全名忘了 反正就两种   你当前是这个  DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;   
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-11 14:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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