ARM-STM32F4 Programlamayı bilen var mı yardım lazım :) ?

Katılım
18 Ocak 2008
Mesajlar
1,088
Puanları
156
Yaş
40
Herkese selamun aleyküm değerli ustalarım stm32f4 serisi işlemcileri programlamak için çeşitli yollar denedim en son olarak iki noktada takılı kaldım.

1 ) MikroC ile arm programlama : Mikroc benim pic için de kullandığım aynı zamanda çok kararlı çalışmadığını bildiğim ama yine de güzel projelerin çıkabileceği bir programlama dili ve hakimiyetim olduğu için bişiyler yapabiliyorum lakin kullanan var mı nasıl bir sonuç veriyor merak ediyorum.

2) CubemxIde diye ST nin kendi sitesinde kendi programı var her şey güncel nerdeyse de anlık güncelleniyor deniliyor ama ben bu programda kullanılan HAL kütüphanelerini anlayamıyorum biraz desteğe ihtiyacım var Bir sürü değişik yazılım şekli ve bir çok değişken alabilme özelliği var gibi ama adam bunu direk çözüp kopyala yapıştır yaparak bile kullanabiliyor.

Şu hal kütüphaneleri konusunda bana bilgi verebilir misiniz Nasıl kullanılıyor nerelerden faydalanılıyor... ?
 
HAL kitaplığı Register bazında işlem yapmamak için sana dahili fonksiyonlar sunar. StmcubeMX içinde derleyici içermez sadece yaptığın konfigürasyonları koda çevirir. Onun sana hazırladığı kodu vscode gibi bir ortamda derlemen lazım. StmcubeIDE içerisinde derleyici içerir. İnternette yüzlerce örnek var. Eğer hiçbir bilgin yoksa stm32f4 serisinin arduino desteği var. Basit olarak oradan başlayabilirsin.
 
İşin başında biraz zorlanırsınız ancak kesinlikle CubeIde yi kullanın derim.Çok kolaylık saglıyor.Register bazında yazmanız gerekenleri kendisi hazır yazılmış bir şekilde veriyor.Youtube de basit örnekleri incelerseniz jeton düşmeye başlar.Arduino vs ile ugraşmak belki başlangıç için olabilir ancak büyük veya karmaşık projelerde yetersiz kalacaktır.
 
İlk duyup sistemini anladığım günden itibaren arduino ya gıcığım zaten

Değerli ustalarım şu hal kütüphanesi meselesini çözemiyorum zaten bir türlü; Adamlar örneğini vermişler ama bir kütüphane içerisinden o komutu ve o komuta ait parametreleri vermişler o parametrelerin ayıklama olayını ne olduklarını nereden geldiklerini çıkartamıyorum...

Kolay bir yol yordamı var mıdır bilmiyorum ama gerçekten öğrenmeye ihtiyacım var.
 
Tam olarak neyine gıcıksın abi Ben insanlara arduino öğretiyorum özellikle senin gibi yeni başlayan insanlar işin mantığını öğrensin diye. Örneğin Arduino ile aşağıdaki kod:

C++:
void setup(){
    Serial.begin(115200);
    Serial.println("Merhaba dünya");
}
void loop(){
    
}

HAL kitaplığıyla şöyle yazılıyor.

C++:
/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2021 STMicroelectronics.
  * All rights reserved.</center></h2>
  *
  * This software component is licensed by ST under BSD 3-Clause license,
  * the "License"; You may not use this file except in compliance with the
  * License. You may obtain a copy of the License at:
  *                        opensource.org/licenses/BSD-3-Clause
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/
UART_HandleTypeDef huart1;

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART1_UART_Init(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  uint8_t mesaj[] = "Merhaba dünya\r\n";
  HAL_UART_Transmit_IT(&huart1, (uint8_t *)mesaj, sizeof(mesaj));
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }
  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
  {
    Error_Handler();
  }
}

/**
  * @brief USART1 Initialization Function
  * @param None
  * @retval None
  */
static void MX_USART1_UART_Init(void)
{

  /* USER CODE BEGIN USART1_Init 0 */

  /* USER CODE END USART1_Init 0 */

  /* USER CODE BEGIN USART1_Init 1 */

  /* USER CODE END USART1_Init 1 */
  huart1.Instance = USART1;
  huart1.Init.BaudRate = 115200;
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
  huart1.Init.StopBits = UART_STOPBITS_1;
  huart1.Init.Parity = UART_PARITY_NONE;
  huart1.Init.Mode = UART_MODE_TX_RX;
  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  if (HAL_UART_Init(&huart1) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN USART1_Init 2 */

  /* USER CODE END USART1_Init 2 */

}

/**
  * @brief GPIO Initialization Function
  * @param None
  * @retval None
  */
static void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOB_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET);

  /*Configure GPIO pin : PB13 */
  GPIO_InitStruct.Pin = GPIO_PIN_13;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @retval None
  */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  __disable_irq();
  while (1)
  {
  }
  /* USER CODE END Error_Handler_Debug */
}

