STM32CubeMX ten hic birsey anlamadim

Başlatan Karamel, 21 Aralık 2014, 19:47:16

Gökhan BEKEN

Stm32f429 discovery ile çalışıyorum, (SDIO'yu 4 bit kullanıyorum), file sistem kullanmıyorum sadece raw data yazıyorum, çünkü çok hızlı bir şekilde yazmam lazım.
Buffer'ım 120832 byte'lık,
60416 byte yazdıktan sonra, dma'ya al kardeş bunu sd karta yaz deyip, diğer yarıyı doldurmaya devam ediyorum, 2.yarıyı da doldurduktan sonra tekrar dma'ya al kardeş bunu da yaz diyorum
böylece sonsuz döngü içinde sırayla devam ediyor. Bu kadar byte'ı mümkün olduğu kadar yüksek hızda yazmam lazım. Maksimum 40ms-50ms gibi bir süre de bitirmem lazım.
DMA kullanmadan düzgün yazıyor, dma'yı aktif edip yazmaya çalıştığımda fonksiyon içindeki while'da takılı kalıyor.
Aynı kart üzerinde standart library ile sorun olmadan kullanıyorum aslında ama ben cube ile ürettiğim kod ile devam etmek istiyorum.

Teşekkürler.
Özel mesaj okumuyorum, lütfen göndermeyin.

Burak B

Takıldığı yeri içeren dosyayı ve fonksiyonu söylermisin bir kontrol edeyim.
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

Gökhan BEKEN

aşağıdaki kodlar main.c'nin
kodlarda sdSayac=0x8008*512; diye bir kısım var, o sd kart'ta yazmaya başlanacak kısım, sd kartı format atıp içine 100mb'lık bir dosya atıyorum, ve onun başlangıç adresi bu oluyor:0x8008*512;
/**
  ******************************************************************************
  * File Name          : main.c
  * Date               : 19/03/2015 18:25:06
  * Description        : Main program body
  ******************************************************************************
  *
  * COPYRIGHT(c) 2015 STMicroelectronics
  *
  * 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 "stm32f4xx_hal.h"

/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* Private variables ---------------------------------------------------------*/
SD_HandleTypeDef hsd;
HAL_SD_CardInfoTypedef SDCardInfo;
DMA_HandleTypeDef hdma_sdio_tx;

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_DMA_Init(void);
static void MX_SDIO_SD_Init(void);

/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* USER CODE BEGIN 0 */
	unsigned int sdSayac=0x8008*512;
	unsigned char tampon[120832]="denemek veya denememek";
/* USER CODE END 0 */

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();

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

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_SDIO_SD_Init();

  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* USER CODE BEGIN 3 */
  /* Infinite loop */
	

//	HAL_GPIO_TogglePin(GPIOG, GPIO_PIN_13);
//	HAL_SD_WriteBlocks(&hsd,(unsigned int*)&tampon[0],sdSayac,512,1); //bu sorunsuz çalışıyor(DMA'sız)
//	HAL_GPIO_TogglePin(GPIOG, GPIO_PIN_14);
	
	unsigned int i=0;
	for(i=0;i<60416;i+=10){
			tampon[i+0]='<';
			tampon[i+1]='A';
			tampon[i+2]='b';
			tampon[i+3]='c';
			tampon[i+4]='d';
			tampon[i+5]='e';
			tampon[i+6]='f';
			tampon[i+7]='g';
			tampon[i+8]='h';
			tampon[i+9]='>';
	}
	

  while (1)
  {
//			HAL_SD_WriteBlocks_DMA(&hsd,(unsigned int*)&tampon[0],sdSayac,512,1);
			if(HAL_SD_WriteBlocks_DMA(&hsd,(unsigned int*)&tampon[0],sdSayac,512,1) == SD_OK)
			{
					HAL_GPIO_TogglePin(GPIOG, GPIO_PIN_13);
					if(HAL_SD_CheckWriteOperation(&hsd, 0xFFFFFFFF) == SD_OK){
							HAL_GPIO_TogglePin(GPIOG, GPIO_PIN_14);
					}
			}
//			HAL_SD_CheckWriteOperation(&hsd,0xFFFFFFF);
//			HAL_GPIO_TogglePin(GPIOG, GPIO_PIN_14);
    

  }


  /* USER CODE END 3 */

}

/** System Clock Configuration
*/
void SystemClock_Config(void)
{

  RCC_OscInitTypeDef RCC_OscInitStruct;
  RCC_ClkInitTypeDef RCC_ClkInitStruct;

  __PWR_CLK_ENABLE();

  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

  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 = 5;
  RCC_OscInitStruct.PLL.PLLN = 210;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = 7;
  HAL_RCC_OscConfig(&RCC_OscInitStruct);

  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK|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;
  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);

}

