STM32F07x ADC/DMA Problemi

Başlatan FxDev, 11 Aralık 2014, 17:20:05

FxDev

Merhabalar,

ADC'deki kanalları DMA'ya aktarıp okuma yapmak istiyorum. STD Library'ideki kodu denememe rağmen başarılı olamıyorum. Kanalları tek tek DMA transfer ettiğimde sorun yok yalnız ne zaman çok kanal bağlasam bir problem oluşuyor. Neyi yanlış yapıyorum?

void General_ADC_Init(void)
{
	ADC_InitTypeDef     ADC_InitStructure;
  GPIO_InitTypeDef    GPIO_InitStructure;
	
	/* ADC1 DeInit */
  ADC_DeInit(ADC1);
	
	/* GPIOC Periph clock enable */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
  
	/* ADC1 Periph clock enable */
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
	
	GPIO_InitStructure.GPIO_Pin 			= GPIO_Pin_0 |  GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Mode 			= GPIO_Mode_AN;
  GPIO_InitStructure.GPIO_PuPd 			= GPIO_PuPd_NOPULL ;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	/* Initialize ADC structure */
  ADC_StructInit(&ADC_InitStructure);
	
	/* Configure the ADC1 in continuous mode withe a resolution equal to 12 bits  */
  ADC_InitStructure.ADC_Resolution 						= ADC_Resolution_12b;
  ADC_InitStructure.ADC_ContinuousConvMode 		= ENABLE; 
  ADC_InitStructure.ADC_ExternalTrigConvEdge 	= ADC_ExternalTrigConvEdge_None;
  ADC_InitStructure.ADC_DataAlign 						= ADC_DataAlign_Right;
  ADC_InitStructure.ADC_ScanDirection 				= ADC_ScanDirection_Upward;
  ADC_Init(ADC1, &ADC_InitStructure);
	
	  /* Convert the ADC1 Channel11 and channel10 with 55.5 Cycles as sampling time */ 
  ADC_ChannelConfig(ADC1, ADC_Channel_8 , ADC_SampleTime_55_5Cycles); 
  
  /* Convert the ADC1 temperature sensor  with 55.5 Cycles as sampling time */ 
  ADC_ChannelConfig(ADC1, ADC_Channel_TempSensor , ADC_SampleTime_55_5Cycles);  
  ADC_TempSensorCmd(ENABLE);
//  
//  /* Convert the ADC1 Vref  with 55.5 Cycles as sampling time */ 
//  ADC_ChannelConfig(ADC1, ADC_Channel_Vrefint , ADC_SampleTime_55_5Cycles); 
//  ADC_VrefintCmd(ENABLE);
//  
//  /* Convert the ADC1 Vbat with 55.5 Cycles as sampling time */ 
//  ADC_ChannelConfig(ADC1, ADC_Channel_Vbat , ADC_SampleTime_55_5Cycles);  
//  ADC_VbatCmd(ENABLE);
  
  /* ADC Calibration */
  ADC_GetCalibrationFactor(ADC1);
  
  /* ADC DMA request in circular mode */
  ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);
  
  /* Enable ADC_DMA */
  ADC_DMACmd(ADC1, ENABLE);  
  
  /* Enable the ADC peripheral */
  ADC_Cmd(ADC1, ENABLE);     
  
  /* Wait the ADRDY flag */
  while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADRDY)); 
  
  /* ADC1 regular Software Start Conv */ 
  ADC_StartOfConversion(ADC1);
}

void General_DMA_Init(void)
{
  DMA_InitTypeDef   DMA_InitStructure;
	
  /* DMA1 clock enable */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1 , ENABLE);
	
	DMA_DeInit(DMA1_Channel1);
  
  /* DMA1 Channel1 Config */
  DMA_DeInit(DMA1_Channel1);
  DMA_InitStructure.DMA_PeripheralBaseAddr 		= (uint32_t)&ADC1->DR;
  DMA_InitStructure.DMA_MemoryBaseAddr 				= (uint32_t)&RegularConvData_Tab[0];
  DMA_InitStructure.DMA_DIR 									= DMA_DIR_PeripheralSRC;
  DMA_InitStructure.DMA_BufferSize 						= 2;
  DMA_InitStructure.DMA_PeripheralInc 				= DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc 						= DMA_MemoryInc_Enable;
  DMA_InitStructure.DMA_PeripheralDataSize 		= DMA_PeripheralDataSize_HalfWord;
  DMA_InitStructure.DMA_MemoryDataSize 				= DMA_MemoryDataSize_HalfWord;
  DMA_InitStructure.DMA_Mode 									= DMA_Mode_Circular;
  DMA_InitStructure.DMA_Priority 							= DMA_Priority_High;
  DMA_InitStructure.DMA_M2M 									= DMA_M2M_Disable;
  DMA_Init(DMA1_Channel1, &DMA_InitStructure);
  /* DMA1 Channel1 enable */
  DMA_Cmd(DMA1_Channel1, ENABLE);
  
}
Forumda bazı bağnaz kişiler tarafından engellenip, atıldım. Tüm bu bağnaz kişilere rağmen Atatürkçülüğü sonuna kadar savunacağım; onlar da bağnazlıklarında boğulacaklar. Haberleşme için: info[at]firatdeveci.com / ©firatdeveci.com - ße Different Everytime!

