OpenEdv-开源电子网

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

STM32F103 5通道ADC DMA转换无数据输出

[复制链接]

2

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2016-6-10
在线时间
11 小时
发表于 2016-6-10 15:43:15 | 显示全部楼层 |阅读模式
1金钱
小弟使用STM32F103VC对PA0~PA4进行ADC转换并使用DMA,但却没有数据输出,求高手指点。附件是整个工程,代码如下:
#include "stm32f10x.h"
#include "stdio.h"
#include "led.h"
#include "delay.h"
#define M 5 //¶ÔÓ¦5¸öADCͨµÀ
#define N 10  //ÿ¸öͨµÀת»»50´Î
/*****¶¨ÒåADC1ÍâÉèÊý¾Ý¼Ä´æÆ÷µØÖ·*********/
#define ADC1_DR_Address  ((uint32_t)0x4001244C)  
uint16_t ADCConvertedValue[N][M]; //ÁÙʱ´æ·ÅADת»»µÄÊ®½øÖƵçѹ
uint16_t After_ADValue[M];  //´æ·Åȡƽ¾ùÖµºóµÄµçѹ
uint16_t Advalue;

void My_ADC_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef  ADC_InitStructure;
/****¿ªÆôGPIOAºÍADC1ʱÖÓ*****/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1 | RCC_APB2Periph_AFIO,ENABLE);
/********ÉèÖÃADC1ʱÖÓ72/6=12MHZ*******/
RCC_ADCCLKConfig(RCC_PCLK2_Div6);

  /****ÅäÖ&AtildeA0-4ΪģÄâÊäÈë******/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
//GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);

/****³õʼ»¯ADC1*******/
/****5¸öת»»Í¨µÀ£¬Á¬ÐøÄ£Ê½£¬É¨Ãèģʽ£¬Êý¾ÝÓÒ¶ÔÆë£¬ADC1ºÍADC2¶ÀÁ¢¹¤×÷£¬Èí¼þÆô¶¯×ª»»*****/
ADC_DeInit(ADC1);

ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;  //Á¬Ðø×ª»»Ä£Ê½
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;  //Êý¾ÝÓÒ¶ÔÆë
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //Èí¼þÆô¶¯×ª»»
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;  //ADC1ºÍADC2¹¤×÷ÖжÀÁ¢Ä£Ê½
ADC_InitStructure.ADC_NbrOfChannel = 5;  //ͨµÀÊý5
ADC_InitStructure.ADC_ScanConvMode = ENABLE;  //¹¤×÷Á¬ÐøÉ¨Ãèģʽ
ADC_Init(ADC1,&ADC_InitStructure);

/****É趨5¸öͨµÀµÄת»»Ë³ÐòºÍ²ÉÑùʱ¼ä*****/
ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1,ADC_Channel_1,2,ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1,ADC_Channel_2,3,ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1,ADC_Channel_3,4,ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1,ADC_Channel_4,5,ADC_SampleTime_239Cycles5);

ADC_DMACmd(ADC1,ENABLE); //ʹÄÜADC1µÄDMA
ADC_Cmd(ADC1,ENABLE); //ʹÄÜADC1
ADC_ResetCalibration(ADC1); //¸´Î»ADC1У׼
while(ADC_GetResetCalibrationStatus(ADC1));//µÈ´ýADC1Íê³É¸´Î»Ð£×¼
ADC_StartCalibration(ADC1); //ÖØÐÂУ׼ADC1
while(ADC_GetCalibrationStatus(ADC1)); //µÈ´ýADC1У׼Íê³É

/*******Æô¶¯ADC1ת»»*********/
ADC_SoftwareStartConvCmd(ADC1,ENABLE);
}
void ADC_DMA_Init()
{
  DMA_InitTypeDef  DMA_InitStructure;
/*****ʹÄÜDMA1ʱÖÓ*****/
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);

/*****DMA1µÄADC1³õʼ»¯****/
DMA_DeInit(DMA1_Channel1);

