STM32F103C8T6 CUBE MX VE KEIL5 DERS 2 SYSTICK , DMA, ADC

Başlatan skara1214, 11 Kasım 2016, 01:59:07

skara1214

2. ders hayırlı olsun ---konuyu arm öğreniyoruza açamıyorum o yüzden buraya açtım

https://www.youtube.com/watch?v=1NGsEaB2aCg&feature=youtu.be
//ADC DMA1 1. KANAL
#define  ADC1_DMA_MEMTOMEM_ENABLE    			hdma_adc1.Instance->CCR|=0x00004000 //memory to memory dma aktarimi enable
#define  ADC1_DMA_MEMTOMEM_DISABLE   			hdma_adc1.Instance->CCR&=0xFFFFBFFF //memory to memory dma aktarimi dsable

#define  ADC1_DMA_PRIORITY_LOW		      		        hdma_adc1.Instance->CCR&=0xFFFFCFFF //dma kanal onceligi secimi
#define  ADC1_DMA_PRIORITY_MEDIUM      			        hdma_adc1.Instance->CCR|=0x00001000 //dma kanal onceligi secimi
#define  ADC1_DMA_PRIORITY_HIGH      				hdma_adc1.Instance->CCR|=0x00002000 //dma kanal onceligi secimi
#define  ADC1_DMA_PRIORITY_VERYHIGH  				hdma_adc1.Instance->CCR|=0x00003000 //dma kanal onceligi secimi

#define  ADC1_DMA_MEMORYSIZE_8BITS		      		hdma_adc1.Instance->CCR&=0xFFFFF3FF //memoryden okunacak yazilacak bilgi boyutu
#define  ADC1_DMA_MEMORYSIZE_16BITS      		        hdma_adc1.Instance->CCR|=0x00000400 //memoryden okunacak yazilacak bilgi boyutu
#define  ADC1_DMA_MEMORYSIZE_32BITS     			hdma_adc1.Instance->CCR|=0x00000800 //memoryden okunacak yazilacak bilgi boyutu

#define  ADC1_DMA_PERIPHERALSIZE_8BITS		      	hdma_adc1.Instance->CCR&=0xFFFFFCFF //peripheralden okunacak yazilacak bilgi boyutu 
#define  ADC1_DMA_PERIPHERALSIZE_16BITS      		hdma_adc1.Instance->CCR|=0x00000100 //peripheralden okunacak yazilacak bilgi boyutu 
#define  ADC1_DMA_PERIPHERALSIZE_32BITS     		hdma_adc1.Instance->CCR|=0x00000200 //peripheralden okunacak yazilacak bilgi boyutu 

#define  ADC1_DMA_MEMINC_ENABLE    				hdma_adc1.Instance->CCR|=0x00000080 //memory adres yukseltme enable
#define  ADC1_DMA_MEMINC_DISABLE   				hdma_adc1.Instance->CCR&=0xFFFFFF7F //memory adres yukseltme disable

#define  ADC1_DMA_PERIPINC_ENABLE    				hdma_adc1.Instance->CCR|=0x00000040 //peripheral adres yukseltme enable 
#define  ADC1_DMA_PERIPINC_DISABLE   			        hdma_adc1.Instance->CCR&=0xFFFFFFBF //peripheral adres yukseltme disable

#define  ADC1_DMA_CIRCULAR_ENABLE    			hdma_adc1.Instance->CCR|=0x00000020 //circular yani isi bittiginde basa donme modu enable
#define  ADC1_DMA_CIRCULAR_DISABLE   			hdma_adc1.Instance->CCR&=0xFFFFFFDF //circular yani isi bittiginde basa donme modu disable

#define  ADC1_DMA_READ_FROM_MEMORY               	hdma_adc1.Instance->CCR|=0x00000010 //memoryden okunup peripherale yazilacagini belirtme
#define  ADC1_DMA_READ_FROM_PERIPHERAL   		hdma_adc1.Instance->CCR&=0xFFFFFFEF //periperalden okunup memoriye yazilacagini belirtme

#define  ADC1_DMA_TRANSFER_ERROR_INTERRUPT_ENABLE            hdma_adc1.Instance->CCR|=0x00000008 //transfer error interrupti enable
#define  ADC1_DMA_TRANSFER_ERROR_INTERRUPT_DISABLE   	hdma_adc1.Instance->CCR&=0xFFFFFFF7 //transfer error interrupti disable

#define  ADC1_DMA_HALF_TRANSFER_INTERRUPT_ENABLE               	hdma_adc1.Instance->CCR|=0x00000004 //half transfer interrupti enable
#define  ADC1_DMA_HALF_TRANSFER_INTERRUPT_DISABLE   	        hdma_adc1.Instance->CCR&=0xFFFFFFFB //half transfer interrupti disable

#define  ADC1_DMA_TRANSFER_COMPLETE_INTERRUPT_ENABLE       hdma_adc1.Instance->CCR|=0x00000002 //transfer complete  interrupti enable
#define  ADC1_DMA_TRANSFER_COMPLETE_INTERRUPT_DISABLE     hdma_adc1.Instance->CCR&=0xFFFFFFFD //transfer complete  interrupti disable

