Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => ARM => Konuyu başlatan: Mucit23 - 29 Aralık 2015, 01:18:57

Başlık: STM32F7 Donanım ayarları
Gönderen: Mucit23 - 29 Aralık 2015, 01:18:57
STM32F7 Disco ile uğraşıyorum. Kendim bir proje dosyası oluşturdum keilde. ADC, DMA vs gibi donanımlar üzerinde uğraşarak HAL kütüphanesini anlamaya çalışıyorum. Yalnız STD Periph kütüphanesinden biraz farklı. İncelediğim örnekler hep CubeMX ile oluşturulmuş. Ben cubeMX ile uğraşmadan donanım ayarlarını yazılım ile yapayım istiyorum. Yanlış bir tercihmi anlayamadım. Çünkü örnekleri inceliyorum sistemin yapısını henüz çözemedim. Hangi ayar nerde yapılır? nasıl yapılır? vs vs. İlk etapta çok karışık geldi.

Tek yapabildiğim LCD, Onunla bir sıkıntım yok. Fonksiyonlar F4 için yazılmış STD Periph kütüphanesine çok benziyor.

CubeMX ile anlaşamadığım nokta şu. Belkide özelliği vardır pek kurcalamadım. Ben Sadece ADC ile ilgili ayarları Cube MX yardımıyla yapıp oluşan kod çıktısını kendi projeme eklemek istiyorum. CubeMX de anladığım kadarıyla sıfırıdan bütün proje oluşturuluyor.

Nedir bu işin yolu? STM32F7 ile kimler uğraşıyor forumda?
Başlık: Ynt: STM32 CubeF7 Donanım ayarları
Gönderen: Gökhan BEKEN - 29 Aralık 2015, 02:44:20
Hangi donanımı kullanmak istiyorsan onun header (.h uzantılı) dosyasını aç, en başında hangi fonksiyonun ne işe yaradığını anlatıyor.
Gerekirse cubemx'de seçtiğin ayarları da bu fonksiyonlardan değiştirebilirsin.
Başlık: Ynt: STM32 CubeF7 Donanım ayarları
Gönderen: Mucit23 - 29 Aralık 2015, 09:36:08
Selamlar,

Hocam dün gece ADC'yi çalıştırmak için uğraştım.

Yaptıklarımı sırayla söyliyeyim, Hatam varsa düzeltin
İlk olarak main.c dosyamda ADC_Config diye bir fonksiyon oluşturdum. Bütün adc ayarlarını bu fonksiyon içerisinde yapmaya çalıştım.
static void ADC_Config(void)
{
  ADC_ChannelConfTypeDef sConfig;

  /*##-1- Configure the ADC peripheral #######################################*/
  AdcHandle.Instance          = ADC3;
 
  AdcHandle.Init.ClockPrescaler        = ADC_CLOCKPRESCALER_PCLK_DIV4;
  AdcHandle.Init.Resolution            = ADC_RESOLUTION_12B;
  AdcHandle.Init.ScanConvMode          = DISABLE;                       /* Sequencer disabled (ADC conversion on only 1 channel: channel set on rank 1) */
  AdcHandle.Init.ContinuousConvMode    = ENABLE;                        /* Continuous mode disabled to have only 1 conversion at each conversion trig */
  AdcHandle.Init.DiscontinuousConvMode = DISABLE;                       /* Parameter discarded because sequencer is disabled */
  AdcHandle.Init.NbrOfDiscConversion   = 0;
  AdcHandle.Init.ExternalTrigConvEdge  = ADC_EXTERNALTRIGCONVEDGE_NONE;        /* Conversion start trigged at each external event */
  AdcHandle.Init.ExternalTrigConv      = ADC_EXTERNALTRIGCONV_T1_CC1;
  AdcHandle.Init.DataAlign             = ADC_DATAALIGN_RIGHT;
  AdcHandle.Init.NbrOfConversion       = 1;
  AdcHandle.Init.DMAContinuousRequests = ENABLE;
  AdcHandle.Init.EOCSelection          = DISABLE;

  if (HAL_ADC_Init(&AdcHandle) != HAL_OK)
  {
    /* ADC initialization Error */
    Error_Handler();
  }

  /*##-2- Configure ADC regular channel ######################################*/
  sConfig.Channel      = ADC_CHANNEL_8;
  sConfig.Rank         = 1;
  sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;
  sConfig.Offset       = 0;

  if (HAL_ADC_ConfigChannel(&AdcHandle, &sConfig) != HAL_OK)
  {
    /* Channel Configuration Error */
    Error_Handler();
  }


  /*##-3- Start the conversion process #######################################*/
  if(HAL_ADC_Start_DMA(&AdcHandle, (uint32_t*)&uhADCxConvertedValue, 1) != HAL_OK)
  {
    /* Start Conversation Error */
    Error_Handler();
  }

}


Bu fonksiyonda ADC Prescaller, Çözünürlük vs gibi ayarlar yapılıyor. Bu kodlar içerisinde if şartı ile HAL_ADC_Init(&AdcHandle) fonksiyonuna gidiyorum. Hazır örnekten takip ettim.

stm32f7xx_hal_adc.c dosyasında aşağıdaki fonksiyona geliyor.
HAL_StatusTypeDef HAL_ADC_Init(ADC_HandleTypeDef* hadc)
{
  /* Check ADC handle */
  if(hadc == NULL)
  {
     return HAL_ERROR;
  }
 
  /* Check the parameters */
  assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
  assert_param(IS_ADC_CLOCKPRESCALER(hadc->Init.ClockPrescaler));
  assert_param(IS_ADC_RESOLUTION(hadc->Init.Resolution));
  assert_param(IS_FUNCTIONAL_STATE(hadc->Init.ScanConvMode));
  assert_param(IS_FUNCTIONAL_STATE(hadc->Init.ContinuousConvMode));
  assert_param(IS_ADC_EXT_TRIG(hadc->Init.ExternalTrigConv));
  assert_param(IS_ADC_DATA_ALIGN(hadc->Init.DataAlign));
  assert_param(IS_ADC_REGULAR_LENGTH(hadc->Init.NbrOfConversion));
  assert_param(IS_FUNCTIONAL_STATE(hadc->Init.DMAContinuousRequests));
  assert_param(IS_ADC_EOCSelection(hadc->Init.EOCSelection));
  assert_param(IS_FUNCTIONAL_STATE(hadc->Init.DiscontinuousConvMode));

  if(hadc->Init.ExternalTrigConv != ADC_SOFTWARE_START)
  {
    assert_param(IS_ADC_EXT_TRIG_EDGE(hadc->Init.ExternalTrigConvEdge));
  }

  if(hadc->State == HAL_ADC_STATE_RESET)
  {
    /* Allocate lock resource and initialize it */
    hadc->Lock = HAL_UNLOCKED;
    /* Init the low level hardware */
    HAL_ADC_MspInit(hadc);
  }

  /* Initialize the ADC state */
  hadc->State = HAL_ADC_STATE_BUSY;
 
  /* Set ADC parameters */
  ADC_Init(hadc);
 
  /* Set ADC error code to none */
  hadc->ErrorCode = HAL_ADC_ERROR_NONE;
 
  /* Initialize the ADC state */
  hadc->State = HAL_ADC_STATE_READY;

  /* Release Lock */
  __HAL_UNLOCK(hadc);

  /* Return function status */
  return HAL_OK;
}


Burada bir takım ayarlamalar yapılır vs vs. Low level Donanım ayarları için ise HAL_ADC_MspInit fonksiyonuna gitmek gerekiyor anladığım kadarıyla. Bu fonksiyonda DMA clock ayarları pin konfigürasyonları RCC clock ayarları vs gibi ayarlamalar yapılması lazım.

