Picproje Elektronik Sitesi

PICPROJE PROGRAMLAMA DERSLERİ => Arm Öğreniyoruz => Konuyu başlatan: skara1214 - 11 Kasım 2016, 01:59:07

Başlık: STM32F103C8T6 CUBE MX VE KEIL5 DERS 2 SYSTICK , DMA, ADC
Gönderen: skara1214 - 11 Kasım 2016, 01:59:07
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  (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 
}


Başlık: Ynt: STM32F103C8T6 CUBE MX VE KEIL5 DERS 2 SYSTICK , DMA, ADC
Gönderen: sadogan - 11 Kasım 2016, 14:01:33
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..

 




Başlık: Ynt: STM32F103C8T6 CUBE MX VE KEIL5 DERS 2 SYSTICK , DMA, ADC
Gönderen: skara1214 - 12 Kasım 2016, 16:47:40
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...
Başlık: Ynt: STM32F103C8T6 CUBE MX VE KEIL5 DERS 2 SYSTICK , DMA, ADC
Gönderen: sadogan - 15 Kasım 2016, 17:09:37
@sakara1214 hocam kütüphanenizde varsa , flash da bir bölgeyi eeprom gibi kullanmayıda anlatabilirmisiniz ?
Başlık: Ynt: STM32F103C8T6 CUBE MX VE KEIL5 DERS 2 SYSTICK , DMA, ADC
Gönderen: skara1214 - 16 Kasım 2016, 21:17:33
Anlatacağım hocam hiç merak etmeyin😁 su an yurt dışındaki dönünce anlatacagim