Перейти к содержанию
    

Странное поведение дисплея

Ниче не понимаю....

Прогнал всю SDRAM. Вот так

 

for (uwIndex = 0; uwIndex < 4194304; uwIndex++){
        	*(__IO uint32_t*)(SDRAM_BANK_ADDR + 4*uwIndex) = 0xAAAAAAAA;
					
		}		
		
		for (uwIndex = 4194304; uwIndex>0; uwIndex--){
			if (*(__IO uint32_t*)(SDRAM_BANK_ADDR + 4*(uwIndex-1)) !=0xAAAAAAAA) err=1;
		}

Никаких ошибок.  А LTDC не может все это дело нормально прочитать.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 minutes ago, MementoMori said:

Никаких ошибок

Тест 80 уровня! Для быстрой оценки работоспособности воспользуйтесь srand() и rand().

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

38 minutes ago, aaarrr said:

Тест 80 уровня! Для быстрой оценки работоспособности воспользуйтесь srand() и rand().

Вот вам джедайский тест

	test_iteration=0;
		srand();
		for (j=0;j<10;j++)
		{
			test_iteration++;	
			for (uwIndex = 0; uwIndex < 4194304; uwIndex++)
            {
				TEST_BYTE=rand();
	        	*(__IO uint32_t*)(SDRAM_BANK_ADDR + 4*uwIndex) = TEST_BYTE;
				if (*(__IO uint32_t*)(SDRAM_BANK_ADDR + 4*(uwIndex)) !=TEST_BYTE) err=1;    
  			}		
		}	

 

Пройден 20 раз - без ошибок

Господа, гляньте одним глазком, вдруг чего в глаза бросится...

Я вот к примеру заметил, что дисплей вообще перестает работать, если я делитель RCC_OscInitStruct.PLL.PLLM с 4 меняю на 8. У меня кварц 8 МГц, то есть дальше я пляшу от 1 МГц.  Сменив делитель на 8 и умножив все остальное на 2 для компенсации, я получаю те же частоты и на дисплее и на шинах, однако дисплей вообще гаснет.  

 

Может кто заметит какую-нибудь аналогичную тонкость, которую я не учел.

Да, и проект для КалоКуба я тоже выкладываю, для наглядности. Ссылка в самом низу.

 

ПРОШУ ПРОЩЕНИЯ У МОДЕРАТОРА, РАНЬШЕ Я ПОЛЬЗОВАЛСЯ ТЭГОМ codebox, чтобы свернуть код, теперь тэг не работает.

 

	/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2020 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 */
#define SDRAM_TIMEOUT     ((uint16_t)0xFFFF)
	#define SDRAM_MODEREG_BURST_LENGTH_1             ((uint16_t)0x0000)
#define SDRAM_MODEREG_BURST_LENGTH_2             ((uint16_t)0x0001)
#define SDRAM_MODEREG_BURST_LENGTH_4             ((uint16_t)0x0002)
#define SDRAM_MODEREG_BURST_LENGTH_8             ((uint16_t)0x0004)
#define SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL      ((uint16_t)0x0000)
#define SDRAM_MODEREG_BURST_TYPE_INTERLEAVED     ((uint16_t)0x0008)
#define SDRAM_MODEREG_CAS_LATENCY_2              ((uint16_t)0x0020)
#define SDRAM_MODEREG_CAS_LATENCY_3              ((uint16_t)0x0030)
#define SDRAM_MODEREG_OPERATING_MODE_STANDARD    ((uint16_t)0x0000)
#define SDRAM_MODEREG_WRITEBURST_MODE_PROGRAMMED ((uint16_t)0x0000)
#define SDRAM_MODEREG_WRITEBURST_MODE_SINGLE     ((uint16_t)0x0200)
	#define SDRAM_BANK_ADDR                 ((uint32_t)0xD0000000)
	#define BUFFER_SIZE         ((uint32_t)0x5)
#define WRITE_READ_ADDR     ((uint32_t)0x0800)
	#define REFRESH_COUNT       ((uint32_t)1542)
/* 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 ---------------------------------------------------------*/
	DMA2D_HandleTypeDef hdma2d;
	LTDC_HandleTypeDef hltdc;
	SDRAM_HandleTypeDef hsdram1;
	/* USER CODE BEGIN PV */