Bunun için stm32f7xx_hal_msp.c dosyasına aşağıdaki fonksiyonu kendim ekledim.
void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
{
  GPIO_InitTypeDef          GPIO_InitStruct;
  static DMA_HandleTypeDef  hdma_adc;

  /*##-1- Enable peripherals and GPIO Clocks #################################*/
  /* ADC3 Periph clock enable */
  ADCx_CLK_ENABLE();
  /* Enable GPIO clock ****************************************/
  ADCx_CHANNEL_GPIO_CLK_ENABLE();
  /* Enable DMA2 clock */
  DMAx_CLK_ENABLE();

  /*##-2- Configure peripheral GPIO ##########################################*/
  /* ADC Channel GPIO pin configuration */
  GPIO_InitStruct.Pin = ADCx_CHANNEL_PIN;
  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(ADCx_CHANNEL_GPIO_PORT, &GPIO_InitStruct);

  /*##-3- Configure the DMA streams ##########################################*/
  /* Set the parameters to be configured */
  hdma_adc.Instance = ADCx_DMA_STREAM;

  hdma_adc.Init.Channel  = ADCx_DMA_CHANNEL;
  hdma_adc.Init.Direction = DMA_PERIPH_TO_MEMORY;
  hdma_adc.Init.PeriphInc = DMA_PINC_DISABLE;
  hdma_adc.Init.MemInc = DMA_MINC_ENABLE;
  hdma_adc.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
  hdma_adc.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
  hdma_adc.Init.Mode = DMA_CIRCULAR;
  hdma_adc.Init.Priority = DMA_PRIORITY_HIGH;
  hdma_adc.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
  hdma_adc.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_HALFFULL;
  hdma_adc.Init.MemBurst = DMA_MBURST_SINGLE;
  hdma_adc.Init.PeriphBurst = DMA_PBURST_SINGLE;

  HAL_DMA_Init(&hdma_adc);

  /* Associate the initialized DMA handle to the ADC handle */
  __HAL_LINKDMA(hadc, DMA_Handle, hdma_adc);

  /*##-4- Configure the NVIC for DMA #########################################*/
  /* NVIC configuration for DMA transfer complete interrupt */
  HAL_NVIC_SetPriority(ADCx_DMA_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(ADCx_DMA_IRQn);
}


Normalde bu işlemler cubemx ile otomatik ayarlanması lazım. Bende STM32F7_Cube kütüphanesindeki ADC örneğine bakarak yapamaya çalışıyorum. Ben manuel olarak yapayım dedim ama işin içinden çıkamadım açıkçası.

STM32F7 de ADC'yi çalıştıran oldumu?
Başlık: Ynt: STM32 CubeF7 Donanım ayarları
Gönderen: CoşkuN - 29 Aralık 2015, 09:39:42
Donanım ayarlarını anlamaksa amaç önce reference manual dökümanlarında o donanıma ait bölümleri okuyup sonra koda bakmak daha faydalı olur diye düşünüyorum.
Başlık: Ynt: STM32 CubeF7 Donanım ayarları
Gönderen: Mucit23 - 29 Aralık 2015, 11:01:34
Yok hocam o kadar alt seviyeye inmeye gerek yok :) STM32F746'nın Teknik dökümanı 1600 küsür sayfa.  :o :o :o Nokta atışı yapmadıktan sonra şu ne işe yarıyor, bu registerin amacı ne gibi sorularla işlemciyi anlamaya ömür yetmez.

Ben şunu anlamak istiyorum. CubeMX olsada olmasada HAL kütüphaneyi kullanmaya mecburuz. Örneğin CubeMX'den bağımsız bir kendimiz Keil ile bir proje oluşturduk. Bütün donanım kütüphanelerini vs ekledik. Projemiz derlenip çalışır halde

Şuanda bu pozisyondayım.

Amacım ADC'den DMA ile sürekli veri almak DMA TC interruptu aktif etmek vs. Bunların hepsini tek bir fonksiyonda ayarlamak istiyorum. STM32F4'de öyle yapıyordum. Bunda ise durum biraz daha karışık. Henüz çözebilmiş değilim

Kart yeni olduğundan örnekte piyasada hiç yok.

Başlık: Ynt: STM32 CubeF7 Donanım ayarları
Gönderen: Gökhan BEKEN - 29 Aralık 2015, 12:21:15
Hocam hal kütüphanesi ile st standart kütüphanesini birlikte kullanabilirsin fakat biraz uğraştırıyor, çünkü aynı isimde fonksiyonlar çakışıyor tek tek değiştirmek gerekiyor.
Bazen HAL ile nasıl yapıldığını bilmediğim kısımları standart lib ile daha önce öğrenmişsem bu şekilde yapıyorum zaman harcamamak için.
Başlık: Ynt: STM32 CubeF7 Donanım ayarları
Gönderen: Mucit23 - 29 Aralık 2015, 13:31:31
Sanırım o daha uğraştırır beni. Ben ADC'nin niye çalışmadığı üzerine bi yoğunlaşayım. Hazır örnekteki ADC uygulamasını. Karta yüklediğimde A1 pinindeki analog değere göre ledi yakıp söndürmesi lazım. Eğer onu çalıştırırsam kendi kodumun neden çalışmadığını daha iyi anlayabilirim.
Başlık: Ynt: STM32 CubeF7 Donanım ayarları
Gönderen: Mucit23 - 29 Aralık 2015, 22:56:26
ADC ayarlarım doğru gibi, HAL_ADC_GetValue() fonksiyonuyla anlık ADCX->DR registerindeki anlık değeri alabiliyorum.

Bence ya DMA çalışmıyor yada ADC-DMA link işlemi düzgün yapılmadı. Başka bir sebep göremedim ben.

Edit; DMA Kesmeside çalışıyor. Sorun ne olaki?
Başlık: Ynt: STM32 CubeF7 Donanım ayarları
Gönderen: Mucit23 - 30 Aralık 2015, 16:48:34
Bu sorun bana kafayı yedirtecek.

DMA kesmesi oluşuyor.
Bu fonksiyonla DMA'ya hedef değişkenin adresini gönderiyorum.
  if(HAL_ADC_Start_DMA(&AdcHandle, (uint32_t*)&uhADCxConvertedValue, 1) != HAL_OK)
  {
    /* Start Conversation Error */
    Error_Handler();
  }


DMA'nın çalıştığını DMA kesme rutini içerisinde led yakarak anlıyorum henüz. LED yanıyor dolayısıyla kesme oluşuyor olması lazım.

