OpenEdv-开源电子网

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

STM32F030C8ADC-DMA多通道

[复制链接]

1

主题

6

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2019-3-12
在线时间
2 小时
发表于 2019-3-17 15:02:23 来自手机 | 显示全部楼层 |阅读模式
没有转换的数据,哪位大给个例程,谢谢
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2019-3-12
在线时间
2 小时
 楼主| 发表于 2019-3-17 15:14:01 | 显示全部楼层
#include "ADC.h"
#include "stm32f0xx_adc.h"
#include "stm32f0xx_dma.h"
#include "delay.h"
#define N  101
uint16_t RegularConvData_Tab[101][4];
void ADC_NAN_Init(void)
{
        ADC_InitTypeDef          ADC_InitStructure;
        DMA_InitTypeDef          DMA_InitStructure;
        GPIO_InitTypeDef         GPIO_InitStructure;

        //GPIOC Periph clock enable
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);

        //ADC1 Periph clock enable
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1 , ENABLE);
//DMA
        DMA_DeInit(DMA1_Channel1);        //DMAí¨μà
  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;//ADC1_DR_Address;//íaéèμØÖ·&ADC1->DR
  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)RegularConvData_Tab;//Äú′æμØÖ·
       
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//íaéè×÷Îaêy¾Y′«êäμÄà′Ô′
  DMA_InitStructure.DMA_BufferSize = 404;//»o3åÇøμÄ′óD¡óëêy×éμĸöêyò»Ñù
       
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//íaéèμØÖ·¼Ä′æÆ÷2»±ä
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//Äú′æμØÖ·¼Ä′æÆ÷μYÔö
       
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//êy¾Y¿í¶èÎa16λ
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//êy¾Y¿í¶èÎa16λ
       
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//á¬Dø2»¶Ï1¤×÷Ä£ê½
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;//DMA_Priorityé趨DMAí¨μàxμÄèí¼tóÅÏè¼¶
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//DMAí¨μàxûóDéèÖÃÎaÄú′æμ½Äú′æ′«êä
       
  DMA_Init(DMA1_Channel1, &DMA_InitStructure);
        DMA_Cmd(DMA1_Channel1, ENABLE);// DMA1 Channel1 enable        
       
        //Configure ADC Channel11 as analog input
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

        //ADC1 Configuration
        //ADCs DeInit
        ADC_DeInit(ADC1);
       
        ADC_StructInit(&ADC_InitStructure);//???ADC??
        ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;//ADC·Ö±æÂê
        ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//1¤×÷Ôúá¬Dø×a»»Ä£ê½
       
        ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;//×a»»óéèí¼t¶ø2»êÇía2¿′¥·¢Æô¶ˉ   
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//ADCêy¾Yóò¶ÔÆë
//ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_TRGO;
        ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Backward;//äˉàà·½Ïò
        ADC_Init(ADC1, &ADC_InitStructure);

        //ADC1×a»»í¨μ࣬ÖüÆú2éÑùê±¼ä
        ADC_ChannelConfig(ADC1, ADC_Channel_1 , ADC_SampleTime_239_5Cycles);//PA1
  ADC_ChannelConfig(ADC1, ADC_Channel_2 , ADC_SampleTime_239_5Cycles);//PA2
  ADC_ChannelConfig(ADC1, ADC_Channel_3 , ADC_SampleTime_239_5Cycles);//PA3
        ADC_ChannelConfig(ADC1, ADC_Channel_4 , ADC_SampleTime_239_5Cycles);//PA4
       
        ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular); // Enable ADC_DMA
  ADC_GetCalibrationFactor(ADC1);//ADCD£×¼
        ADC_Cmd(ADC1, ENABLE); //ÆôóÃADCíaéè
        ADC_DMACmd(ADC1, ENABLE);
        while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN)); //μè′yADC1D£×¼íê3é
        //ADC_SoftwareStartConvCmd(ADC1, ENABLE);  
                       
        ADC_StartOfConversion(ADC1);
}
uint32_t count,i,j,a,temp;
uint32_t ResultVolt[4];
//ch:í¨μàÖμ 1~4w
Get_Adc()   
{
for(a=0;a<4;a++)//M-í¨μàêy
        {
                ResultVolt[a]=0;
                for(j=0;j<N;j++)
                {
                ResultVolt[a]+=RegularConvData_Tab[j][a];
                }
                ResultVolt[a]=ResultVolt[a]/N;
         /*for (j=0;j<N-1;j++)  
   {  
    for (i=0;i<N-j;i++)  
     {  
       if ( RegularConvData_Tab[i][a]>RegularConvData_Tab[i+1][a] )  
       {  
         temp = RegularConvData_Tab[i][a];  
         RegularConvData_Tab[i][a] = RegularConvData_Tab[i+1][a];   
         RegularConvData_Tab[i+1][a] = temp;  
       }  
     }  
   }  */
         //ResultVolt[a]=RegularConvData_Tab[(N-1)/2][a];
   //return ResultVolt[a];
       
}
       
}



回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2019-3-12
在线时间
2 小时
 楼主| 发表于 2019-3-17 15:16:04 | 显示全部楼层
main()
{

        Get_Adc();
                                TX_Buffer[3]= ResultVolt[0]/4095*3.3;
                                TX_Buffer[2]= ResultVolt[1]/4095*3.3;
                          UartASendStr(TX_Buffer,25);
                           IsrPerSecAccor = 0;
}
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2019-3-12
在线时间
2 小时
 楼主| 发表于 2019-3-17 15:16:56 | 显示全部楼层
以上是我的代码,希望大神们指点,谢谢
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-24 00:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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