DMA_InitStructure.DMA_BufferSize = M; //¶¨ÒåDMA»º´æ´óС£¬¿ª±Ù5¸öÄÚ´æ¿Õ¼ä£¬ÒòΪÐèÒªÓõ½5¸öADCͨµÀ
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //¶¨ÒåAD×÷ΪÊý¾Ý´«ÊäµÄÀ´Ô´
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;  //ÉèÖÃDMAͨµÀÊÇÄÚ´æµ½ÄÚ´æ´«Êä
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADCConvertedValue; //ÄÚ´æ»ùµØÖ·£¬¸æËßDMA½«´ÓADCÈ¡À´µÄÊý¾Ý´æ·ÅÔÚ´Ë
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;  //ÄÚ´æÊý¾Ý¿í¶È16λ
DMA_InitStructure.DMA_MemoryInc = DMA_PeripheralInc_Enable;  //¶¨ÒåÄÚ´æµØÖ·µÝÔö
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;  //¹¤×÷ÔÚÑ »·»º´æÄ£Ê½
DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; //ÍâÉè»ùµØÖ·£¬¸æËßDMA´Ó´ËÈ¡Êý¾Ý
//DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR; //ÍâÉè»ùµØÖ·£¬¸æËßDMA´Ó´ËÈ¡Êý¾Ý
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //ÍâÉèÊý¾Ý¿í¶È16λ
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //É趨¼Ä´æÆ÷µØÖ·¹Ì¶¨£¬¸æËßDMAÖ»´Ó1¸öµØÖ·È¡Êý¾Ý
DMA_InitStructure.DMA_Priority = DMA_Priority_High;  //ÉèÖøßÓÅÏȼ¶
DMA_Init(DMA1_Channel1,&DMA_InitStructure);  //³õʼ»¯DMAͨµÀ1
DMA_Cmd(DMA1_Channel1,ENABLE);  //ʹÄÜDMAͨµÀ1
}
/*********»ñÈ¡µçѹ*********/
uint16_t Get_voltage(uint16_t advalue)
{
advalue=advalue*330/4096;
Advalue = advalue;
  return Advalue;
}
/*********µçѹÇ󯽾ù********/
void Average_ADValue()
{
  uint32_t sum=0;
uint8_t  count,i;
for(i=0;i<M;i++)
{
    for(count=0;count<N;count++)
   {
     sum+=ADCConvertedValue[count][i];
   }
   After_ADValue[i]=sum/N;
   sum=0;
}
}
void MY_USART1_Init(void)
{
USART_InitTypeDef USART_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);

  USART_InitStructure.USART_BaudRate = 115200;//&sup2;¨&Igrave;&Oslash;&Acirc;&Ecirc;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;//8&Icirc;&raquo;&Ecirc;&yacute;&frac34;&Yacute;
  USART_InitStructure.USART_StopBits = USART_StopBits_1;//&Ocirc;&Uacute;&Ouml;&iexcl;&frac12;á&Icirc;&sup2;&acute;&laquo;&Ecirc;&auml;1&cedil;&ouml;&Iacute;&pound;&Ouml;&sup1;&Icirc;&raquo;
  USART_InitStructure.USART_Parity = USART_Parity_No;//&Icirc;&THORN;&ETH;&pound;&Ntilde;é
  USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;//·&cent;&Euml;&Iacute;&ordm;&Iacute;&frac12;&Oacute;&Ecirc;&Otilde;&para;&frac14;&Ecirc;&sup1;&Auml;&Uuml;
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//&Oacute;&sup2;&frac14;&thorn;&Aacute;÷&iquest;&Oslash;&Ouml;&AElig;&Ecirc;§&Auml;&Uuml;
  USART_Init(USART1,&USART_InitStructure);

USART_Cmd(USART1, ENABLE);//&Ecirc;&sup1;&Auml;&Uuml;&raquo;ò&Otilde;&szlig;&Ecirc;§&Auml;&Uuml;USART&Iacute;&acirc;&Eacute;è
  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//&Ecirc;&sup1;&Auml;&Uuml;&raquo;ò&Otilde;&szlig;&Ecirc;§&Auml;&Uuml;&Ouml;&cedil;&para;¨&micro;&Auml;USART&Ouml;&ETH;&para;&Iuml;
  
NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
  NVIC_Init(&NVIC_InitStructure);
}

int main(void)
{
uint16_t value[M];
uint8_t i;
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
delay_init();
  MY_USART1_Init();
LED_Pin();
My_ADC_Init();
ADC_DMA_Init();
//GPIO_SetBits(GPIOB,GPIO_Pin_0);
while(1)
{
  LED();
   while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);  //&micro;&Egrave;&acute;&yacute;&acute;&laquo;&Ecirc;&auml;&Iacute;ê&sup3;&Eacute;&pound;&not;·&ntilde;&Ocirc;ò&micro;&Uacute;&Ograve;&raquo;&Icirc;&raquo;&Ecirc;&yacute;&frac34;&Yacute;&Egrave;&Yacute;&Ograve;×&para;&ordf;&Ecirc;§
  for(i=0;i<5;i++)
  {
   //LED();
    value[i]=Get_voltage(After_ADValue[i]);
   printf("value[%d]:\t%d.%dv\n",i,value[i]/100,value[i]%100);
   delay_ms(500);
  }
}

}

STM32多通道ADC转换测试 - 副本.zip

303.06 KB, 下载次数: 86

最佳答案

查看完整内容[请看2#楼]

已经解决了,DMA初始化里把DMA_PeripheralInc和DMA_MemoryInc的值错写成一样的了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2016-6-10
在线时间
11 小时
 楼主| 发表于 2016-6-10 15:43:16 | 显示全部楼层
已经解决了,DMA初始化里把DMA_PeripheralInc和DMA_MemoryInc的值错写成一样的了
回复

使用道具 举报

4

主题

11

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
265
金钱
265
注册时间
2015-5-30
在线时间
85 小时
发表于 2016-6-12 08:57:25 | 显示全部楼层
谢谢分享!
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2016-6-25
在线时间
2 小时
发表于 2016-7-29 15:55:08 | 显示全部楼层
暗星归来 发表于 2016-6-10 15:43
已经解决了,DMA初始化里把DMA_PeripheralInc和DMA_MemoryInc的值错写成一样的了

你的附件里面是不一样的啊,
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_PeripheralInc_Enable;

附件的程序还是没有输出啊。。。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-10 02:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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