/* SDIO init function */
void MX_SDIO_SD_Init(void)
{

  hsd.Instance = SDIO;
  hsd.Init.ClockEdge = SDIO_CLOCK_EDGE_RISING;
  hsd.Init.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE;
  hsd.Init.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE;
  hsd.Init.BusWide = SDIO_BUS_WIDE_1B;
  hsd.Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE;
  hsd.Init.ClockDiv = 0;
  HAL_SD_Init(&hsd, &SDCardInfo);

  HAL_SD_WideBusOperation_Config(&hsd, SDIO_BUS_WIDE_4B);

}

/** 
  * Enable DMA controller clock
  */
void MX_DMA_Init(void) 
{
  /* DMA controller clock enable */
  __DMA2_CLK_ENABLE();

  /* DMA interrupt init */
  HAL_NVIC_SetPriority(DMA2_Stream3_IRQn, 0, 0);
 // HAL_NVIC_EnableIRQ(DMA2_Stream3_IRQn);

}

/** Configure pins as 
        * Analog 
        * Input 
        * Output
        * EVENT_OUT
        * EXTI
        * Free pins are configured automatically as Analog (this feature is enabled through 
        * the Code Generation settings)
*/
void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct;

  /* GPIO Ports Clock Enable */
  __GPIOE_CLK_ENABLE();
  __GPIOC_CLK_ENABLE();
  __GPIOF_CLK_ENABLE();
  __GPIOH_CLK_ENABLE();
  __GPIOA_CLK_ENABLE();
  __GPIOB_CLK_ENABLE();
  __GPIOG_CLK_ENABLE();
  __GPIOD_CLK_ENABLE();

  /*Configure GPIO pins : PE2 PE3 PE4 PE5 
                           PE6 PE7 PE8 PE9 
                           PE10 PE11 PE12 PE13 
                           PE14 PE15 PE0 PE1 */
  GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5 
                          |GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9 
                          |GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13 
                          |GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1;
  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);

  /*Configure GPIO pins : PC13 PC14 PC15 PC0 
                           PC1 PC2 PC3 PC4 
                           PC5 PC6 PC7 */
  GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_0 
                          |GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4 
                          |GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;
  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  /*Configure GPIO pins : PF0 PF1 PF2 PF3 
                           PF4 PF5 PF6 PF7 
                           PF8 PF9 PF10 PF11 
                           PF12 PF13 PF14 PF15 */
  GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3 
                          |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7 
                          |GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11 
                          |GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;
  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);

  /*Configure GPIO pin : PA0 */
  GPIO_InitStruct.Pin = GPIO_PIN_0;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /*Configure GPIO pins : PA1 PA2 PA3 PA4 
                           PA5 PA6 PA7 PA8 
                           PA9 PA10 PA15 */
  GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4 
                          |GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8 
                          |GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_15;
  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /*Configure GPIO pins : PB0 PB1 PB2 PB10 
                           PB11 PB12 PB13 PB14 
                           PB15 PB3 PB4 PB5 
                           PB6 PB7 PB8 PB9 */
  GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_10 
                          |GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14 
                          |GPIO_PIN_15|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5 
                          |GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9;
  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  /*Configure GPIO pins : PG0 PG1 PG2 PG3 
                           PG4 PG5 PG6 PG7 
                           PG8 PG9 PG10 PG11 
                           PG12 PG15 */
  GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3 
                          |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7 
                          |GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11 
                          |GPIO_PIN_12|GPIO_PIN_15;
  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);

  /*Configure GPIO pins : PD8 PD9 PD10 PD11 
                           PD12 PD13 PD14 PD15 
                           PD0 PD1 PD3 PD4 
                           PD5 PD6 PD7 */
  GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11 
                          |GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15 
                          |GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_3|GPIO_PIN_4 
                          |GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;
  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

  /*Configure GPIO pins : PG13 PG14 */
  GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_14;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
  HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);

}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

#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

/**
  * @}
  */ 

/**
  * @}
*/ 

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
Özel mesaj okumuyorum, lütfen göndermeyin.

Burak B

IRQ yapılandırmanla ilgili bir sorun olabilir. ISR' lere kesme koyup bir gözlemle bakalım herşey yolunda mı ?
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

Burak B

#34
Ancak vakit bulabildim. Kodu inceledim  HAL_SD_DMA_RxErrorCallback ve HAL_SD_DMA_TxCpltCallback gibi weak callback fonksiyonları kullanmamışsın. Onları kullanman gerek. Böylece transfer işlemleri bittimi bitmedimi anlayabilirsin. Aksi halde bir transfer bitmeden bir diğerini başlatmış olursun ki bu durum DMA'nın hata vermesine ve kilitlenmesine sebep olur. Bunun için de bir callback mevcut. HAL içindeki bu callbackler sayesinde işlemi tekrarlamak yada tamamını sıfırlamak gibi seçeneklerin oluyor.