Başka ne yapmam gerekiyor anlamadımki  :( :(

İşin ilginç tarafı stm32cubef7 ile gelen ADC örneğide çalışmıyor. Elimde bir tane örnek var oda çalışmıyor.  :o :o

Bi akıl verin nasıl çözebilirim bu işi?

Başlık: Ynt: STM32 CubeF7 Donanım ayarları
Gönderen: Mucit23 - 31 Aralık 2015, 01:08:53
Yeminle karttan soğudum.   :'(

stm32cubef7 dosyasının içerisinde STM32F756_eval için yazılmış adc örneği vardı. STM32F7-Disco için yazılan örnekle birebir aynı Aynı yazılımı hiç oynamadan stm32f7 disco ya yükledim çalıştı. uhADCxConvertedValue değişkeninde anlık ADC değerlerini görebiliyordum. Ama STM32F746-Disco için yazılmış ADC örneği çalışmıyor. Halbuki ADC ile ilgili ayarlar gözümden kaçmadıysa eğer bire bir aynı. Arada sorun yaratan fark varsa bile bunu nasıl bulacağımı bilmiyorum.  :(
Başlık: Ynt: STM32 CubeF7 Donanım ayarları
Gönderen: Mucit23 - 01 Ocak 2016, 10:17:36
Selamlar.
Öncelikle herkesin yeni yılını kutlarım. Hepimiz için mutlu başarılı ve bol kazançlı bir yıl olur inşaallah.

Dün sorunu şans eseri buldum gibi. Ama henüz bir çözüm getiremedim.

Daha önce demiştim STM32F7 için yazılmış olan ADC+DMA örneği nedense çalışmıyor. Bende STM32F756-EVAL için yazılmış olan ADC+DMA örneğini hiç ellemeden karta yükledim. İlginçtir ki o yazılımla çalıştı.

Sonra aradaki farkları araştırırken Target Options bölümünde Read/Write Memory Areas adreslerinin farklı olduğunu gördüm. STM32F756 için Default olarak IRAM1 değerinin başlangıç adresi 0x20000000, ve boyutuda 0x50000 verilmiş.
Ben projeyi sıfırdan kendim oluşturduğumdan başlangıç adresi ve boyut değerleri default olarak olması gereken den farklı bir değerdeydi.

Birde Hal Library'de de sıkıntı var sanırım. Çünkü ilk başta HAL library dosyaları salt okunurdu. STM32f756 için yazılmış projeyi keilde incelerken dosyasların salt okunur olmadığını farkettim. Bende o dosyaları projeme ekledim.

Şimdi durum şöyle.

LCD çalışmıyorken ADC+DMA çalışıyor. Ama LCD'yi ne zaman init etsem ADC+DMA eski haline dönüyor. Tek problem bu kaldı.
Tahminimce LCD içerisinde LTDC, DMA2D ve SDRAM üçlüsü DMA'nın birkaç kanalını kullanıyor. Bende hazır örnek kullandığımdan aynı dma kanalları kullanılıyor olabilir tam emin değilim. Anlamak için biraz derinlere inmek gerekiyor.
Başlık: Ynt: STM32 CubeF7 Donanım ayarları
Gönderen: Mucit23 - 02 Ocak 2016, 00:34:58
Sorunu çözebilmiş değilim. LCD ile ADC arasında DMA bağlantısı varmı onu anlamaya çalışıyorum. LCD kullanılırken SDRAM ile birlikte kullanılıyor. LTDC ile SDRAM arasındaki veri Transferi DMA2'nin 0. kanalından stream 0 ile yapılıyor. ADC3 ile Değişkenim arasındaki veri transferi ise yine DMA2'nin 2. kanalının stream 1'i tarafından sağlanıyor.

Başka seçenek yok zaten. Sadece ADC3'ü DMA2'nin 2. kanalının stream 1'i tarafındanda sağlanabiliyor. Başka bir bağlantı bulamıyorum ben.

Sorum şudur. DMA kanalları farklı olmasına rağmen LCD'yi devreye alınca ADC verisini taşıyan dma niye dursun? Varmı bir fikri olan? 3 gecedir LCD ile DMA'yı birlikte çalıştırmak için uğraşıyorum 
Başlık: Ynt: STM32 CubeF7 Donanım ayarları
Gönderen: yldzelektronik - 02 Ocak 2016, 01:13:20
Muhtemelen sorunun cevabı değil.Lakin yanlış bilmiyorsam busı ilk kapan kullanıyor.Lcd sürekli iş yükü olabileceğinden busı hiç bırakmıyor olabilir mi
Başlık: Ynt: STM32 CubeF7 Donanım ayarları
Gönderen: Mucit23 - 02 Ocak 2016, 01:32:37
Ama farklı kanallardalar. DMA böyle basit bir konuda çöküyor olamaz bence

DMA olmadan LCD aktif iken HAL_ADC_GetValue(&AdcHandle) fonksiyonu ile ADC verisini okuyup yazabiliyorum ekrana.

Fikir önerisine ihtiyacım var. DMA denen zıkkım neden lcd ile çalışmıyor?
Başlık: Ynt: STM32 CubeF7 Donanım ayarları
Gönderen: ecunnu - 02 Ocak 2016, 10:06:31
Bildigim kadari ile DMA lar paralel olarak calisamazlar. Kendi aralarinda bir oncelik siralamasi vardir. DMA1 DMA2 den onceliklidir, kanal1 kanal2 den onceliklidir. Senin projende LCD icin kullandigin DMA daha oncelikli oldugu icin ADC kismında hata aliyor olabilirsin.
Başlık: Ynt: STM32 CubeF7 Donanım ayarları
Gönderen: Mucit23 - 02 Ocak 2016, 11:40:33
Hocam ama farklı kanallarda çalışıyorlar.

ST'nin RM0385 kodlu STM32F74xxx manualini inceliyorum.

Sayfa 222'de böyle bir tablo var.

(http://stm32f75xxx%20and%20stm32f74xxx)

Ben karttaki Arduino analog pinlerinden okuma yapıyorum. 6 adet analog giriş var ve bunlar ADC3'e bağlı. Şuanda ADC3'de kanal değiştirip farklı kanallardan okuma yapabiliyorum.

SDRAMin kullandığı DMA tanımlamaları aşağıdaki gibi
/* DMA definitions for SDRAM DMA transfer */
#define __DMAx_CLK_ENABLE                 __HAL_RCC_DMA2_CLK_ENABLE
#define __DMAx_CLK_DISABLE                __HAL_RCC_DMA2_CLK_DISABLE
#define SDRAM_DMAx_CHANNEL                DMA_CHANNEL_0
#define SDRAM_DMAx_STREAM                 DMA2_Stream0 
#define SDRAM_DMAx_IRQn                   DMA2_Stream0_IRQn
#define SDRAM_DMAx_IRQHandler             DMA2_Stream0_IRQHandler


Bunlar ise ADC için yapılan DMA Tanımlamaları
/* Definition for ADCx's DMA */
#define DMAx_CLK_ENABLE()               __HAL_RCC_DMA2_CLK_ENABLE()
#define ADCx_DMA_CHANNEL                DMA_CHANNEL_2
#define ADCx_DMA_STREAM                 DMA2_Stream0
#define ADCx_DMA_IRQn                   DMA2_Stream0_IRQn
#define ADCx_DMA_IRQHandler             DMA2_Stream0_IRQHandler


SDRAM DMA'ın 0. kanalını kullanıyor. ADC ise DMA'nın 2. kanalını kullanıyor.

Stream meselesi ise zorunlu gibi 1. tablodan dma2 ye bakılırsa ADC3 ancak Stream0 ve Stream1 ile kullanılabiliyor. 2. Kanalda çalışmasıda zorunluluk. Gerçi Tabloda SDRAM ile ilgili bir açıklama yok. Bunun sebebini anlamadım.

Aslında kartta keşke bütün IO pinlerini dışarı çıkarsalardı. Biraz daha esnek davranabilirdim.

Şimdi DMA'yı tam olarak anlayamadım aslında. Üstatlarım biraz açıklarsa sevinirim. DMA2'yi düşünürsek, Sadece DMA2 ile kaç farklı köprü kurulabilir? Bu durumdayken ne yapmamı önerirsiniz? DMA olsa süper olacak. 3 farklı kanaldan ADC okuyup 3 farklı değişkene atmaya çalışıyorum DMA ile.

Başka nasıl yaparım bu işi?
Başlık: Ynt: STM32 CubeF7 Donanım ayarları
Gönderen: ecunnu - 02 Ocak 2016, 13:09:43
ADC3 u Stream1 ile kullanmayi denedinmi?
Başlık: Ynt: STM32 CubeF7 Donanım ayarları
Gönderen: Mucit23 - 02 Ocak 2016, 13:11:55
Denedim evet adc tek başına stream1 ilede çalışıyor.  Fakat lcd devreye girince ayni sorun devam ediyor
Başlık: Ynt: STM32 CubeF7 Donanım ayarları
Gönderen: Mucit23 - 03 Ocak 2016, 00:06:00
Benim bu işe bir türlü aklım ermiyor arkadaşlar. @Klein hocam bi el atın kafa yoralım şu işe  :-\

Neden SDRAM ile ADC aynı DMAyı farklı kanallardan çalışmaz. Arada problem çıkaran ne? Bu soruma cevap bulursam sorun çözülür. Şu anda komple DMA yı kapattım. Projenin ilerlemesi için kendim kesmelerle felan uğraşarak sıra ile ADC den veri almaya çalışacam.

mesaj birleştirme:: 03 Ocak 2016, 01:01:04

Sormak istediğim birşey daha var.

Şuan DMA olmadan 3 kanal adcden veri okuyabiliyorum. DMA'yı tümüyle pasif ettim. Ayrıca ADC_IRQn kesmesinide aktif ettim. Kesme oluşuyor. Yalnız şöyle bir durum var. STM32f7xx_it.c içerisine Kesme fonksiyonunu ekliyorum şöyle bir fonksiyon.

void ADC_IRQHandler(void)
{
  HAL_ADC_IRQHandler(&AdcHandle);
}


Kesme buraya düşüyor. Ama bu fonksiyon içerisinde en basitinden led yakmak istesem bile eklediğim ekstra kodda program işlemci donuyor.
Sadece bu kodu ekliyorum. BSP_LED_On(LED1);
Bu işe de anlam veremedim.
Başlık: Ynt: STM32 CubeF7 Donanım ayarları
Gönderen: yldzelektronik - 03 Ocak 2016, 12:35:31
Donuyor demişsin. Donuyordan kastın nedir?Ben de benzeri durumları yaşamıştım m0+, m0 ile. Ama ben sonradan gördüm ki hardfault handlera düşüyordu.Sebebini hatırlamıyorum şuan.Ancak ben de donuyor diye düşünüyordum.Debug da oraya düşüyordu kodu dondurduğumda.Hatta forumda bir yerlerde videosu da vardı.

Sendeki de böyle bir durum mu?
Başlık: Ynt: STM32 CubeF7 Donanım ayarları
Gönderen: Mucit23 - 03 Ocak 2016, 13:26:35
Emin değilim bilmiyorum tam olarak hard faulta düşüyor olabilir. Normalde lcd adc vs çalışıyorken kesme fonksiyonu içinde bir fonksiyon çağırsam lcd ve adc çalışmıyor. 

Ne kadar problem bir iş böyle.  St foruma yazıyorum orada bile cevap veren yok. St globala mail atacam.

Şunu sorayım.  Simdi timer ile adc yi tetikledim diyelim. Adc den peşi sıra 3 farklı kanaldan 1'er adet örnek alıp adc yi durdurmam lazım.  Timer ile tetikleme kolay. Contiouns mode'yi disable yapsam adc işi bittigi zaman duruyor. Buda tamam. Ama adc'nin peşi sıra kanal tarayıp örnek alma özelliği varmı? Bunu f4 için soruyorum onda böyle bir ozellik varsa f7 de de vardır.

3 kanal adc nin fft si alınacak bunun için alt yapıyı oluşturmaya çalışıyorum.  Dma bütün işleri alt üst etti. FFT için sabit frekansta örnekleme yapmam lazım.  Daha önce tek kanal adc ve dma timer üçlüsü ile yapmıştım. Gayet iyi çalışıyordu.  Burada birtek dma oyun bozanlık yapıyor.

Öyle bir durum var ki kart üzerindeki analog girişlerin hepsi adc3'e bağlı.  Adc3 de birtek dma2 ile çalışıyor.  Sdram içinde aynı durum geçerli.  Ama mesela adc1'i kullansam dma1 ile veri aktarımı yapacam ama adc1 inde kanalları uyuşmuyor. Sadece tek bir kanalı I/O lara çıkarmışlar.  Diğer pinler yok ortada.  Saçmalık işte. 

>:( Raspi de bile daha çok I/O var. Bu ne iştir böyle anlamadımki

DMA sorununu çözmem lazım

Başlık: Ynt: STM32 CubeF7 Donanım ayarları
Gönderen: Mucit23 - 07 Ocak 2016, 23:20:57
Bu konuda henüz bir çözüme ulaşmış değilim. ST Forumdan böyle bir cevap geldi

If it's like the F4 DMA implementation you need to use unique streams, not channels

Tam anlayamadım ama farklı kanal yerine farklı streamlar kullanın diyor sanırım. Denedim onuda denedim ama olmadı.

Şimdi DMA olmadan 3 kanal adc ölçümü yapıyorum. Benim ADC yi 10khz hızda ölçüm yapacak şekilde ayarlamam lazım. Yani saniyede 10000 defa 3 kanal adc den örnek almam lazım. Bunu doğrudan adc yi tetikleyerek yapmam mümkün mü?
Başlık: Ynt: STM32 CubeF7 Donanım ayarları
Gönderen: Karamel - 07 Ocak 2016, 23:56:50
Alıntı yapılan: Mucit23 - 07 Ocak 2016, 23:20:57
Bu konuda henüz bir çözüme ulaşmış değilim. ST Forumdan böyle bir cevap geldi

If it's like the F4 DMA implementation you need to use unique streams, not channels

Tam anlayamadım ama farklı kanal yerine farklı streamlar kullanın diyor sanırım. Denedim onuda denedim ama olmadı.

Şimdi DMA olmadan 3 kanal adc ölçümü yapıyorum. Benim ADC yi 10khz hızda ölçüm yapacak şekilde ayarlamam lazım. Yani saniyede 10000 defa 3 kanal adc den örnek almam lazım. Bunu doğrudan adc yi tetikleyerek yapmam mümkün mü?

hocam eger f4 dma i gibi birsey yapmak istiyorsaniz. unique streams seklinde kullanmalisiniz. channels seklinde degil. burada boyle yaziyor. reference manual da bunlarin ne oldugu anlatiliyor olmali. ben simdi bir cumleden pek birsey anlamadim ama bu cevap bir anlam ifade ediyor olmali.

example code isteyin isterseniz?  :-\
Başlık: Ynt: STM32 CubeF7 Donanım ayarları
Gönderen: Gökhan BEKEN - 08 Ocak 2016, 01:07:59
Bütün işleri tek bir mcu'da halletmen şart değil ise bence modüler çalış.
ADC ölçümü yapılacaksa bu işi yapan mcu ayrı olsun, spi veya paralel port ile master karta hızlıca göndersin, belki dma'yı bu iletişim için kullanabilirsin.
Başlık: Ynt: STM32 CubeF7 Donanım ayarları
Gönderen: Mucit23 - 08 Ocak 2016, 01:17:30
Hocam böyle bir mcu ile böyle basit bir işlemi yapamıyorsak kart bana göre çöp gibi birşey.

ADC+DMA dan vazgeçtim. Timer kesmesi oluşturup kesme içerisinde her bir kanalın verisini ayrı ayrı okuyacam. Şuanda timer için tırmalıyorum.
Gerçi ilginç bir şekilde kesme içerisinde de herhangi bir fonksiyon çalışmıyor. Onuda anlamış değilim.

@Karamel keşke örnek fazla olsa. Bir kaç tane örnek var onlarda ST nin kendi verdikleri zaten.
Başlık: Ynt: STM32 CubeF7 Donanım ayarları
Gönderen: Karamel - 08 Ocak 2016, 10:19:55
Hocam sorunu yazin. Bu ornek duzgun calismiyor. Ben boyle istiyorum ama.bu boyle oluyor vs diyin. Bence st microelectronics support team sizinle ilgilenir. Kimse ilgilenmese ornek olmaz?

Ben konudan hicbirsey anlamadim. Eger birsey anlayabilsem. Final lar bitince reference manuel i okuyup. Size anladiklarimi akatarabilirim. ::)
Başlık: Ynt: STM32 CubeF7 Donanım ayarları
Gönderen: Mucit23 - 08 Ocak 2016, 23:33:04
Benim takıldığım konu şudur.

Mesela Şuanda Timer interrupt için uğraşıyorum. Örnekler içerisinde Tim_Base uygulaması var. Karta yükledim doğrudan gayet güzel çalışıyor. Sıkıntı yok. Şimdi timer kesmesini ben kendi projemde de aktif etmek istiyorum. Yaptığım işlem timer örneğindeki kodları inceliyorum. Timer için nerede hangi ayarları yapmış adım adım takip edip kendi projeme ekliyorum. Sonuç olarak program hatasız bir şekilde derleniyor. Ama yinede çalıştıramadım bir türlü. konfigürasyon işlemi sırasında Timer interrupt aktif edildiği anda işlemci donuyor. Debug sırasında bunu farkediyorum.

İşte bunun gibi problemler var. İşlemcide bir ayar yapılacaksa nerelere dikkat etmek gerekiyor bilmiyorum. Tamam ayarlar felan F4'e çok benziyor ama Hal kütüphanesinde nedense aynı ayarları çalıştıramıyorum. Nereler atlanıyor onlarıda bulamıyorum.
Başlık: Ynt: STM32 CubeF7 Donanım ayarları
Gönderen: Gökhan BEKEN - 08 Ocak 2016, 23:58:42
Diğer donanımları init yapma ve kullanma, bir de öyle dene. Belki birbirlerini etkileyen birşeyler vardır.
Kolaylık olması açısından her donanım için aktif olup olmayacağını belirten birer #define tanımla.
Ben şöyle yapıyorum:
programın başında
#define EKRAN_AKTIF
#define ADC_AKTIF

sonra kullanacağım bütün yerlerde şöyle yapıyorum:
#ifdef EKRAN_AKTIF
ekranInit();
#endif
#ifdef ADC_AKTIF
adcInit();
#endif
Başlık: Ynt: STM32 CubeF7 Donanım ayarları
Gönderen: Mucit23 - 09 Ocak 2016, 00:22:18
Yok hocam onu denedim elbette. Sadece Timer ile ilgili ayarları bırakıyorum. Başka çağırdığım birşey yok.

Şu satırda donup kalıyor.

  /*##-2- Start the TIM Base generation in interrupt mode ####################*/
  /* Start Channel1 */
  if (HAL_TIM_Base_Start_IT(&TimHandle) != HAL_OK)
  {
    /* Starting Error */
    Error_Handler();
  }


Gökhan hocam şöyle bir teorim var. Bu yere batası hal library  sadece CubeMX ile birlikte çalışacak şekilde yazılmış. CubeMX ile proje oluştururken kütüphanenin yapısını bildiği için nerde ne yapacağını biliyor herşey yerli yerinde çalışıyor. İncelediğim Bütün örnekler CubeMX ile hazırlanmış gibi. Belkide sorun bundan dır. Ben kendim kodlara bakıp aynısını yazıyorum ama belki daha fazla birşeyler yapmak gerekiyordur. İşte bana kafayı yedirtecek kısım burası.

Yahu CubeMX ile nasıl proje oluştururum. Daha önce deneyen oldumu?
Mesela CubeMX ile Sadece LCD ayarları ile işlemcinin çalışabileceği min konfigürasyon ayarlarının yapıldığı  bir proje oluşturabilecek birisi var mıdır forumda?

SDRAM ayarları nasıl yapılacak? FMC'nin bir sürü modu var. 
LCD ayarları nasıl yapılacak?

Birde bu yolu deneyeyim diyorum ama başta takılıp kalıyorum.
Başlık: Ynt: STM32 CubeF7 Donanım ayarları
Gönderen: Gökhan BEKEN - 09 Ocak 2016, 00:34:07
Cubemx ile proje oluşturmak çok kolay, ama donanım ayarlarını yapabilmek için seçenekleri bilmek lazım. Mesela LCD'nin özelliklerini bilmediğim için yapamam ama sendeki örnekten bakarak aynısını yapmaya çalışırsan çalışabilir.
Başlık: Ynt: STM32 CubeF7 Donanım ayarları
Gönderen: Mucit23 - 09 Ocak 2016, 01:46:43
Herşeyi kapattım ona rağmen kesme çalışmadı. Ben kütüphanede sorun olduğunu düşünüyorum artık. Gerçekten işlemcinin hiçbir donanımını doğru düzgün çalıştıramıyorum. Bende sıkıntı olduğu kesin elbette çalışan örnekler var ama o örneklerle benim kodlar arasında hiçbir fark bulamıyorum. Aklıma birşey gelmiyor.

Kesme aktif olduğu anda işlemciye neler oluyor belli değil. HardFaulta felan düşmüyor.  Donup kalıyor öylece.
Kesmeden de vazgeçtim gibi birşey. İşimi halletmek adına kuru döngüde delay ile işlerimi halledeceğim. İşim biter bitmez kaldırıp atacam bu kartı. En az 1-2 sene boyuncada yüzüne bakmak istemiyorum.

İncelemek isteyen arkadaşlara tümüyle proje dosyasını gönderebilirim.

help!
Başlık: Ynt: STM32 CubeF7 Donanım ayarları
Gönderen: ahmet2015 - 09 Ocak 2016, 03:02:22
Gönder ben bir kite yükleyip bakayım nasıl çalışıyor.
Başlık: Ynt: STM32 CubeF7 Donanım ayarları
Gönderen: Mucit23 - 09 Ocak 2016, 11:38:19
Hocam internete yüklüyorum. Yüklenir yüklenmez linki bırakacağım.

mesaj birleştirme:: 09 Ocak 2016, 11:39:40

Evet Yandex disk'e yükledim.
https://yadi.sk/d/Cn-G3syOmkp5M
Başlık: Ynt: STM32 CubeF7 Donanım ayarları
Gönderen: ahmet2015 - 09 Ocak 2016, 16:43:39
"C:\Keil_v5\ARM\Pack\Keil\STM32F7xx_DFP\2.3.0\Projects\STM32746G-Discovery\Examples" klasörünün içindeki BSP projesini aldım

düzenledim Lcd , adc3 ü dma ile ayarladım.Adc3 A1 girişine ayarlı.Gönderdiğim projeyi ilgili yere koy ve kartına hex'i at.(Examples klasörü içine)

Çünkü senin gönderdiğin gibi full kütüphaneli göndermedim.Dosya boyu yaklaşık 22Mb.

Dosyaları şu an yüklüyorum linki ekleyeceğim birazdan.
Başlık: Ynt: STM32 CubeF7 Donanım ayarları
Gönderen: ahmet2015 - 09 Ocak 2016, 16:45:17
Projenin Linki:

http://1drv.ms/1Sa9PrN (http://1drv.ms/1Sa9PrN)

mesaj birleştirme:: 09 Ocak 2016, 17:32:26

Buda videosu:

https://www.youtube.com/watch?v=pte2Cm8myaY (https://www.youtube.com/watch?v=pte2Cm8myaY)
Başlık: Ynt: STM32 CubeF7 Donanım ayarları
Gönderen: Mucit23 - 09 Ocak 2016, 22:38:43
Ahmet hocam ilginiz için teşekkürler,

Şimdi indireyim dedim ama dosya silinmiş görünüyor. Kodları incelesem gerçekten güzel olacak. Bendeki yazılıma çok uğraştım çünkü.
Başlık: Ynt: STM32 CubeF7 Donanım ayarları
Gönderen: ahmet2015 - 10 Ocak 2016, 05:18:23
Dosyaları günlük olarak tutuyorum sonra siliniyor akşama kadar alabilirsin mucit23.

Yeni Link:  http://1drv.ms/1VVhGIK (http://1drv.ms/1VVhGIK)
Başlık: Ynt: STM32 CubeF7 Donanım ayarları
Gönderen: Mucit23 - 10 Ocak 2016, 12:14:57
Ahmet hocam selamlar,

Evet dosyayı indirdim. Dün gündüz vakti birkaç defa foruma telefon ile girmiştim. Akşam indiririm diye düşünmüştüm. Herneyse

Programı Hiç oynamadan karta yükledim çalışıyor. Teşekkürler. Şimdi kodları inceliyorum arada bir fark bulamadım ben. Nerede hata yapıyorum bu soru aklımı kurcalıyor.
Ben projeye başlamadan önce bütün kütüphaneleri vs toplayıp kendi başına derlenebilecek ayrı bir proje oluşturuyorum. Acaba hatalı yaptığım kısım burasımı onu anlamıyorum.  Böyle yapınca dediğiniz gibi proje boyutu yüksek oluyor.

Hocam siz dün BSP projesinden bahsedince bende sizin yaptığınız gibi yaptım. BSP projesini masaüstüne kopyaladım. Eksik Hal kütüphanelerini ve diğer kütüphaneleride kopyalayıp bütün bir proje haline getirdim.
Şimdi Timer3 kesmesi üzerinde uğraşıyorum.

BSP Projesinde gereksiz kütüphaneleri vs kaldırdım. Sadece LCD'yi bıraktım. LCD çalışıyor.

Main kodum bu şekilde oldu.
/**
  ******************************************************************************
  * @file    BSP/Src/main.c
  * @author  MCD Application Team
  * @version V1.0.2
  * @date    18-November-2015
  * @brief   This example code shows how to use the STM32746G Discovery BSP Drivers
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
  *
  * Redistribution and use in source and binary forms, with or without modification,
  * are permitted provided that the following conditions are met:
  *   1. Redistributions of source code must retain the above copyright notice,
  *      this list of conditions and the following disclaimer.
  *   2. Redistributions in binary form must reproduce the above copyright notice,
  *      this list of conditions and the following disclaimer in the documentation
  *      and/or other materials provided with the distribution.
  *   3. Neither the name of STMicroelectronics nor the names of its contributors
  *      may be used to endorse or promote products derived from this software
  *      without specific prior written permission.
  *
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  ******************************************************************************
  */

/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "stlogo.h"

/** @addtogroup STM32F7xx_HAL_Examples
  * @{
  */

/** @addtogroup BSP
  * @{
  */

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Global extern variables ---------------------------------------------------*/
uint8_t NbLoop = 1;
#ifndef USE_FULL_ASSERT
uint32_t    ErrorCounter = 0;
#endif

  uint8_t LED_Flag=0;

  TIM_HandleTypeDef  TimHandle;

/* Private function prototypes -----------------------------------------------*/
static void TIM_Config(void);
static void SystemClock_Config(void);
static void Display_DemoDescription(void);
static void CPU_CACHE_Enable(void);


/* Private functions ---------------------------------------------------------*/

/**
  * @brief  Main program
  * @param  None
  * @retval None
  */
int main(void)
{
  uint8_t  lcd_status = LCD_OK;
 
  CPU_CACHE_Enable();
  /* STM32F7xx HAL library initialization:
       - Configure the Flash prefetch, instruction and Data caches
       - Configure the Systick to generate an interrupt each 1 msec
       - Set NVIC Group Priority to 4
       - Global MSP (MCU Support Package) initialization
     */
  HAL_Init();
  /* Configure the system clock to 200 Mhz */
  SystemClock_Config();

  BSP_LED_Init(LED1);

  /* Configure the User Button in GPIO Mode */
//  BSP_PB_Init(BUTTON_KEY, BUTTON_MODE_GPIO);

  /*##-1- Initialize the LCD #################################################*/
  /* Initialize the LCD */
  lcd_status = BSP_LCD_Init();
  ASSERT(lcd_status != LCD_OK);

  /* Initialize the LCD Layers */
  BSP_LCD_LayerDefaultInit(LTDC_ACTIVE_LAYER, LCD_FRAME_BUFFER);

  Display_DemoDescription();

TIM_Config();

  while (1)
  {
     if(LED_Flag>0)BSP_LED_On(LED1);
  }
}

/**
  * @brief  Period elapsed callback in non blocking mode
  * @param  htim : TIM handle
  * @retval None
  */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  LED_Flag=1;
}

/**
  * @brief  TIM configuration
  * @param  None
  * @retval None
  */
static void TIM_Config(void)
{
/* Prescaler declaration */
  uint32_t uwPrescalerValue = 0;

  /* TIMx Peripheral clock enable */
__HAL_RCC_TIM3_CLK_ENABLE();


  /* Time Base configuration */
  TimHandle.Instance = TIM3;

  /* Compute the prescaler value to have TIMx counter clock equal to 10000 Hz */
  uwPrescalerValue = (uint32_t)((SystemCoreClock / 2) / 10000) - 1;


  TimHandle.Init.Period            = 10000-1;
  TimHandle.Init.Prescaler         = uwPrescalerValue;
  TimHandle.Init.ClockDivision     = 0;
  TimHandle.Init.CounterMode       = TIM_COUNTERMODE_UP;
  TimHandle.Init.RepetitionCounter = 0x0;

  if (HAL_TIM_Base_Init(&TimHandle) != HAL_OK)
  {
    /* Timer initialization Error */
  }

  /*##-2- Start the TIM Base generation in interrupt mode ####################*/
  /* Start Channel1 */
  if (HAL_TIM_Base_Start_IT(&TimHandle) != HAL_OK)
  {
    /* Starting Error */
  }

  /*##-2- Configure the NVIC for TIMx ########################################*/
  /* Set the TIMx priority */
  HAL_NVIC_SetPriority(TIM3_IRQn, 3, 0);
  /* Enable the TIMx global Interrupt */
  HAL_NVIC_EnableIRQ(TIM3_IRQn);

}


/**
  * @brief  System Clock Configuration
  *         The system Clock is configured as follow :
  *            System Clock source            = PLL (HSE)
  *            SYSCLK(Hz)                     = 200000000
  *            HCLK(Hz)                       = 200000000
  *            AHB Prescaler                  = 1
  *            APB1 Prescaler                 = 4
  *            APB2 Prescaler                 = 2
  *            HSE Frequency(Hz)              = 25000000
  *            PLL_M                          = 25
  *            PLL_N                          = 400
  *            PLL_P                          = 2
  *            PLL_Q                          = 8
  *            VDD(V)                         = 3.3
  *            Main regulator output voltage  = Scale1 mode
  *            Flash Latency(WS)              = 5
  * @param  None
  * @retval None
  */
static void SystemClock_Config(void)
{
  HAL_StatusTypeDef ret = HAL_OK;
  RCC_ClkInitTypeDef RCC_ClkInitStruct;
  RCC_OscInitTypeDef RCC_OscInitStruct;
 
  /* Enable Power Control clock */
  __HAL_RCC_PWR_CLK_ENABLE();

  /* The voltage scaling allows optimizing the power consumption when the device is
     clocked below the maximum system frequency, to update the voltage scaling value
     regarding system frequency refer to product datasheet.  */
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

  /* Enable HSE Oscillator and activate PLL with HSE as source */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLM = 25;
  RCC_OscInitStruct.PLL.PLLN = 400;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = 8;
  ret = HAL_RCC_OscConfig(&RCC_OscInitStruct);
  ASSERT(ret != HAL_OK);

  /* activate the OverDrive to reach the 180 Mhz Frequency */
  ret = HAL_PWREx_ActivateOverDrive();
  ASSERT(ret != HAL_OK);

  /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2
     clocks dividers */
  RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;

  ret = HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);
  ASSERT(ret != HAL_OK);
}

/**
  * @brief  Display main demo messages.
  * @param  None
  * @retval None
  */
static void Display_DemoDescription(void)
{
  /* Set LCD Foreground Layer  */
  BSP_LCD_SelectLayer(LTDC_ACTIVE_LAYER);

  BSP_LCD_SetFont(&LCD_DEFAULT_FONT);

  /* Clear the LCD */
  BSP_LCD_SetBackColor(LCD_COLOR_WHITE);
  BSP_LCD_Clear(LCD_COLOR_WHITE);

  /* Set the LCD Text Color */
  BSP_LCD_SetTextColor(LCD_COLOR_DARKBLUE);

  /* Display LCD messages */
  BSP_LCD_DisplayStringAt(0, 10, (uint8_t *)"STM32F746G BSP", CENTER_MODE);
  BSP_LCD_DisplayStringAt(0, 35, (uint8_t *)"Drivers examples", CENTER_MODE);

  /* Draw Bitmap */
  BSP_LCD_DrawBitmap((BSP_LCD_GetXSize() - 80) / 2, 65, (uint8_t *)stlogo);

}

/**
  * @brief  Check for user input.
  * @param  None
  * @retval Input state (1 : active / 0 : Inactive)
  */
uint8_t CheckForUserInput(void)
{
  if (BSP_PB_GetState(BUTTON_KEY) != RESET)
  {
    HAL_Delay(10);
    while (BSP_PB_GetState(BUTTON_KEY) != RESET);
    return 1 ;
  }
  return 0;
}



/**
  * @brief EXTI line detection callbacks.
  * @param GPIO_Pin: Specifies the pins connected EXTI line
  * @retval None
  */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{

}

/**
  * @brief  CPU L1-Cache enable.
  *         Invalidate Data cache before enabling
  *         Enable Data & Instruction Cache
  * @param  None
  * @retval None
  */
static void CPU_CACHE_Enable(void)
{
  (*(uint32_t *) 0xE000ED94) &= ~0x5;
  (*(uint32_t *) 0xE000ED98) = 0x0; //MPU->RNR
  (*(uint32_t *) 0xE000ED9C) = 0x20010000 |1<<4; //MPU->RBAR
  (*(uint32_t *) 0xE000EDA0) = 0<<28 | 3 <<24 | 0<<19 | 0<<18 | 1<<17 | 0<<16 | 0<<8 | 30<<1 | 1<<0 ; //MPU->RASE  WT
  (*(uint32_t *) 0xE000ED94) = 0x5;

  /* Invalidate I-Cache : ICIALLU register*/
  SCB_InvalidateICache();

  /* Enable branch prediction */
  SCB->CCR |= (1 <<18);
  __DSB();

  /* Enable I-Cache */
  SCB_EnableICache();

  /* Enable D-Cache */
  SCB_InvalidateDCache();
  SCB_EnableDCache();
}

#ifdef USE_FULL_ASSERT

/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t* file, uint32_t line)
{
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  /* Infinite loop */
  while (1)
  {
  }
}
#endif /* USE_FULL_ASSERT */

/**
  * @}
  */

/**
  * @}
  */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/


Timer ayarlarını TIM_Config() fonksiyonunda yapıyorum. Timere ait bütün ayarlar orada. Sonrasında stm32f7xx_it.c  içerisinde interrupt fonksiyonunu ekledim.

/**
  * @brief  This function handles TIM interrupt request.
  * @param  None
  * @retval None
  */
void TIMx_IRQHandler(void)
{
  HAL_TIM_IRQHandler(&TimHandle);
}


Kodları derleyip karta yüklediğimde işlemci çalışıyor ama kesme oluşmuyor. En azından önceki projedeki gibi kesmeyi aktif edince tümüyle işlemci donmuyor BSP projesinde. Ama kesme bir türlü çalışmadı. Fikriniz var mı bu konuda?

Timer ayarlarınıda TIM örneğinden aldım. Hiç değiştirmedim. Normalde 1 sn aralıklarla kesme oluşması lazım.

Amacım ADC den sabit frekansta örnek almak. Örneğin 10Khz, veya 20Khz gibi frekanslarda örnek almayı istiyorum. Timeri çalıştırabilmem bu açıdan çok önemli.
Başlık: Ynt: STM32 CubeF7 Donanım ayarları
Gönderen: ahmet2015 - 10 Ocak 2016, 17:10:01
Tamam bir bakayım akşam cevap yazarım.

Not: Arkadaşlar özel mesaj atmışlar kusura bakmayın mesaj sayım yüzünden cevap veremiyorum forumda sınırlıyım şu an için.

İlerde mesajlarım artarsa, sınırı geçersem mesajlarınızada cevap yazarım.

Şimdilik bu kadar.
Başlık: Ynt: STM32 CubeF7 Donanım ayarları
Gönderen: ahmet2015 - 10 Ocak 2016, 20:42:11
Tft Timer3 Proje örneği:

Link: http://1drv.ms/1ZeGw6G (http://1drv.ms/1ZeGw6G)

İletilerim çok geç yanıtlanıyor kusura bakmayın.
Başlık: Ynt: STM32 CubeF7 Donanım ayarları
Gönderen: Mucit23 - 10 Ocak 2016, 21:22:10
Anlamsız problemler devam etmekte. Konu hakkında sizlerin fikirlerini almak isterim.
Timer'i çalıştırmaya çalışıyorum(Ahmet hocam ilgilenirseniz sevinirim) Debug işlemi sırasında neler oluyor onu anlamaya çalışıyorum.
Tim ayarları vs yapıldıktan sonra program aşağıdaki gibi bir yere gelip bekliyor. Step butonuna basınca aynı yerde takılıp kalıyor. Ama her step butonuna bastığımda Timer Count registerinin arttığınıda görüyorum. Timer çalışıyor. Hata Timx_Status resigerindeki Update interrupt Flag'ın 1 (UIF) olduğunu görüyorum.

(http://s16.postimg.cc/4ohl9jf51/Ekran_Al_nt_s.png)

Kesmede oluşuyor sanırım. Fakat kesme alt programına gitmiyor.

İşte bu tür sıkıntılar var. ADC uygulamasında da aynı sorun vardı. Çalışmıyor ama niye çalışmadığını bulamıyorum. Sanki özel bir şeyler yapmak lazım. Atladığım bir şeyler varda onu bulamıyorum.

Başlık: Ynt: STM32 CubeF7 Donanım ayarları
Gönderen: z - 10 Ocak 2016, 21:28:03
Kesme rutinlerini yazmamışsın görünüyor.

Startupdaki default kesme rutinine gidiyor.
Başlık: Ynt: STM32 CubeF7 Donanım ayarları
Gönderen: Mucit23 - 10 Ocak 2016, 21:36:10
Hocam iyide stm32f7xx_it.c dosyası içerisinde kesme fonksiyonumu ekliyorum.

/**
  * @brief  This function handles TIM interrupt request.
  * @param  None
  * @retval None
  */
void TIMx_IRQHandler(void)
{
  HAL_TIM_IRQHandler(&TimHandle);
}

Fonksiyonun başlığınıda stm32f7xx_it.h dosyasına ekliyorum

void TIMx_IRQHandler(void);

Bunun yanı sıra örneklerden anladığım kadarıyla main içerisine aşağıdaki fonksiyonu eklemek gerekiyor.

/**
  * @brief  Period elapsed callback in non blocking mode
  * @param  htim : TIM handle
  * @retval None
  */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  //User Code   
}

Kesme bu fonksiyona düşünüyor anladığım kadarıyla. Bunun dışında bir şey yapmadım. Tim3'ü init ettikten sonra kesme olmasını bekliyorum.


Başlık: Ynt: STM32 CubeF7 Donanım ayarları
Gönderen: Mucit23 - 11 Ocak 2016, 16:50:52
Z hocam siz öyle diyince aklıma takıldı. Interrupt fonksiyonlarını başka bir yerde tanıtmak gerekiyormu?
Başlık: Ynt: STM32 CubeF7 Donanım ayarları
Gönderen: Mucit23 - 11 Ocak 2016, 22:24:42
Ben bayağı bi baktim ama yok timer için başka bir ayar yapmamıza gerek kalmiyor. Zaten startup dosyasında kesme vektorleri belirtilmiş durumda. Buna rağmen kesmenin oluşmaması problem gerçekten

Ahmet hocam timer kesmesi konusunda bir öneriniz olacakmı.
Başlık: Ynt: STM32 CubeF7 Donanım ayarları
Gönderen: z - 11 Ocak 2016, 22:35:15
Int fonkisonunun adı vector tablosundaki ad ile aynı olmak zorunda. Kontrol et.
Başlık: Ynt: STM32 CubeF7 Donanım ayarları
Gönderen: magnetron - 11 Ocak 2016, 22:37:42
hocam  TIMx_IRQHandler mi yazdınız

yoksa  TIM10_IRQHandler gibi Timer adı belirttiniz mi ?

mesajlarınızı takip ediyorum - bayadır uğraşıyorsunuz - bir fikir söyliyim dedim
Başlık: Ynt: STM32 CubeF7 Donanım ayarları
Gönderen: z - 11 Ocak 2016, 22:40:00
NVIC ayarlarını düzgün yapıldımı?
Başlık: Ynt: STM32F7 Donanım ayarları
Gönderen: Mucit23 - 11 Ocak 2016, 23:20:41
Alıntı yapılan: magnetron - 11 Ocak 2016, 22:37:42
hocam  TIMx_IRQHandler mi yazdınız

yoksa  TIM10_IRQHandler gibi Timer adı belirttiniz mi ?

mesajlarınızı takip ediyorum - bayadır uğraşıyorsunuz - bir fikir söyliyim dedim

Teşekkürler. Sorunu çözdüm. Ama sorunun sebebini anlayamadım.
Şimdi benim yaptığım TIM_Base örneğini doğrudan kopyalayıp kendi projemde çalıştırmaya çalışmaktı. Oradaki kodlara bakıp aynısını kendi projeme ekledim ilk etapta.

TIM_Base örneğinde İnterrupt fonksiyonu olarak aşağıdaki fonksiyon kullanılıyor

/**
  * @brief  This function handles TIM interrupt request.
  * @param  None
  * @retval None
  */
void TIMx_IRQHandler(void)
{
  HAL_TIM_IRQHandler(&TimHandle);
}


stm32f7xx_it.c dosyasında bu fonksiyon var. Ve çalışıyor. Bende ilk etapta aynı fonksiyonu kullandım ama kesme bu fonksiyona düşmüyordu.  Örneğe takılıp kalmışım anlaşılan. @magnetron öyle diyince fonksiyon adını TIM3_IRQHandler şeklinde değiştirdim. Şimdi kesme çalışmaya başladı.

Ama anlamıyorum?? Tim_Base örneğindeki startup ile benim startup aynı. Arada fark yok. O halde Tim_base örneğindeki kesme fonksiyonu nasıl oraya yönlendiriliyor?

@z hocam

Hal kütüphanesinde Nvic ayarları biraz daha basitleştirilmiş.

iki satırda yönlendirme işlemi yapılıyor. .
  /*##-2- Configure the NVIC for TIMx ########################################*/
  /* Set the TIMx priority */
  HAL_NVIC_SetPriority(TIM3_IRQn, 3, 0);
  /* Enable the TIMx global Interrupt */
  HAL_NVIC_EnableIRQ(TIM3_IRQn);


ADC ve DMA konusuna bakayım biraz.

Edit;

Bu arada önceki projedeki timeri aktif edince donma sorunuda çözüldü. Şimdi timer konusunda problem kalmadı gibi.

mesaj birleştirme:: 12 Ocak 2016, 00:29:52

Büyük ihtimal ADC+DMA projesinde dede sorun ADC'nin çok hızlı çalışıp DMA'yı aşırı bir şekilde meşgul etmesinden kaynaklanıyor. Şimdi ben o projede debug yapıyorum. ADCyi init eder etmez her iki-3 satır kod arasında adc_dma kesmesi oluşuyor.
Yani debugda iki adım ilerliyorum kesme oluşuyor iki adım ilerliyorum kesme oluşuyor. Sorun bu olsa gerek. DMA okadar meşgul oluyor ki LCD'ye vakit ayıramıyor.

Gerçi @ahmet2015 çalıştırmıştı şimdi onun kodlarına bakıyorum

Gördüğüm tek fark HAL_NVIC_SetPriority(ADCx_DMA_IRQn, 15, 0); satırında

NVIC_Priority 15 yapılmış. Bende öyle yaptım ama yine çalışmadı.
Başlık: Ynt: STM32F7 Donanım ayarları
Gönderen: Mucit23 - 13 Ocak 2016, 15:32:57
Merhaba Arkadaşlar,

ADC'yi timer ile tetiklemeye çalışıyorum. Şunu sormak istiyorum. ADC3'ü Timer2 TRGO kanalından tetik alacak şekilde ayarladım. Timer'da ise TRGO Update tetikleme çıkışını aktif ettim.

Timer ayarlarım aşağıdaki gibi.

  TIM_MasterConfigTypeDef sMasterConfig;
/* Prescaler declaration */
  uint32_t uwPrescalerValue = 0;

  /* TIMx Peripheral clock enable */
__HAL_RCC_TIM2_CLK_ENABLE();


  /* Time Base configuration */
  TimHandle.Instance = TIM2;

  /* Compute the prescaler value to have TIMx counter clock equal to 10000 Hz */
  uwPrescalerValue = (uint32_t)((SystemCoreClock / 2) / 10000) - 1;


  TimHandle.Init.Period            = 5000-1;
  TimHandle.Init.Prescaler         = uwPrescalerValue;
  TimHandle.Init.ClockDivision     = 0;
  TimHandle.Init.CounterMode       = TIM_COUNTERMODE_UP;
  TimHandle.Init.RepetitionCounter = 0x0;

  if (HAL_TIM_Base_Init(&TimHandle) != HAL_OK)
  {
    /* Timer initialization Error */
  }

  /* Timer TRGO selection */
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_ENABLE;

  if (HAL_TIMEx_MasterConfigSynchronization(&TimHandle, &sMasterConfig) != HAL_OK)
  {
    /* Timer TRGO selection Error */
  }

  /*##-2- Start the TIM Base generation in interrupt mode ####################*/
  /* Start Channel1 */
  if (HAL_TIM_Base_Start_IT(&TimHandle) != HAL_OK)
  {
    /* Starting Error */
  }

  /*##-2- Configure the NVIC for TIMx ########################################*/
  /* Set the TIMx priority */
  HAL_NVIC_SetPriority(TIM2_IRQn, 3, 0);
  /* Enable the TIMx global Interrupt */
  HAL_NVIC_EnableIRQ(TIM2_IRQn);


ADC ayarlarım ise aşağıdaki gibi.

  ADC_ChannelConfTypeDef sConfig;
  /*##-1- Configure the ADC peripheral #######################################*/
  AdcHandle.Instance          = ADC3;
 
  AdcHandle.Init.ClockPrescaler        = ADC_CLOCKPRESCALER_PCLK_DIV4;
  AdcHandle.Init.Resolution            = ADC_RESOLUTION_12B;
  AdcHandle.Init.DataAlign             = ADC_DATAALIGN_RIGHT;
  AdcHandle.Init.NbrOfConversion       = 1;
  AdcHandle.Init.ScanConvMode          = DISABLE;                       /* Sequencer disabled (ADC conversion on only 1 channel: channel set on rank 1) */
  AdcHandle.Init.ContinuousConvMode    = DISABLE;                       /* Continuous mode disabled to have only 1 conversion at each conversion trig */
  AdcHandle.Init.DiscontinuousConvMode = DISABLE;                       /* Parameter discarded because sequencer is disabled */
  AdcHandle.Init.NbrOfDiscConversion   = 0;
  AdcHandle.Init.ExternalTrigConvEdge  = ADC_EXTERNALTRIGCONVEDGE_RISING;        /* Conversion start trigged at each external event */
  AdcHandle.Init.ExternalTrigConv      = ADC_EXTERNALTRIG2_T2_TRGO;
  AdcHandle.Init.DMAContinuousRequests = ENABLE;
  AdcHandle.Init.EOCSelection          = ADC_EOC_SINGLE_CONV;




  if (HAL_ADC_Init(&AdcHandle) != HAL_OK)
  {
    /* ADC initialization Error */
  }

  /*##-2- Configure ADC regular channel ######################################*/
  sConfig.Channel      = ADC_CHANNEL_8;
  sConfig.Rank         = 1;
  sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;
  sConfig.Offset       = 0;

  if (HAL_ADC_ConfigChannel(&AdcHandle, &sConfig) != HAL_OK)
  {
    /* Channel Configuration Error */
  }

  /*##-3- Start the conversion process #######################################*/
  if(HAL_ADC_Start_DMA(&AdcHandle, (uint32_t*)&uhADCxConvertedValue, 1) != HAL_OK)
  {
    /* Start Conversation Error */
  }


Debug ile arka planda neler oluyor onlara bakıyorum. Timerin çalışıp çalışmadığını anlamak için TIM_IRQn kesmesini aktif ettim. Debug ile kesme oluştuğunu TIM Status Registerinin UIF bitini kontrol ederek anlıyorum. Kesme oluşursa eğer bu bit 1 oluyor ardından işlemci kesmeye gidiyor flag tekrar temizleniyor vs.

Kesme kendi başına oluşuyor. Yani Timer'ın çalışmasında sıkıntı yok diyebiliriz. Yalnız ADC'ye tetikleme sinyali gitmiyor.

Bu arada ADC ile ilgili Trigger ayarlarınıda kontrol ettim debug ile. Yaptığım ayarlamalar ADC3->CR2 registerinin ilgili bitlerine yazılıyor. Anladığım kadarıyla ADC'de trigger ayarları bundan ibaret.

Timerde ise TRGO çıkışı TIM2->CR2 Registerinin MMS bitleri ile yapılıyor  Ben bu ayarı TIM_TRGO_UPDATE şeklinde yaptım.

Başkada bir ayar yaptığım yok. Bu ayarların hepsini debug yapıp ilgili registerleri kontrol ederek doğruluyorum. Hatta debug sırasında şöyle bir test yaptım. ADC3->CR2 registerinin 29 nolu biti SWSTART bitidir. (Start conversion of regular channels) Ben debug sırasında bu biti bi anlık aktif ediyorum. Ardından ADC birkaç adım sonra dönüşümü yapıp dma vasıtasıyla değişkenime yazıyor daha sonra tekrardan beklemeye başlıyor.

Timer tetik vermiyor anlaşılan.  ADC+Timer TRGO tetiklemesi için başka ne gibi ayarlamalar yapmak gerekiyor? Problem nerede olabilir?

mesaj birleştirme:: 13 Ocak 2016, 16:20:28

Çalıştırdım. Yalnız Allah aşkına şu duruma bi bakın.

Burada birisi aynı problemi yaşamış. Bi umuttur şeklinde düşünüp denedim ve çalıştı  :o
https://my.st.com/public/STe2ecommunities/mcu/Lists/STM32Discovery/Flat.aspx?RootFolder=%2Fpublic%2FSTe2ecommunities%2Fmcu%2FLists%2FSTM32Discovery%2FSTM32F7%20Discovery%20-%20having%20trouble%20getting%20the%20ADC%20DMA%20to%20work&FolderCTID=0x01200200770978C69A1141439FE559EB459D75800084C20D8867EAD444A5987D47BE638E0F&currentviews=306

RCC'den DAC'nin Clock kaynağını aktfi etmesen TRGO ile ADC tetiklenmiyor. DAC ile ne alakası var anlamadımki

Timerin clock kaynağını açarken   __HAL_RCC_DAC_CLK_ENABLE(); ile DAC nin de clock kaynağını açmak gerekiyor. F4 de felan böyle bir durum varmı. Daha önce Timer Trigger output kullanan oldumu? 
Başlık: Ynt: STM32F7 Donanım ayarları
Gönderen: Mucit23 - 02 Şubat 2016, 12:54:24
Selamlar,

HAL Library'de MCO çıkışını kullanan oldumu?

Ben şimdi MCO1 den çıkış almak istiyorum. Hemen Manuale baktım MCO1 çıkışı PA8 görünüyor. Başka seçenekde yok.  PA8 pinini MCO ya yönlendirdim. MCO kaynağınıda PLLCLK'dan alacak şekilde ayarladım. Scop ile PA8'i  gözlemliyorum.

PLLCLK yı 216Mhz'ye ayarlamışım. MCO Presacaller değerinide 4 yaptım. Yani 216Mhz değeri 4'e bölünüp 54Mhz olarak PA8 den çıkması gerekir. Ama tık yok.

Ayarlarım bu şekilde.
GPIO_InitTypeDef  gpio_init_structure;
  __HAL_RCC_GPIOA_CLK_ENABLE();

  gpio_init_structure.Pin = GPIO_PIN_8;
  gpio_init_structure.Mode = GPIO_MODE_AF_PP;
  gpio_init_structure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  gpio_init_structure.Pull = GPIO_NOPULL;
gpio_init_structure.Alternate = GPIO_AF0_MCO;
  HAL_GPIO_Init(GPIOA, &gpio_init_structure);
 
HAL_RCC_MCOConfig(RCC_MCO1,RCC_MCO1SOURCE_PLLCLK,RCC_MCO_DIV4);


GPIO'yu alternate functionlara yönlendirme ile ilgili başka bir fonksiyon yok gördüğüm kadarıyla. STD librarda Alternate functionlar için başka bir fonksiyon vardı. HAL libraryde GPIO_InitTypeDef  struct'ı ile ayarlanıyor hepsi.

Fikri olan varmı.

MCO kaynağını HSI veya HSE seçiyorum yine tık yok
Başlık: Ynt: STM32F7 Donanım ayarları
Gönderen: Mucit23 - 05 Şubat 2016, 00:37:23
MCO Probleminide çözmüş bulunmaktayım. Aslında sorun benden değil ST'nin verdiği şemadan kaynaklanıyor.

Şemada ufak bir terslik var.

(http://s22.postimg.cc/dnmrw0a7l/Ekran_Al_nt_s.png)

Kartın şemasında 6. sayfada PA8 pini Arduino D5 konnektörüne bağlı şeklinde gözükürken 9. sayfada PA8 Arduino D10 konnektörüne bağlı Ve gerçektende öyle PA8 Arduino D10 pinine bağlı.

Bende 2 gündür acaba niye D5'de sinyal göremiyorum pin mi bozuldu diye tırmalıyorum boş yere.  >:(