uint32_t aTxBuffer[BUFFER_SIZE];
uint32_t aRxBuffer[BUFFER_SIZE];
FMC_SDRAM_CommandTypeDef command;
__IO uint16_t uwWriteReadStatus = 0;
uint32_t uwIndex = 0;
uint16_t n=10;
uint32_t ADDRESS;
uint32_t TEST_BYTE;
uint32_t test_iteration;
uint32_t j;
char err =0;
	//volatile uint32_t RGB565[5000] = {0x00000000};
    uint32_t i;
/* USER CODE END PV */
	/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_LTDC_Init(void);
static void MX_FMC_Init(void);
static void MX_DMA2D_Init(void);
/* USER CODE BEGIN PFP */
static void SDRAM_Initialization_Sequence(SDRAM_HandleTypeDef *hsdram, FMC_SDRAM_CommandTypeDef *Command)
{
  __IO uint32_t tmpmrd =0;
  /* Step 1:  Configure a clock configuration enable command */
  Command->CommandMode = FMC_SDRAM_CMD_CLK_ENABLE;
  Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK2;
  Command->AutoRefreshNumber = 1;
  Command->ModeRegisterDefinition = 0;
	  /* Send the command */
  HAL_SDRAM_SendCommand(hsdram, Command, 0x1000);
	  /* Step 2: Insert 100 us minimum delay */
  /* Inserted delay is equal to 1 ms due to systick time base unit (ms) */
  HAL_Delay(1);
	  /* Step 3: Configure a PALL (precharge all) command */
  Command->CommandMode = FMC_SDRAM_CMD_PALL;
  Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK2;
  Command->AutoRefreshNumber = 1;
  Command->ModeRegisterDefinition = 0;
	  /* Send the command */
  HAL_SDRAM_SendCommand(hsdram, Command, 0x1000);
	  /* Step 4 : Configure a Auto-Refresh command */
  Command->CommandMode = FMC_SDRAM_CMD_AUTOREFRESH_MODE;
  Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK2;
  Command->AutoRefreshNumber = 8;
  Command->ModeRegisterDefinition = 0;
	  /* Send the command */
  HAL_SDRAM_SendCommand(hsdram, Command, 0x1000);
	  /* Step 5: Program the external memory mode register */
  tmpmrd = (uint32_t)SDRAM_MODEREG_BURST_LENGTH_2          |
                     SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL   |
                     SDRAM_MODEREG_CAS_LATENCY_3           |
                     SDRAM_MODEREG_OPERATING_MODE_STANDARD |
                     SDRAM_MODEREG_WRITEBURST_MODE_SINGLE;
	  Command->CommandMode = FMC_SDRAM_CMD_LOAD_MODE;
  Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK2;
  Command->AutoRefreshNumber = 1;
  Command->ModeRegisterDefinition = tmpmrd;
	  /* Send the command */
  HAL_SDRAM_SendCommand(hsdram, Command, 0x1000);
	  /* Step 6: Set the refresh rate counter */
  /* (15.62 us x Freq) - 20 */
  /* Set the device refresh counter */
  HAL_SDRAM_ProgramRefreshRate(hsdram, REFRESH_COUNT);
}
	