Gökhan BEKEN

ADC_InitStructure.ADC_NbrOfConversion = 2; //2 kanal kullan
ile kaç kanal kullanacağınızı belirtmeniz gerkeiyor.
Özel mesaj okumuyorum, lütfen göndermeyin.

FxDev

Akşam bir bakacağım yalnız sanki std_lib de böyle bir şey yoktu..
Forumda bazı bağnaz kişiler tarafından engellenip, atıldım. Tüm bu bağnaz kişilere rağmen Atatürkçülüğü sonuna kadar savunacağım; onlar da bağnazlıklarında boğulacaklar. Haberleşme için: info[at]firatdeveci.com / ©firatdeveci.com - ße Different Everytime!

FxDev

STM32F07x std_lib de böyle bir değişken yok ve hala sorunumu çözmüş değilim..
Forumda bazı bağnaz kişiler tarafından engellenip, atıldım. Tüm bu bağnaz kişilere rağmen Atatürkçülüğü sonuna kadar savunacağım; onlar da bağnazlıklarında boğulacaklar. Haberleşme için: info[at]firatdeveci.com / ©firatdeveci.com - ße Different Everytime!

HexfeT

ADC_InitStructure.ADC_NbrOfChannel = 2;

Olabilir mi?

FxDev

Arkadaşlar sorunu çözdüm.

Şimdi ben değişken olarak DMA'ya unsigned int bir değişken veriyordum ARM'Da unsigned int 32 bite eşit olduğu için, ADC'de 12 bitlik çevrim yaptığından adam şöyle yerleştiriyordu.

unsigned int Degisken [4];

Degisken[0]=0x091007DE
Degisken[1]=0x010F0602
Degisken[2]=0
Degisken[3]=0

Kafayı kırdım sorunu çözemedim derken bir şey fark ettim. ADC 12 bitlik olduğu için bu adam 12 bitlik veri yazamadığından buraya 16bitlik veri boyutu hazırlayıp ilk dizi karekterinin ilk 16lık pakedine 1. değeri sonraki 16 pakedine 2. değeri yazıyordu. Sorunu şöyle çözdüm!

unsigned short Degisken [4];   // Short değişkeni 16bitlik

Degisken[0]=0x07DE
Degisken[1]=0x0910
Degisken[2]=0x0602
Degisken[3]=0x010F

Artık şunu anladım ki değişken tanımlamalarında int kullanmayacağım. unsigned short (16bit) unsigned long (32 bit) kullanmak gerek.

DMA'nın bunu neden böyle yaptığını bu şekilde açıkladım ama mantıklı bir şeyi varsa dinlemek isterim. Not hiç datasheet kurcalamadım.
Forumda bazı bağnaz kişiler tarafından engellenip, atıldım. Tüm bu bağnaz kişilere rağmen Atatürkçülüğü sonuna kadar savunacağım; onlar da bağnazlıklarında boğulacaklar. Haberleşme için: info[at]firatdeveci.com / ©firatdeveci.com - ße Different Everytime!

Klein

 DMA_InitStructure1.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
yerine
DMA_InitStructure1.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
kullanırsanız , sorunununuz çözülür muhtemelen.

FxDev

#7
Alıntı yapılan: Klein - 12 Aralık 2014, 01:33:09
DMA_InitStructure1.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
yerine
DMA_InitStructure1.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
kullanırsanız , sorunununuz çözülür muhtemelen.

Hay sen bin yaşa Klein!
İşte mantıklı bir açıklama ve dediğiniz üzere unsigned long üzerinde Word yapınca işlem tamam!
Forumda bazı bağnaz kişiler tarafından engellenip, atıldım. Tüm bu bağnaz kişilere rağmen Atatürkçülüğü sonuna kadar savunacağım; onlar da bağnazlıklarında boğulacaklar. Haberleşme için: info[at]firatdeveci.com / ©firatdeveci.com - ße Different Everytime!

AsHeS

short long int yerine stdint.h kutuphanesinde ki tanımlamalar daha açıklayıcı oluyor uint32_t ve uint16_t gibi gcc ile kullandığım tüm ide lerde mevcuttu