DMA non-block olduğu için HAL_SD_WriteBlocks_DMA ile veriyi yazdıktan sonra kod bekleme yapmaz SD_OK sadece gönderme işleminin başarılı olduğunu onaylıyor. Kısaca sonsuz loop içinde yapmaya çalıştığın şey doğru gelmedi bana.
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

Gökhan BEKEN

Hocam dediğiniz doğru, sonsuz while içinde sürekli yaparsak saçmalar. Aslında döngü ile değil sadece 1 kere çağırıp denemiştim olmamıştı, sonra kod ile oynarken en son bu hali kalmış. Benim aslında, yazma işleminin bittiğine dair bir bilgiye ihtiyacım yok, bufferi dma'ya gönderip, diğer işlere geçiyorum, dma'nın yazma süresi benim diğer işlerimden daha kısa olduğu için, bir sonraki yazma kısmına geçtiğinde benim yazma işim çoktan bitmiş oluyor.
Özel mesaj okumuyorum, lütfen göndermeyin.

Karamel

hocam ben cok kisa bir soru sorup ortadan kaybolmak istiyorum ::)

sanirim SDIO sd card i surmek icin kullanilan hardware birimi. peki spi dan farki ne? neden bunu kullaniyorda spi i kullanmiyorsunuz?

mesaj birleştirme:: 20 Mart 2015, 23:54:00

birde bununla yapilipta spi la yapilamayan(yada tam tersi) seyler neler?

Gökhan BEKEN

SD kartı 2 türlü kullanabilirsin, biricisi SPI, diğeri SDIO,
spi seri iletişimdir, 1 clock, 1 data in, 1 dataout
sdio  paralel iletişim sağlar
1 byte'lık veri göndermek için sdio da 2 kere veri gönderirsin, çünkü her seferinde 4 bit gönderirsin, 4+4=8 byte
spi'da ise, her seferinde 1 bit gönderirsin, 8 adımda tamamlanır.
8/2=4 olduğundan sdio, spi'dan 4 kat daha hızlıdır.
Bana da çıkabileceğim en yüksek hız lazım.
Bu yüzden sdio kullanıyorum.
Nand bellek kullanmak da bir çözüm ancak, piyasada sdkart kadar geniş kapasiteli nand bulmak sorun ve nand'ı söküp bilgisayara takarak okumak hiç rahat olmaz.
Özel mesaj okumuyorum, lütfen göndermeyin.

Karamel

hocam peki SDIO ile kullanmada kutuphanelerde degisim gerektiriyormu?

yazin ben wav player yapmak istiyorum. hangi model baglantiyi onderirsiniz? kutuphaneler hangilerini destekliyorlar?

Gökhan BEKEN

SDIO dururken, SPI kullanmak iyi bir tercih değil.
Majerle diye bir adam var, onun kütüphanesinde fatfs veya spi desteği var. Kütüphanenin tanımlamalar kısmında spi'mı yoksa sdio'mu olduğunu belirtiyorsun, geriye kalan herşeyi kütüphane hallediyor. Normalde böyle bir destek yok tabiki, adam uğraşmış ikisini de yazmış.

https://github.com/MaJerle/stm32f429/tree/master/21-STM32F429_FATFS
Özel mesaj okumuyorum, lütfen göndermeyin.

Karamel

hocam anladigim kadari ile sd card biraz complex birsey ve bununla uygulama yapabilmek icin herkes bir yerlerden kutuphane bulup kullaniyor.(sanirim sadece z hocamiz kendi kutuphanesini yazmis?) peki hocam ben yazin stm32f103 kullansam SDIO icin ne yapacagim? birileri spi a gore yazmis olsa. onu duzenleyemem? degistiremem? SDIO icin yazilmis kutuphaneler varmidir ki?

birde hocam SPI connection ile ne yapiyorsak SDIO ilede yapabiliyoruz degilmi? mesela sd card icersinde txt olusturup. bir wav i okuyabiliriz ogle degilmi? eger bu sorularimin yaniti evet ise. yazin SDIO yu ogrenmek istiyorum......... ::)

Tagli

Hiç uğraşmadığım için kesin konuşamayacağım ama anladığım kadarıyla zor olan SD karttaki ham veriye ulaşmak değil, biçimlendirilmiş karttaki (mesela FAT32 gibi) dosyalara ulaşmak. Kütüphane, daha çok dosya sistemi ilke ilgili kısımda yardımcı oluyor tahminimce. İşlemci veya derleyici değiştirildiğinde, sadece ham veriye ulaşmak için gereken kod değiştirilse yeterli olur. Yani yazılım iki katmanlı: SD kart ham veri katmanı ve FAT32 dosya biçimi katmanı.
Gökçe Tağlıoğlu