static void Fill_Buffer(uint32_t *pBuffer, uint32_t uwBufferLenght, uint32_t uwOffset)
{
    uint16_t tmpIndex = 0;
	  /* Put in global buffer different values */
  for (tmpIndex = 0; tmpIndex < uwBufferLenght; tmpIndex++ )
  {
    pBuffer[tmpIndex] = tmpIndex + uwOffset;
  }
}
	/* 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_LTDC_Init();
  MX_FMC_Init();
  MX_DMA2D_Init();
  /* USER CODE BEGIN 2 */
	 SDRAM_Initialization_Sequence(&hsdram1, &command);
	/*    
   HAL_LTDC_SetAddress(&hltdc,(uint32_t) &RGB565,0);
    for(i=2000;i<4500;i++)
    {
   *(__IO uint16_t*) (hltdc.LayerCfg[0].FBStartAdress + (i*2)) = 0x00ff;
    } 
while(1);
*/
HAL_GPIO_WritePin(TFT_PWM_GPIO_Port, TFT_PWM_Pin, GPIO_PIN_SET);
    Fill_Buffer(aTxBuffer,BUFFER_SIZE,n);
        n=n<<1;
        test_iteration=0;
        srand();
        for (j=0;j<10;j++)
        {
            test_iteration++;    
            for (uwIndex = 0; uwIndex < 4194304; uwIndex++){
            
            TEST_BYTE=rand();
            *(__IO uint32_t*)(SDRAM_BANK_ADDR + 4*uwIndex) = TEST_BYTE;
            if (*(__IO uint32_t*)(SDRAM_BANK_ADDR + 4*(uwIndex)) !=TEST_BYTE) err=1;    
                    
        }        
    }        
        
        
        while(1);
    
	
  /* 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};
  RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
	  /** Configure the main internal regulator output voltage 
  */
  __HAL_RCC_PWR_CLK_ENABLE();
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
  /** Initializes the CPU, AHB and APB busses clocks 
  */
  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 = 4;
  RCC_OscInitStruct.PLL.PLLN = 216;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = 2;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }
  /** Activate the Over-Drive mode 
  */
  if (HAL_PWREx_EnableOverDrive() != HAL_OK)
  {
    Error_Handler();
  }
  /** Initializes the CPU, AHB and APB busses clocks 
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|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;
	  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_7) != HAL_OK)
  {
    Error_Handler();
  }
  PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LTDC;
  PeriphClkInitStruct.PLLSAI.PLLSAIN = 100;
  PeriphClkInitStruct.PLLSAI.PLLSAIR = 2;
  PeriphClkInitStruct.PLLSAI.PLLSAIQ = 2;
  PeriphClkInitStruct.PLLSAI.PLLSAIP = RCC_PLLSAIP_DIV2;
  PeriphClkInitStruct.PLLSAIDivQ = 1;
  PeriphClkInitStruct.PLLSAIDivR = RCC_PLLSAIDIVR_2;
  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
  {
    Error_Handler();
  }
}
	/**
  * @brief DMA2D Initialization Function
  * @param None
  * @retval None
  */