#define  ADC1_DMA_NUMBER_DATA_TRANSFER            		        hdma_adc1.Instance->CNDTR //kac data tasinacagini belirten register
#define  ADC1_DMA_PERIPHERAL_ADDRESS           			        hdma_adc1.Instance->CPAR  //periperhalin adresini tutan register
#define  ADC1_DMA_MEMORY_ADDRESS           				        hdma_adc1.Instance->CMAR  //memorynin adresini tutan register

#define  ADC1_DMA_CHANNEL_ENABLE             		                        hdma_adc1.Instance->CCR|=0x00000001 //dma kanali enable
#define  ADC1_DMA_CHANNEL_DISABLE   				                hdma_adc1.Instance->CCR&=0xFFFFFFFE //dma kanali disable


uint16_t adc_value[10],y=0;
void ADC_CALIBRATION()
{
   ADC1->CR2|=0x00000001;//adc yi baslat
   ADC1->CR2|=0x00000008;//adc reset calibration yap
   while(ADC1->CR2&0x00000008);//reset calibration olana kadar bekle
   ADC1->CR2|=0x00000004;//adc calibrationi baslat
   while(ADC1->CR2&0x00000004);//adc calibre olana kadar bekle
 	__HAL_RCC_DMA1_CLK_ENABLE();//DMA CLOCKU AKTIF ET
	 hdma_adc1.Instance->CCR&=0x00000000;//INIT ETMEK ICIN HERSEYI SIFIRLA
	 ADC1_DMA_MEMTOMEM_DISABLE; //MEMORYDEN MEMORYE AKTARIM KAPALI
	 ADC1_DMA_PRIORITY_LOW;//DMA ONCELIGI DUSUK
	 ADC1_DMA_MEMORYSIZE_16BITS; //MEMORYDEN 16 BITLIK TRANSFER YAPILACAGINI BELIRTIYORUZ
	 ADC1_DMA_PERIPHERALSIZE_16BITS; //PERIPHERALDEN 16 BITLIK TRANSFER YAPILACAGINI BELIRTIYORUZ
	 ADC1_DMA_MEMINC_ENABLE;//MEMORY OTOMATIK ADRES YUKSELTMEYI ACIYORUZ
	 ADC1_DMA_PERIPINC_DISABLE;//PERIPHERAL OTOMATIK ADRES YUKSELTMEYI KAPATIYORUZ
	 ADC1_DMA_CIRCULAR_ENABLE;//DMA CIRCULAR MODU ACIYORUZ
	 ADC1_DMA_READ_FROM_PERIPHERAL;//DATA TRANSFERININ PERIPHERALDEN MEMORYE YONLENDIGINI BELIRTIYORUZ
   ADC1_DMA_NUMBER_DATA_TRANSFER=10;//KAC ADET DATA TRANSFERI YAPILACAGINI BELIRTIYORUZ
   ADC1_DMA_PERIPHERAL_ADDRESS=(uint32_t) &ADC1->DR; //PERIPHERAL ADRESI
   ADC1_DMA_MEMORY_ADDRESS=(uint32_t) &adc_value;  //MEMORY ADRESI
	/* DMA1_Channel1_IRQn interrupt configuration */
 // HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0);//DMA1 CHANNEL 1 INTERRUPT PRIORITY
 //	ADC1_DMA_TRANSFER_COMPLETE_INTERRUPT_ENABLE;//DMA1 TRANSFER COMPLETE INTERRUPT ENABLE
 // HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);//DMA1 INTERRUPT ENABLE
	ADC1_DMA_CHANNEL_ENABLE;//DMA KANALINI AKTIF EDIYORUZ
	ADC1->CR2|=0x00000101;//adc yi dma ile baslat  
}


Herkes ölür ama herkes gerçekten yaşamaz

sadogan

Emeklerinize sağlık, güzel bir çalışma olmuş.
Adc ölçüm sonuçlarını DMA ile taşıma işemi biter bitmez DMA intrrupt u ile okuya bilirmiydik?.
Tek basına 1 kanal ADC örneği çok basit olur demişsiniz ama anlaşılabilirlik açısında daha iyi olurdu diye düşünüyorum.
videoların devamını bekliyoruz..

 





skara1214

evet hocam dma transfer complete interruptini kullanarak dediğiniziyapabilirdiniz. Videonun sonundada belirttiğim gibi dma v.s herhalde biraz hızlı geldi. O yüzden dma kullanımını 2-3 ders sonraya bırakayım. Dma sız adc ve usartı anlatayım...
Herkes ölür ama herkes gerçekten yaşamaz

sadogan

@sakara1214 hocam kütüphanenizde varsa , flash da bir bölgeyi eeprom gibi kullanmayıda anlatabilirmisiniz ?

skara1214

Anlatacağım hocam hiç merak etmeyin😁 su an yurt dışındaki dönünce anlatacagim
Herkes ölür ama herkes gerçekten yaşamaz