#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 CODE BEGIN 6 */
  /* 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) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

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

Bunun çoğunu cubeMX kendisi oluşturuyor ama yeni başlayan birisi içinden ilgili kısımları nasıl seçecek. Karar senin ama teknolojiye gıcık olunmaz, hangisi işine gelirse onu kullanrsın.
 
@FakirMaker Hocam bana biraz yardımcı olur musunuz şu hal meselesi hakkında gerisini bol bol tartışırız arduino mu pic i döver stm ikisini birden mi döver
 
Abi öğrenmek zaman ister emek ister foruma soru sorarak öğrenmek gerçekten zor. Ben sadece yapacağın proje hakkında yol gösterebilirim, örnek verebilirim. Eğer işin acilse gel inat etme Arduino kullan şimdilik, ileride basic mi öğrenirsin assembly mi kasarsın sana kalmış. Eğer büyük bir sır değilse projeni anlatman lazım. Müsait oldukça bakar cevap yazarım.
 
O zaman bol bol yazı okuyacaksın hocam durumu şöyle izah edeyim :

Ben biraz pic programlama bilgisine sahibim pic ile çeşitli programlar yazabiliyor devreler yapabiliyorum...

Bir müddet önce bir proje çizdim 16F628A entegresi bana pin sayısı ve hız olarak gayet yeterli idi...

Opto kuplör kullanarak çift besleme devre sistemi ile pic ve rölelerin şase tarafı hiç bir şekilde birbirine temas etmemek şartı ile bir devre tasarladım ve proteus ile baskı devresini çizdim pcbway dan baskı devre yaptırdım işte resimleri.





Evet devreyi götürüp makineye taktım evde hiç ama hiç sorunsuz çalışan devre makine üzerinde saçma sapan şekilde çalışmaya başladı özetle elektromanyetik alan ve elektriksel gürültü ( parazitler ) benim devremin çalışmasını alt üst etti sonra kondansatör takviyeleri vs ile bir şekilde bir tık daha üst olacak şekilde çalıştırdık ama yine çok büyük sapıtmalar oluyor...

Sonra dedim ki bu iş böyle olmayacak kafamda hata olacak bir kaç şey vardı, mesela pic regüle devresinde 7805 kullanmıştım onu değiştirdim lm2575-5 devresi yaptım 16f628a yı değiştirdim 18f1220 diye bir işlemci sipariş ettim, yine beslemeler ayrı trafolardan olacak şekilde optik izole ile sistemin röle ve işlemci kısımlarını tamamen birbirinden ayırdım. Pic de boşta kalan bütün bacakları direk şaseye verdim, mclre pinini direk olarak artıya çektim. roleleri finder olarak en kaliteli rölerler ile değiştirdim, Parazitlerle savaşması için bir çok kritik noktaya kondansatörler ilave ettim. rölelerin 220 volt giren ortak noktalarına direk 450 volt 47uF kondansatör için bağlantı noktası koydum gibi bir çok yeni şeyler yaptım. işte resimleri :





Tabi yazılımı da ona göre değiştireceğim ama yine parazit alacağından korkuyorum. Pic bu konuda en mimli en lanet olası işlemcilerden bir tanesiymiş

Atmega düşündüm evet bir çok kaynak ve derleyici mevcut hatta mikroc gibi bir koca yiğit var ama pic den pek farklı değil hem mimari olarak hem de bit genişliği olarak.

Sırf şu parazit konusundan kurtulmak için araştırma yaptım ve stm yani arm işlemcileri ile uğraşmaya karar verdim.
 
Abi çözümü yanlış yerde arıyorsun. Tüm işlemciler parazite duyarlıdır. Belki birisi diğerine göre daha dayanıklıdır ama garantisi yok. Yani işlemciyi değiştirsen bile bu sorundan kurtulamayabilirsin. İşlemciyi korumak için devreyi metal bir kutuya koyup topraklayabilirsin. EMI önleyici devreler kurabilirsin, en önemlisi stabil bir güç kaynağı bağlarsın. Ha illa ki stm ye geçmek istiyorum dersen stm32f4 serisine değil stm32f1 serisine geç. Bluepill denen çok ucuz bir kart var st-link le beraber al. Yazılımını yapar şu anki devrede bulunan optokuplörlere bağlar denersin. Gördüğüm kadarıyla devre sadece röle çektiriyor. Yazılımı çok karmaşık olmasa gerek. Eğer sadece bu devre için stm32 kullanacaksan arduino kullan yorma kendini bence.
 
Çıkışlardan ziyade girişleri optokuplerle kullan.Ben 24 giriş 24 çıkışlı pic ile yapılmış devreyi fabrika ortamında kullanıyorum,hiçbir sorun çıkmıyor.
Hal kütüphanesini ayıklayacam diye ugraşma,oldugu gibi kullan.Kütüphane içerisinde fazladan kontroller işin güvenligi için yapılan eklemeler.Zaten en basit 103 serisi bile 72Mhz de çalışıyor.Register bazlı program yazma ancak Lcd ekranda video oynatma gibi yüksek hız gerektiren yerlerde lazım olur.Keza bu tarz programlarda bile kendini zorlamadan bir üst seri işlemciye geçerek sorunu halledebilirsin.
Yaptıgın kart için en basit olanı(herzaman bildigin şey en kolay olandır) kullan.Bu kartın çok fazla bir fonksiyonu oldugunu zannetmiyorum.Kolay gelsin.
 
Bu siteyi kullanmak için çerezler gereklidir. Siteyi kullanmaya devam etmek için onları kabul etmelisiniz. Daha fazla bilgi edin…