static void MX_DMA2D_Init(void)
{
	  /* USER CODE BEGIN DMA2D_Init 0 */
	  /* USER CODE END DMA2D_Init 0 */
	  /* USER CODE BEGIN DMA2D_Init 1 */
	  /* USER CODE END DMA2D_Init 1 */
  hdma2d.Instance = DMA2D;
  hdma2d.Init.Mode = DMA2D_M2M;
  hdma2d.Init.ColorMode = DMA2D_OUTPUT_RGB888;
  hdma2d.Init.OutputOffset = 0;
  hdma2d.LayerCfg[1].InputOffset = 0;
  hdma2d.LayerCfg[1].InputColorMode = DMA2D_INPUT_RGB888;
  hdma2d.LayerCfg[1].AlphaMode = DMA2D_NO_MODIF_ALPHA;
  hdma2d.LayerCfg[1].InputAlpha = 0;
  if (HAL_DMA2D_Init(&hdma2d) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_DMA2D_ConfigLayer(&hdma2d, 1) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN DMA2D_Init 2 */
	  /* USER CODE END DMA2D_Init 2 */
	}
	/**
  * @brief LTDC Initialization Function
  * @param None
  * @retval None
  */
static void MX_LTDC_Init(void)
{
	  /* USER CODE BEGIN LTDC_Init 0 */
	  /* USER CODE END LTDC_Init 0 */
	  LTDC_LayerCfgTypeDef pLayerCfg = {0};
	  /* USER CODE BEGIN LTDC_Init 1 */
	  /* USER CODE END LTDC_Init 1 */
  hltdc.Instance = LTDC;
  hltdc.Init.HSPolarity = LTDC_HSPOLARITY_AL;
  hltdc.Init.VSPolarity = LTDC_VSPOLARITY_AL;
  hltdc.Init.DEPolarity = LTDC_DEPOLARITY_AL;
  hltdc.Init.PCPolarity = LTDC_PCPOLARITY_IPC;
  hltdc.Init.HorizontalSync = 139;
  hltdc.Init.VerticalSync = 19;
  hltdc.Init.AccumulatedHBP = 146;
  hltdc.Init.AccumulatedVBP = 21;
  hltdc.Init.AccumulatedActiveW = 1170;
  hltdc.Init.AccumulatedActiveH = 621;
  hltdc.Init.TotalWidth = 1330;
  hltdc.Init.TotalHeigh = 633;
  hltdc.Init.Backcolor.Blue = 0;
  hltdc.Init.Backcolor.Green = 255;
  hltdc.Init.Backcolor.Red = 0;
  if (HAL_LTDC_Init(&hltdc) != HAL_OK)
  {
    Error_Handler();
  }
  pLayerCfg.WindowX0 = 100;
  pLayerCfg.WindowX1 = 924;
  pLayerCfg.WindowY0 = 100;
  pLayerCfg.WindowY1 = 500;
  pLayerCfg.PixelFormat = LTDC_PIXEL_FORMAT_RGB565;
  pLayerCfg.Alpha = 255;
  pLayerCfg.Alpha0 = 0;
  pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_PAxCA;
  pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_PAxCA;
  pLayerCfg.FBStartAdress = 0xD0000000;
  pLayerCfg.ImageWidth = 924;
  pLayerCfg.ImageHeight = 500;
  pLayerCfg.Backcolor.Blue = 0;
  pLayerCfg.Backcolor.Green = 255;
  pLayerCfg.Backcolor.Red = 0;
  if (HAL_LTDC_ConfigLayer(&hltdc, &pLayerCfg, 0) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN LTDC_Init 2 */
	  /* USER CODE END LTDC_Init 2 */
	}
	/* FMC initialization function */
static void MX_FMC_Init(void)
{
	  /* USER CODE BEGIN FMC_Init 0 */
	  /* USER CODE END FMC_Init 0 */
	  FMC_SDRAM_TimingTypeDef SdramTiming = {0};
	  /* USER CODE BEGIN FMC_Init 1 */
	  /* USER CODE END FMC_Init 1 */
	  /** Perform the SDRAM1 memory initialization sequence
  */
  hsdram1.Instance = FMC_SDRAM_DEVICE;
  /* hsdram1.Init */
  hsdram1.Init.SDBank = FMC_SDRAM_BANK2;
  hsdram1.Init.ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_8;
  hsdram1.Init.RowBitsNumber = FMC_SDRAM_ROW_BITS_NUM_12;
  hsdram1.Init.MemoryDataWidth = FMC_SDRAM_MEM_BUS_WIDTH_32;
  hsdram1.Init.InternalBankNumber = FMC_SDRAM_INTERN_BANKS_NUM_4;
  hsdram1.Init.CASLatency = FMC_SDRAM_CAS_LATENCY_3;
  hsdram1.Init.WriteProtection = FMC_SDRAM_WRITE_PROTECTION_DISABLE;
  hsdram1.Init.SDClockPeriod = FMC_SDRAM_CLOCK_PERIOD_2;
  hsdram1.Init.ReadBurst = FMC_SDRAM_RBURST_ENABLE;
  hsdram1.Init.ReadPipeDelay = FMC_SDRAM_RPIPE_DELAY_0;
  /* SdramTiming */
  SdramTiming.LoadToActiveDelay = 2;
  SdramTiming.ExitSelfRefreshDelay = 7;
  SdramTiming.SelfRefreshTime = 4;
  SdramTiming.RowCycleDelay = 7;
  SdramTiming.WriteRecoveryTime = 3;
  SdramTiming.RPDelay = 2;
  SdramTiming.RCDDelay = 2;
	  if (HAL_SDRAM_Init(&hsdram1, &SdramTiming) != HAL_OK)
  {
    Error_Handler( );
  }
	  /* USER CODE BEGIN FMC_Init 2 */
	  /* USER CODE END FMC_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_GPIOE_CLK_ENABLE();
  __HAL_RCC_GPIOI_CLK_ENABLE();
  __HAL_RCC_GPIOF_CLK_ENABLE();
  __HAL_RCC_GPIOH_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOJ_CLK_ENABLE();
  __HAL_RCC_GPIOG_CLK_ENABLE();
  __HAL_RCC_GPIOD_CLK_ENABLE();
  __HAL_RCC_GPIOK_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();
	  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GL_RST_GPIO_Port, GL_RST_Pin, GPIO_PIN_SET);
	  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(LTDC_DITHB_GPIO_Port, LTDC_DITHB_Pin, GPIO_PIN_RESET);
	  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOG, LTDC_UD_Pin|LTDC_LR_Pin, GPIO_PIN_RESET);
	  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(LTDC_MODE_GPIO_Port, LTDC_MODE_Pin, GPIO_PIN_SET);
	  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(TFT_PWM_GPIO_Port, TFT_PWM_Pin, GPIO_PIN_RESET);
	  /*Configure GPIO pin : GL_RST_Pin */
  GPIO_InitStruct.Pin = GL_RST_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GL_RST_GPIO_Port, &GPIO_InitStruct);
	  /*Configure GPIO pin : LTDC_DITHB_Pin */
  GPIO_InitStruct.Pin = LTDC_DITHB_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(LTDC_DITHB_GPIO_Port, &GPIO_InitStruct);
	  /*Configure GPIO pins : LTDC_UD_Pin LTDC_LR_Pin LTDC_MODE_Pin */
  GPIO_InitStruct.Pin = LTDC_UD_Pin|LTDC_LR_Pin|LTDC_MODE_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
	  /*Configure GPIO pin : TFT_PWM_Pin */
  GPIO_InitStruct.Pin = TFT_PWM_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(TFT_PWM_GPIO_Port, &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 */
	  /* 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,
     tex: 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****/
 
	

 

проект для КалоКуба

 

RUTFT.ioc

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

34 minutes ago, MementoMori said:

Вот вам джедайский тест

Уровень не изменился совсем. Должно быть:

srand(N) - последовательное заполнение всей памяти значениями rand() - srand(N) - сравнение содержимого с rand()

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот видео.

QJBEt6fY.png

https://cloud.mail.ru/public/kNQS/4SvaLUzJ6

 

Зеленое - это фон LTDC - как видите, контуры его ровные, неподвижные - то есть с сигналом от LTDC к дисплею и с самим дисплеем все нормально, никаких наводок - пиксель к пикселю.

Большое прямоугольное окно - первый слой, он черпает данные из SRAM - внизу синяя линия (то что я записал), вверху какой-то мусор.  Это проекция всей SRAM в дисплей.

Маленькое квадратное окошко - второй слой, он спроецирован в SDRAM. Белая полоса внизу - то что я записал. Остальное - мусор. Это проекция фрагмента SDRAM во второй слой.

Если вы обратите внимание - мерцание не хаотичное, а сформированная шумная картинка дрожит целиком.

6 minutes ago, aaarrr said:

Уровень не изменился совсем. Должно быть:

Не надо быть таким перфекционистом. Я понимаю, если бы я ловил мерцающий раз в час пиксель. Даже когда я заполнял одинаковыми байтами, картинка на экране оставляла желать лучшего, зато тест теми же байтами не дал ни одной ошибки. Слишком большие отличия в результате тестов, чтобы говорить о дефекте SDRAM. Картинка шума не меняется, текстура ее постоянна, дрожат линии, из которых она состоит. Может память так глючить, чтобы выдавать правильные данные, но с меняющейся задержкой? Ну как если бы вы на ходу CAS меняли с 3 до 40-50? Нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Память тут, судя по всему, ни при чем, но нормально проверить её все равно не грех - полоски на мусоре смущают.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Quote

srand(N) - последовательное заполнение всей памяти значениями rand() - srand(N) - сравнение содержимого с rand()

Простите, не совсем понял о чем речь. Просто изменить srand() на srand(0xFFFFFFFF)?  "rand() - srand(N) " - это операция вычитания или указание диапазона?

К слову - вариант, который я назвал джедайским, все же дает весьма разноцветную картинку.

 

8 minutes ago, aaarrr said:

Память тут, судя по всему, ни при чем, но нормально проверить её все равно не грех - полоски на мусоре смущают.

Полоски неподвижны. Это видеоэффект. Я полагаю это те редкие моменты, когда чтение идет без сбоев. У меня на плате дискавери SDRAM отображается в виде шумной, но статичной картинки. Впрочем, поясните мне то, что я спросил про srand - проверю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Уменьшил тайминги дисплея, перекроил его под формат 400х200 пикселей. То есть  дал контроллеру LTDC время отдохнуть. Подождать, пока придут данные и не сталкиваться  с ситуацией когда буфер FIFO пуст - все равно шум. Да и, как я уже сказал - не ловятся больше прерывания ошибки шины и пустого буфера.

Вот жеж черт, ведь где-то в одном каком-то месте кроется ошибка.... неделю бьюсь..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

23 minutes ago, MementoMori said:

Простите, не совсем понял о чем речь. Просто изменить srand() на srand(0xFFFFFFFF)?  "rand() - srand(N) " - это операция вычитания или указание диапазона?

Хорошо, попробую пояснить. Ваши тесты никуда не годятся по одной простой причине - они будут успешно пройдены даже в том случае,

если память имеет размерность 32x1, или её вообще нет (если на пустой шине данных выставить число X, то вполне вероятно считать

тот же X при следующем обращении).

Описание srand() и rand() можно прочитать в любой книжке по 'C'. Итак:

1. srand(X) - устанавливаем seed X

2. Заполняем в цикле память псевдослучайной последовательностью rand()

3. srand(X) - восстанавливаем исходный seed

4. Сравниваем в цикле всю память с псевдослучайной последовательностью rand()

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот так?

srand(1);		
			for (uwIndex = 0; uwIndex < 4194304; uwIndex++){
		       	*(__IO uint32_t*)(SDRAM_BANK_ADDR + 4*uwIndex) = rand();
				}		
			
		
		srand(1);
		for (uwIndex = 0; uwIndex < 4194304; uwIndex++){
			if (*(__IO uint32_t*)(SDRAM_BANK_ADDR + 4*(uwIndex)) !=rand()) err=1;    
		}	
		
		

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 циклов. Ошибок нет.

P.S. В целом то ситуация полезная. Мои знания STM32 весьма поверхностны. Ища ошибку я хоть и не досконально, но весьма детально разобрался в некоторых ключевых моментах. Если бы все было как с платой дискавери (на которой я за полчаса не то что дисплей настроил - проект TouchGFX запустил), я бы некоторых вещей не узнал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тест памяти скорее всего будет успешным.

Судя по последнему видео - мусор вполне прилично выглядит.

И стабильный, хоть и дёргается по строке. Проблема со стартовым адресом чтения из памяти.

Пересылка наверное пачками происходит.. Вот стартовый адрес блока (откуда читаем) не всегда одинаковый.

Похоже где-то какой-то синхронизации процессов не происходит...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 minutes ago, zombi said:

Вот стартовый адрес блока (откуда читаем) не всегда одинаковый.

Хорошее уточнение. Вы правы - дергается то вся картинка. Если бы были пропуски, то дергались бы фрагменты в случайных местах и случайной длины. 

А это может быть следствием того, что кто-то еще занимает шину?

3 minutes ago, zombi said:

Пересылка наверное пачками происходит.

Это плохо?

 

Вот здесь товарищ эррату цитировал

Quote

2.3.3 Spurious clock stoppage with continuous clock feature enabled
Description
With the continuous clock feature enabled, the FMC_CLK clock may spuriously stop when:
 the FMC_CLK clock is divided by 2, and
 an FMC bank set as 32-bit is accessed with a byte access.
division ratio set to 2, the FMC_CLK clock may spuriously stop upon an
Note:With static memories, a spuriously stopped clock can be restarted by issuing a synchronous transaction or any asynchronous transaction different from a byte access on 32-bit data bus width.
Workaround
With the continuous clock feature enabled, do not set the FMC_CLK clock division ratio to 2 when accessing 32-bit asynchronous memories with byte access.
2.3.4 Data read might be corrupted when the write FIFO is disabled
Description
When the write FIFO is disabled, the FIFO empty event is generated for every write access. During a write access, if a new read access occurs, the FMC grants the read access and waits till the FIFO gets empty. If another read access occurs in a very short window (one cycle the FIFO empty event), the returned data are corrupted. This issue occurs only when the write FIFO is disabled (the WFDIS bit in the FMC_BCR1 register is set).
Workaround
Enable the write FIFO.

 

 

Но я так понял, это только для статической памяти и FMC. А у меня проблема даже с встроенной SRAM....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

15 minutes ago, MementoMori said:

Это плохо?

Нет конечно.

 

Я с этим (с такими чипами) не сталкивался.

У меня собственные контроллеры.

 

А можно как-то остановить процессор? что бы к памяти никто кроме контроллера LCD не обращался.

Записал всё что надо (бело синие полоски) и остановился. Будет дёргаться изображение?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...