STM32F7 Donanım ayarları

Başlatan Mucit23, 29 Aralık 2015, 01:18:57

Mucit23

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!

ahmet2015

#31
Gönder ben bir kite yükleyip bakayım nasıl çalışıyor.

Mucit23

#32
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

ahmet2015

#33
"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.

ahmet2015

#34
Projenin Linki:

http://1drv.ms/1Sa9PrN

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

Buda videosu:

https://www.youtube.com/watch?v=pte2Cm8myaY

Mucit23

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ü.

ahmet2015

Dosyaları günlük olarak tutuyorum sonra siliniyor akşama kadar alabilirsin mucit23.

Yeni Link:  http://1drv.ms/1VVhGIK

Mucit23

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.

ahmet2015

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.

ahmet2015

#39
Tft Timer3 Proje örneği:

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

İletilerim çok geç yanıtlanıyor kusura bakmayın.

Mucit23

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.



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.


z

Kesme rutinlerini yazmamışsın görünüyor.

Startupdaki default kesme rutinine gidiyor.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Mucit23

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.



Mucit23

Z hocam siz öyle diyince aklıma takıldı. Interrupt fonksiyonlarını başka bir yerde tanıtmak gerekiyormu?

Mucit23

#44
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ı.